我们如何使用低延迟内存解压缩来扩展我们的微虚拟机基础架构

主要观点:

  • 借助 CodeSandbox 可将仓库转为 24/7 可用的共享开发环境,文中提供了 Next.js 示例及导入 GitHub 仓库的方式。
  • 过去几年作者写了两篇关于快速克隆和恢复微虚拟机的博客,今日新增第三篇,讨论高效存储 VM 内存快照及懒加载以在 1 秒内恢复 VM。
  • 为节省成本和提供快速体验,CodeSandbox 用微虚拟机,开发了实时克隆和恢复技术,如点击“Fork”时克隆 VM,5 分钟不活动则快照内存,回来后 1 秒内恢复。
  • 内存快照可节省成本,利于开发环境,但随着使用量增长,存储和写入快照的瓶颈出现,需压缩内存快照同时保持快速恢复时间。
  • 采用类似 btrfs 的分块压缩方式处理内存快照,先将 8GiB 内存快照压缩至 745MiB,测试不同块大小后确定 8KiB 为最佳,可提高随机访问读取速度但降低压缩比。
  • 为实现在 VM 访问内存时动态解压内存快照,利用userfaultfd机制,先拦截 VM 首次访问未加载内存页的请求进行初始化和复制解压后内存,再通知 VM 继续读取。
  • 去掉稀疏化处理可减少 VM 恢复时间,引入内存元数据记录页面存储位置,还引入选择性压缩策略,根据压缩比决定存储压缩或原始数据,以平衡计算、IO 和存储。
  • 压缩页面时可跳过全为 0 的内存,利用元数据判断页面状态,此优化对“新”VM 有效,对长期运行的 VM 效果不明显,通过内存回收解决,利用内存气球跟踪 Linux 释放的内存页并标记为未初始化,节省内存快照大小。
  • 介绍了最受欢迎的 Next.js 模板 VM 的内存快照示例,展示压缩和内存回收后的效果,同时提及一些未成功的优化尝试。
  • 这些优化使 VM 基础设施可扩展且保持良好的恢复速度,目前每月可轻松处理约 250 万次 VM 恢复,未来还可探索通过网络加载内存实现“实时迁移”等。

关键信息和重要细节:

  • 提供了相关博客链接:How we clone a running VM in 2 secondsCloning microVMs by sharing memory through userfaultfd
  • 每月创建约 150,000 个新微虚拟机,现每月运行约 250,000 个独特 VM。
  • 500 个 4GiB 内存的 VM 需存储 2,000GiB 快照,250,000 个则需 1,000TB,存储是瓶颈,每分钟约有 15 个 VM 休眠并创建 4GiB 快照。
  • btrfs通过分块压缩提高随机访问读取速度但降低压缩比,CodeSandbox 采用 8KiB 块大小。
  • 动态解压内存快照的过程,包括 VM 页错误、初始化内存和通知恢复等步骤。
  • 去掉稀疏化处理可减少性能损失,引入内存元数据记录页面信息。
  • 选择性压缩根据压缩比决定存储压缩或原始数据。
  • 跳过全为 0 的内存优化对“新”VM 有效,通过内存回收利用内存气球跟踪释放内存页。
  • 展示了 Next.js 模板 VM 的内存快照示例,压缩后约 1.5GiB,节省 13.5GiB 未初始化或空内存。
  • 尝试用zstd字典压缩内存快照效果不佳,预测解压也因引入线程同步导致性能提升不明显。
  • 目前平均 400ms 恢复 VM,P99 为 2s,P01 为 150ms,每月可处理约 250 万次 VM 恢复,未来可探索网络加载内存实现“实时迁移”。
阅读 19
0 条评论