Repository navigation
perf(cow): optimize COW workspace and authenticated zero RAM restore - #94
Open
zhaoyuuu0624 wants to merge 4 commits into
Open
zhaoyuuu0624 wants to merge 4 commits into
zhaoyuuu0624 wants to merge 4 commits into
Conversation
…tore # Conflicts: # crates/pvisor-vm/README.md
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
问题与 rollout replay 下对比
相同快照的多个分支已经共享 RAM,但旧恢复路径还会为每个分支复制工作区、反复读取封存 RAM,并保留准备缓存。完整长度的 FUSE RAM 与底层
ram.bin还会同时缓存零页。因此,COW 降低了匿名内存重复,却没有兑现整组内存收益。最初在 gpu03 重放第一波 16 条轨迹(4 个任务 × 4 分支)、477 条命令,保留原命令、模型等待和首动作偏移。这里的 UKSM 指 pVisor 用户态 adaptive 共享池,不是 Linux 内核 UKSM。
memory.peak/ GiB,含准备原始三组均为 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 优化
/app。每个分支仍有独立 upper 和记录;不符合资格的走原复制路径,非空/不符合约束的状态不被偷偷规范化。O_DIRECT描述符读取原 Raw inode并逐块校验,避免底层预读重新带入相邻零区。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 设置保持上述配置。
三次缓存普查独立合计 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。ram.bin在所有保存的采样中驻留为 0;认证全零区没有 FUSE 文件字节,按逻辑偏移重算的 Raw/FUSE 驻留交集为 0。每组四分支共用一个 FUSE device/inode。仍未实现总内存低于 baseline:6.738 GiB 高于历史 5.180 GiB。 优化有效,但不能宣称 COW 已经优于 baseline 或 UKSM。剩余文件系统、元数据和运行缓存仍计入整组成本。
正确性、代价与比较限制
protect_target=true、原快照树及全部 8 个 root/workspace 池的内容、命名空间、metadata、xattrs/ACL、硬链接审计通过;冻结输入哈希不变。O_DIRECT的 miss 可能增加实际回读。两轮io.stat均缺失,不能把它当 0 或用 major fault 数冒充磁盘字节数。最终 477 命令 duration 合计 292.459 s,紧邻前轮 295.829 s,P95 为 2.038 vs 2.084 s;这不足以证明没有尾延迟代价。O_DIRECT。版本与验证
性能实验是在原工作树基础
f51f019加本系列改动完成,最终受测 executable SHA-256 为20872f86d50512edb4e3eeff79f8b7e35dc4c484922f66fffaa7482760dac251。本 PR 随后将该系列改动单独移植到最新main(3d6fbc9),保留 main 的新 replay / Windows 等功能;移植后的编译与回归单列,没有把旧性能数据说成此 PR head 的新测量。cargo fmt --check与 VM rustdoc(-D warnings)通过。服务器没有 mise,使用仓库版本 nextest;Windows 原生运行留给仓库 CI。原始聚合数据对应
first-wave-results.json/metrics-summary.json;最终聚合对应audit-analysis.json/comparison.json/audit-zero.json和基线/池审计。原始轨迹、RAM 正文、rootfs、运行中绝对路径和完整日志不随此 PR 上传。