Skip to content

perf(cow): optimize COW workspace and authenticated zero RAM restore - #94

Open
zhaoyuuu0624 wants to merge 4 commits into
DeepLink-org:mainfrom
zhaoyuuu0624:codex/cow-rollout-restore
Open

zhaoyuuu0624 wants to merge 4 commits into
DeepLink-org:mainfrom
zhaoyuuu0624:codex/cow-rollout-restore

Conversation

@zhaoyuuu0624

@zhaoyuuu0624 zhaoyuuu0624 commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

问题与 rollout replay 下对比

相同快照的多个分支已经共享 RAM,但旧恢复路径还会为每个分支复制工作区、反复读取封存 RAM,并保留准备缓存。完整长度的 FUSE RAM 与底层 ram.bin 还会同时缓存零页。因此,COW 降低了匿名内存重复,却没有兑现整组内存收益。

最初在 gpu03 重放第一波 16 条轨迹(4 个任务 × 4 分支)、477 条命令,保留原命令、模型等待和首动作偏移。这里的 UKSM 指 pVisor 用户态 adaptive 共享池,不是 Linux 内核 UKSM。

原始实验指标 baseline UKSM / adaptive 原始 COW
重放时间加权平均总内存 / GiB 5.180 2.926 48.776
重放平均 file / GiB 0.128 0.525 44.961
重放平均 anon / GiB 4.989 2.145 2.946
全流程 memory.peak / GiB,含准备 6.465 3.716 60.870
准备耗时 / s 26.5 27.8 2040.7
重放耗时 / s 1725.1 1724.8 1726.6
重放 CPU / CPU-s 1607.9 6815.5 1626.6
重放平均 CPU 核数 0.932 3.951 0.942

原始三组均为 96 GiB 上限、12 CPU 配额、CPU 亲和 2–13、swap=0、offload 关闭。统计使用 whole-cgroup,包含 VM、共享池、文件缓存和观测程序;平均内存按实际采样间隔积分,CPU 来自 cpu.stat 差值,GiB=2^30 bytes。可回收缓存仍计入总量,不能用“file 可回收”否认实际占用。

原始结果说明:UKSM 内存较低,但重放 CPU 约为 baseline 的 4.24 倍;原始 COW 的 CPU 接近 baseline,却被工作区复制和准备/运行文件缓存拖累。轨迹重放执行的是记录的命令与等待,不重新调用模型生成分支。

本 PR 的 COW 优化

  1. 干净种子工作区共享基线 + 独立分支增量。 对符合资格的已认证、受保护、单 lower、干净 workspace 种子,规范化冗余 target/baseline 别名,让恢复分支复用不可变 workspace lower,而不是每次复制整个 /app。每个分支仍有独立 upper 和记录;不符合资格的走原复制路径,非空/不符合约束的状态不被偷偷规范化。
  2. 封存 RAM 的整文件 SHA 与 64 KiB 块索引合并为一遍读取。 保留源端完整复核、独立 inode 和持久化/发布边界,不改变完整捕获格式或跳过内容校验。
  3. 一次性处理准备缓存。 新封存文件在同步校验后、发布前提出冷缓存释放建议;原只读快照层、恢复就绪的底层 Raw、新发布共享文件系统池由拥有引用的准备窗口合并请求,在没有活动准备并静默至少 30 秒后执行一次 best-effort advice。已有池不反复触发,不触碰 upper,不做逐块持续驱逐。跨进程读者可能重新读取,advice 成功不等于实际回收。
  4. 认证全零范围直接匿名恢复。 Host 根据已认证的 64 KiB SHA 索引派生零范围;运行时 FUSE 只暴露紧凑的非零块视图,不生成另一份 RAM 文件。零区不再有 FUSE 文件偏移,无法被该视图预读进缓存。非零块通过独立 O_DIRECT 描述符读取原 Raw inode并逐块校验,避免底层预读重新带入相邻零区。
  5. 保留 COW 与生命周期边界。 VM 预留原有 guest RAM 区域,零区为私有匿名映射,非零段在未发布的预留区内映射为 MAP_PRIVATE;GuestMemory/KVM slot 拓扑不增加。typed extent 验证覆盖、顺序、对齐、溢出与紧凑文件长度。显式记录混合恢复的所有权,避免匿名 region 元数据导致 offload/cold pager 误接管。

apply、审计和隔离合同保持:native 恢复不能 apply 到共享基线,普通 Job 的 apply 合同不变;保护 target、分支 upper、原树/池引用及退出清理继续有效。新增 VM API 合同及消费者同步更新,Windows 保持明确 Unsupported 的快照能力,不为其隐式启用此路径。

匿名零优化当前限于 Linux 本地、带认证索引的 Raw、完整 64 KiB 块、有零块且不超过 8192 个合并范围。node-owned、压缩、其他平台、短尾或超限视图保留原路径;已经选中该路径后,O_DIRECT 不支持会明确失败,不静默退回可能读入零区的路径。非零块中的局部 4 KiB 零页不属于本次完整 64 KiB 零范围优化。

优化后的同一波轨迹

最终验证仍为上述 16 条轨迹和 477 条原始命令/等待。用同一个固定二进制新建 4 份 Raw 种子,再恢复 16 个分支;分开测量创建、恢复与重放。本轮 memory.high/max 均为 max,CPU、亲和、swap、offload 设置保持上述配置。

