636 字
3 分钟
沙箱系列(十三):整机分叉的成本由后续写入决定
整机分叉并不是复制一台完整 VM,而是保存中间状态,再让多个实例共享只读内存与磁盘基线。分叉本身可以很轻,真正的资源账单来自各分支之后写了多少不同数据。
分叉由快照与多次恢复组成
从运行中的 VM 分叉,可以拆成:
冻结一致状态→ 保存 CPU、设备、内存与磁盘基线→ 从同一基线恢复 N 个实例→ 为每个实例建立私有写层这不是新的底层机制,而是把快照恢复与 CoW 组合为一个产品能力。快照必须处在设备和文件系统一致边界,否则所有分支都会继承同一份损坏状态。
内存与磁盘按写入分离
内存页最初共享只读映射,首次写入触发缺页并复制当前页。磁盘则通过 qcow2、块级快照或文件层为每个实例记录差异。
如果分支主要读取共同环境,物理内存与磁盘增量较小;如果每个分支都改写大量页面和文件,共享收益会迅速消失。
因此容量估算不能只看“创建 N 个分支需要多久”,还要测量:
- 分支后的脏页比例;
- 私有磁盘增量;
- 共享基线的驻留与回收;
- 长时间运行后的内存放大。
Guest 身份必须在恢复后更新
多个实例从同一快照醒来,会继承随机数状态、网络配置、机器标识、令牌和应用缓存。若不重新生成,可能出现地址冲突、重复身份或凭据复用。
恢复协议需要明确哪些状态可共享,哪些必须在实例激活前刷新。外部系统也要使用新的 Sandbox ID、租约和网络身份,而不是把分支视为原实例继续运行。
我的选择:只对高复用中间态分叉
我会在初始化成本高、后续读取多且分支差异较小的场景使用整机分叉,例如预装依赖、加载公共模型或完成固定构建阶段。
它不适合分支后立即大规模写入、包含不可复制外部连接或身份状态的任务。平台应同时公布创建延迟与分支后资源增长;只强调“毫秒级 Fork”会隐藏共享基线、脏页和身份重建的长期成本。