跳转至

内存去重

跨 pVisor 实例共享相同内容,同时保持每个实例独立写入和退出。去重只消除重复副本,不压缩独特内容,也不负责保存完整机器状态。

架构目标

优先共享已知相同的不可变 RAM 基线,再由 Linux KSM 发现运行后出现的重复私有页。实例负责 checkpoint 的保存、压缩和恢复,共享层不接管状态的唯一副本。公共边界见内存优化。

路线 共享内容 主要取舍
不可变基线+私有 COW 从相同基线恢复的未修改页 无需扫描,但修改后共享减少
Linux KSM 内核发现的相同私有匿名页 不需要共享服务,但异步扫描消耗 CPU
Linux physical pool 不同 VM 中相同的驻留原文页 扫描、slot/reference、kernel COW 与独立进程故障域
编码池内容去重 相同的编码冷对象 可以叠加压缩,但需要冷回收和恢复机制

编码对象去重由池化服务器压缩定义;Linux physical pool 共享驻留原文页,两者有不同的所有权合同。

不可变基线共享

多个实例映射同一个 backing 对象的对应区间,以 MAP_PRIVATE 保持写入隔离。未修改文件页可以共享;写入由宿主 COW 私有化,不直接连接两个 VM 的可写 RAM。

压缩 checkpoint 先物化为可映射的不可变基线,再复用该基线。内容相同但 inode 不同的文件不自动共享缓存页,磁盘 reflink 也不等于内存共享。基线缓存是可再生加速层,不替代持久 checkpoint。

内容验证和不可变性是复用前提;实例持有自己的 backing 引用与租约,某实例退出或缓存淘汰不能破坏其他实例的映射。共享内容应由内核对象/存储引用维持,而不是依赖另一个实例的堆。

Linux daemon physical pool

两个 VM 读取同一槽位,写入时生成私有 COW 页

显式 serve --memory-pool 启用 daemon 自有的原文页共享。候选只保留 hash;内容在不同 VM session 出现后才进入 bounded memfd slot。VM 在 CPU/device 排空后重新核对字节,使用只读 descriptor 和 MAP_PRIVATE 映射相同页。该路径不依赖 userfaultfd,不编码或压缩唯一页。

Reference pin 保护槽位到撤销映射之后,断联时等待 pidfd 确认 peer 退出再回收。Pool 是活跃共享页的 owner,丢失会使依赖 VM 失败;它不提供 durable snapshot 或进程重启恢复。预算和故障范围见共享工作集。

Linux KSM

KSM 对适合的私有匿名 RAM 接受 MADV_MERGEABLE 建议,并由内核后台扫描、合并和处理 COW。它不需要 pVisor 实例互相发现,也不需要用户态服务保管共享页。

登记成功不等于已扫描或已合并,不提供同步完成期限。实例只登记合适的区域;宿主全局扫描预算由管理员或宿主协调器管理,避免实例互相覆盖全局参数。

KSM 不合并文件 page cache;当前 MAP_SHARED live backing 不能只添加建议就实现去重。私有映射产生的匿名 COW 页可作为候选,具体资格与收益要按实际内核验证。macOS 没有标准 Linux KSM 能力;UKSM 作为算法参考,不成为部署依赖。

关键权衡

  • 主动共享与后台发现: 相同基线无需重新发现;动态重复内容交给 KSM,但接受扫描延迟与 CPU 成本。
  • 节省与写入成本: 高频写入会拆分共享,减少收益并增加 COW;不能只按初始共享率规划密度。
  • 共享与隔离: 限定信任域并评估内容存在性侧信道。KSM advice 没有 pVisor 自定义域参数,产品标签不能单独证明隔离。
  • 简单与覆盖面: 当前 physical pool 采用有界 resident 扫描;任意热页即时合并与 P2P 不属于交付范围。主动共享槽位与完整机器持久恢复分别设计。

同一区域首版不叠加 KSM 与用户态冷回收,避免先合并再复制压缩的重复工作。独特但可压缩的冷内容见内存压缩。

当前接入与验证基础

[vm].ram_dedup 是默认关闭的布尔字段;--vm-ram-dedup 启用它并选择 VM executor。runner 在 VM 启动时显式调用 handle.advise_ram_dedup(),将尽力而为的建议安装报告写入 stderr;建议失败不阻止 VM 继续运行。入口见 CLI 与配置参考。

Linux 上,普通私有匿名 RAM 与从快照恢复的私有 COW 映射可接受 MADV_MERGEABLE。live MAP_SHARED RAM 被跳过,不转换为私有或匿名映射。设备窗口、huge-page、不可写或未对齐映射被排除;活跃冷页回收或设备准备也会阻止建议。macOS 对其他条件合格的映射报告不支持。报告按映射记录接受、跳过、不支持或错误状态;accepted_bytes 仅统计建议被接受的区间字节数,不是已合并字节、内存节省,也不证明 KSM scanner 已启用。pVisor 不修改宿主全局 KSM 参数,不启动新服务。

ram_dedup 与 vm.memory_pool、vm.ram_compression、 vm.cold_ram_compression(Linux 本地 live pager)及旧的 PVISOR_EXPERIMENTAL_MEMORY_POOL 启用方式互斥。建议保持快照基线、私有写入和各实例独立持有的 backing 引用,不接管状态的唯一副本。跨工作负载内容共享风险要求显式启用;建议不可用时保留原有映射,不承诺固定节省率或扫描期限。

当前单元测试覆盖默认关闭、配置往返、CLI 选择 executor、冲突拒绝、资格检查与部分接受报告、字节与地址不变,以及恢复 COW 的写入隔离和 backing 生命周期。测试允许真实建议不可用,不要求 scanner 运行;它们不等于生产验收,也不是合并量、节省或密度的实测证据。

概念验证保留共享基线、独立写入和引用生命周期的探针;冷页池证明的是编码对象共享,不是活跃页共享。现有映射机制和实验不能直接推导出新后端已完成生产验收。

收益比较需要纳入 COW、扫描 CPU、峰值和业务延迟;RSS 不能直接相加为唯一物理占用。Linux KSM 的能力与统计以实际内核接口为准。