优化后阶段 耗时 / s CPU / CPU-s 平均核数 时间加权平均总内存 / GiB 阶段采样峰值 / GiB
创建 4 个种子 797.255 218.100 0.274 12.898 29.409
恢复 16 分支 717.100 506.540 0.706 6.364 7.541
重放 1725.368 1788.611 1.037 6.738 7.688

三次缓存普查独立合计 16.226 s / 22.387 CPU-s;端到端合计 3255.957 s / 2535.647 CPU-s。累计 memory.peak 为 29.471 GiB,主要发生于创建,不能称为重放峰值。创建成本没有删除或按未测的复用次数摊销。

  • 最终重放平均 file=3.233 GiB、anon=3.126 GiB、kernel≈0.377 GiB。
  • 紧邻的上一轮 COW(同为无内存上限、已有 workspace/缓存优化、尚未匿名零恢复)为平均 9.477 GiB、采样峰值 10.978 GiB、1734.945 CPU-s。本次平均总量下降 2.739 GiB / 28.9%,CPU 增加 3.1%;恢复耗时 720.995 → 717.100 s,基本不变。
  • 底层 4 份 ram.bin 在所有保存的采样中驻留为 0;认证全零区没有 FUSE 文件字节,按逻辑偏移重算的 Raw/FUSE 驻留交集为 0。每组四分支共用一个 FUSE device/inode。
  • 四组同时可观测的重放窗口覆盖 85.46%,FUSE 非零基线合计平均驻留 0.665 GiB。尾部 VM 退出导致的缺样没有当成 0;该数字不是完整重放均值,mincore 也不是 cgroup 归属证明。

仍未实现总内存低于 baseline:6.738 GiB 高于历史 5.180 GiB。 优化有效,但不能宣称 COW 已经优于 baseline 或 UKSM。剩余文件系统、元数据和运行缓存仍计入整组成本。

正确性、代价与比较限制

  • 原始三组与最终优化组:16 轨迹 / 477 命令完整,逐命令 returncode / timeout 和最终 patch SHA / untracked 清单一致;不是声称所有命令返回 0,也不是逐字节比较所有 stdout。
  • 4 个共享 workspace lower、16 个独立 upper、protect_target=true、原快照树及全部 8 个 root/workspace 池的内容、命名空间、metadata、xattrs/ACL、硬链接审计通过;冻结输入哈希不变。
  • 无 OOM、swap 或内存限制事件;本轮资源样本最大间隔 2.079 s。
  • O_DIRECT 的 miss 可能增加实际回读。两轮 io.stat 均缺失,不能把它当 0 或用 major fault 数冒充磁盘字节数。最终 477 命令 duration 合计 292.459 s,紧邻前轮 295.829 s,P95 为 2.038 vs 2.084 s;这不足以证明没有尾延迟代价。
  • 新观测加入布局核对/位图翻译,累计观测壁钟 154.227 s,前轮 104.411 s;它们计入 cgroup。壁钟不是 CPU,不能简单相减得到产品净 CPU,更不能把 CPU 增量全部归因于 O_DIRECT。
  • 原始三组有 96 GiB 上限,最终 COW 无上限;驱动控制文件位置、观测方式、二进制和运行时缓存背景也有变化。中途 6/8 GiB 压力诊断未混入这些表格。单波单轮,不宣称统计显著或严格的最新四组 A/B 排名。
  • 镜像来自既有 replay 项目,未确认等同原私有训练环境;跨实现重放一致性和原训练环境真实性分别看待。

版本与验证

性能实验是在原工作树基础 f51f019 加本系列改动完成,最终受测 executable SHA-256 为 20872f86d50512edb4e3eeff79f8b7e35dc4c484922f66fffaa7482760dac251。本 PR 随后将该系列改动单独移植到最新 main(3d6fbc9),保留 main 的新 replay / Windows 等功能;移植后的编译与回归单列,没有把旧性能数据说成此 PR head 的新测量。

  • 受测版本 Linux:619 VM lib/API tests passed(8 skipped);640 Host lib tests passed(9 skipped)。
  • 最新 main 移植后:Linux VM lib/API 621 passed / 8 skipped,Host lib 703 passed / 10 skipped;另有 5 项 API/仓库边界测试通过;macOS 库、测试、示例及 CLI 快照消费者编译通过,cargo fmt --check 与 VM rustdoc(-D warnings)通过。服务器没有 mise,使用仓库版本 nextest;Windows 原生运行留给仓库 CI。
  • 受测版本与移植后均保留非零块篡改拒绝、零视图/全零/旧路径、extent 几何拒绝、跨分支 COW 写隔离的测试。

原始聚合数据对应 first-wave-results.json / metrics-summary.json;最终聚合对应 audit-analysis.json / comparison.json / audit-zero.json 和基线/池审计。原始轨迹、RAM 正文、rootfs、运行中绝对路径和完整日志不随此 PR 上传。

@zhaoyuuu0624 zhaoyuuu0624 changed the title feat(snapshot): optimize COW workspace and authenticated zero RAM restore perf(cow): optimize COW workspace and authenticated zero RAM restore Nov 1, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant