612 字
3 分钟
沙箱系列(二):缺页如何支撑快照与 CoW
microVM 快照和进程 Fork 看似属于不同层级,底层却都利用同一个事实:页表可以故意不给出可写权限或有效映射,让下一次访问触发缺页,再按需完成复制或加载。
缺页把访问变成控制点
CPU 访问虚拟地址时检查页表。页面不存在或当前访问权限不足,就触发缺页异常并交给内核或虚拟化层处理。
正常缺页不是系统错误。处理方可以建立映射、加载内容、复制页面或拒绝访问。关键价值在于:昂贵工作不必提前完成,可以推迟到页面真正被访问时。
CoW 延迟复制成本
fork() 后父子进程最初共享相同物理页,并暂时标记为只读。读取不需要复制;任一进程写入时触发缺页,内核才复制该页并恢复写权限。
共享只读页→ 首次写入→ 缺页→ 复制当前页→ 写入私有副本因此创建成本接近页表复制,而实际内存增长取决于后续写入工作集。OverlayFS 与 qcow2 的写时复制也采用相似思想,只是对象从内存页变成文件层或磁盘块。
快照恢复延迟加载成本
恢复 microVM 时,如果先读取全部内存镜像,启动延迟与快照大小直接相关。懒加载可以先恢复 CPU 与设备状态,页面在首次访问时再从快照文件载入。
File Backend、Userfaultfd 和 EPT Violation 处理位置不同,但目标相同:让恢复成本接近实际工作集,而不是完整内存容量。
脏页追踪解决的是另一方向:创建增量快照时,只保存运行期间被写过的页。它与懒加载、CoW 经常组合,却不能混为同一机制。
我的判断:先确认节省的是哪一段
我会把优化拆成三项验证:
| 机制 | 主要节省 |
|---|---|
| 脏页追踪 | 快照写入量 |
| CoW | 实例间重复内存 |
| 懒加载 | 恢复首屏延迟 |
快照不能省掉节点调度、资源预留和网络准备;CoW 在大量写入后也会失去共享收益。只有测量真实工作集、缺页延迟和恢复后的写入比例,才能判断这些机制是否适合目标负载。