跳转至

内存卸载

卸载把空闲实例的驻留 RAM 转为存储支撑,代价是下一次交互时需要读回数据。 原 VMM 保持存活:CPU、设备、连接和时钟状态仍留在该进程中。

在架构中的位置

卸载的单位是单个实例,不是共享内存池,也不是可移植的 VM 镜像。 在内存优化架构中,卸载解决等待期的驻留问题; 本地压缩处理的是另一种 RAM 与 CPU 权衡。

同进程恢复继续原来的执行。只有 RAM backing 文件,不能在 VMM 退出后重启 该执行、恢复历史 VM 或迁移到另一节点。 完整环境快照有独立的捕获与恢复合同, 还包括 CPU/设备状态、兼容性以及执行 profile 覆盖的文件系统。

暂停不等于静默

普通暂停停止 vCPU,却仍允许设备访问内存;它既不能建立 不可变 RAM epoch,也不会提交压缩存储。卸载需要更强的边界: 停止 CPU 写入,关闭并排空设备 memory gate,再同步 backing 脏页。

卸载操作完成前,CPU 与设备保持静默。runner 的确认 不是完成点:host 侧的压缩发布工作可能尚未结束。 恢复时先重建必要的 hypervisor 映射,再打开设备 gate,最后重启 vCPU。

backing 身份与存储选择

RAM 使用共享文件映射。稳定的 backing 身份,而不是某个路径名,使 同一进程能够按需读回页面,无须更换宿主 RAM 地址或复制新镜像。 当前路径发布使用指向原 inode 的硬链接;压缩 alias 链接的是 manifest,其对原 sidecar 目录的引用保持不变。

磁盘存储上的普通文件使干净页具备被回收、随后重新读取的条件。 tmpfs 文件或 memfd 仍由内存支撑:更换 backing 类型并不等于磁盘卸载。 这些对象可用于共享或映射,但回收取决于宿主策略 及可能使用的 swap;文件描述符本身不代表持久存储或 RAM 节约。

当前整实例回收拒绝私有 COW RAM。丢弃已修改的私有页会 丢失 guest 写入,而不是把它们写进共享基底;需要新的完整捕获。 不能把这条卸载路径无差别地应用到快照恢复的私有映射。

原始与压缩路径

原始 backing 让内核直接把 RAM 字节写入文件,并处理后续缺页。 压缩路径通过 FUSE 暴露逻辑 RAM 文件:写回先暂存原始页, 卸载再将变化块提交到 base/delta bundle;读取时解码已提交块。 卸载文件格式解释其存储与发布模型。

压缩可能减少存储字节,但增加编码、校验、staging I/O 和 FUSE 工作。 恢复后的冷读取还需要块解码。不可压缩数据、频繁重写和合并 可能抵消收益或延长暂停;应比较 CPU、I/O、存储峰值与恢复延迟。

当前路径与未来目标

现有路径是:创建 backing → 在共享映射上运行 → CPU 与设备静默 → 同步并请求回收 → 完成可选的压缩提交 → 恢复同一实例。 回收是向宿主提出请求,不保证所有 RAM 消失;VMM/设备状态仍然存在, 压缩本身还会在 runner 的驻留采样之后读取数据、分配内存。

当前支持的是实现附录描述的 同进程原始/FUSE backing 路径,其平台要求与已知限制仍然适用。 未来目标是以有界的卸载与冷恢复成本获得可预测的空闲实例密度; 这不代表新增私有 COW 淘汰、持久 VM 恢复或迁移支持。