AgentZip 用模板差分与兄弟词典,沙箱内存最高压掉 8.7 倍

Memory Compression for High-Fanout Agent Sandboxes

Mengming Li, Ceyu XU, Qijun Zhang, Jiangnan Yu, Xiangfeng Sun, Haohui Mai, Zhiyao Xie

cs.AI, cs.OS

2026-09-10

港科大 AgentZip 给高扇出沙箱做内存压缩:模板差分、跨沙箱 Zstd 词典、LLM 空档压缩再预取。Rollout 上平均省 88.55% 内存,约 8.7 倍,延迟 1.40 倍;KSM+zswap 只省 51%。

这篇在解决什么

Agent 现在不只吐文本。修 issue、装依赖、跑测试,都会在沙箱里执行不可信代码。一个任务还会扇出很多沙箱:RL 训练要并行采几十条轨迹打分,推理侧的 generate-and-filter 会同时跑几条候选。算力往往闲着,因为沙箱大部分时间在等 LLM 吐下一条命令。先耗尽的是内存。

这些沙箱并不独立。它们从同一份不可变模板 copy-on-write 出来,打开同一份仓库、加载同一套库,跑的命令也高度重叠。论文测到 76%–96% 的页要么还接近模板,要么在兄弟沙箱同一虚拟地址上长得很像。Linux 现成的招数对不上这个结构。zswap 只压单页内部重复;KSM 要整页字节完全相同,而完全相同的页在克隆时已经被 CoW 共享掉了。现有系统还只敢压冷页来控制缺页:冷页通常只占 20%–30%,另外 50%–60% 是温页。zswap 还要等内存吃紧才动手,短命沙箱可能整段生命周期都没触发过回收。

方法

AgentZip 是港科大给 Agent 沙箱做的内存压缩系统,跑在 Zeroboot 上:KVM 加 Firecracker 快照,按模板 CoW 克隆。压缩后的页放进用户态池,原 4 KiB 物理页立刻回收,再用 Linux 的 userfaultfd 拦截后续访问、解压装回。

每个候选页走三种编码,选体积最小的那个。

性能控制从压缩时挑冷页,挪到恢复时预取。只要压得划算就可以压,包括还会再被碰到的温页。预取器有四路:stride、单沙箱时序、cohort 共享时序,以及按 cohort 和第几次 tool call 统计的热页集合。

时机绑在 Agent 节奏上。工具执行时只跑轻量 scout,给页打可压分、排队;真正编码和改映射放到等 LLM 的空档。新 tool call 一到就取消未完成的压缩,正在改映射的那一页会做完再停,避免半截回收。对外给了一层 E2B 兼容网关,现有 SDK 不用改 prompt 和工具。

结果

评测用 R2E-Gym 里 10 个 Python 仓库,轨迹由 DeepSeek-V4 生成后按记录的 think time 回放。训练侧 Rollout 每任务 16 条并发轨迹、不同温度;推理侧 GAF 每任务 4 条候选、不同角色提示。主指标是时间平均的沙箱私有物理内存,私有页加压缩池。

方法Rollout 省内存Rollout 延迟GAF 省内存GAF 延迟
zswap (Zstd)48.66%1.436×4.86%1.118×
KSM+zswap51.24%1.517×21.25%1.159×
AgentZip88.55%1.403×64.29%1.468×

88.55% 对应大约 8.7 倍容量,Linux 配置大约 2.1 倍。

单独看编码器,Rollout 上 RLE 省 24.74%、模板差分 81.95%、词典 88.63%。三件套合在一起是 88.55%,词典编码页少了约 60%,延迟从词典单开的 2.703× 降到 1.403×。词典几乎包圆了压缩率,贵在解码;RLE 和差分把大部分页从贵路径上挪走。

关掉预取,Rollout 能省到 94.22%,但延迟是 3.052×;GAF 是 75.96% 对 2.755×。四路预取叠上去,Rollout 阻塞恢复放大从 0.419 降到 0.147,延迟落到 1.403×。阻塞缺页恢复的 p50 / p95 / p99 是 3.47 / 110.52 / 223.27 ms,异步预取恢复只要 0.16 / 1.50 / 8.09 ms。压缩池里元数据和词典只占 4.31%(Rollout)和 5.64%(GAF)。

为什么重要

给高扇出 Agent 平台的信号很具体:沙箱不该当互不相干的普通进程来管。CoW 之后剩下的近似相似才是大头,Agent 特有的 LLM 空档又给了后台压缩一个几乎不抢前台的窗口。E2B 兼容层说明这套接口冲着现有编排去,不是实验室专用 ABI。

这不是免费午餐。GAF 上 AgentZip 比 zswap 慢,1.468× 对 1.118×,换来的是 64% 对 5% 的内存。主机根本挤不到内存墙、轨迹又短的时候,zswap 的低延迟更合适。真正吃紧的是训练 Rollout 这种 16 路兄弟沙箱,那里 AgentZip 的内存和延迟都优于 KSM+zswap。

局限与存疑

论文没有单独写 Limitations。评测是轨迹回放,不是在线接模型:tool 序列和 think time 事先录好,压缩不会反馈到 LLM 调度,也不会碰到真实 serving 的排队抖动。工作负载全是 R2E-Gym 的 Python 修仓库任务,浏览器、GPU 工具、长驻 IDE 沙箱会不会还那么像,没有数据。

系统绑在不可变模板加 CoW 克隆上,实现落在 Zeroboot 和 Firecracker 快照。普通 Docker 容器、没有稳定虚拟页索引的环境,模板差分直接失效。userfaultfd 把缺页拉到用户态,阻塞恢复尾巴到 223 ms,预取失效时工具执行会被钉住。

词典对多样性敏感。GAF 从 2 个候选加到 4 个,词典单开的节省从 86.26% 掉到 71.39%;词典撑到 128 KiB,Rollout 和 GAF 分别掉到 80.38% 和 44.46%。兄弟轨迹越散,跨沙箱这一路越不值钱。调度还默认 tool 和 LLM 交替;沙箱长时间占着 CPU、不回头等模型,scout 和压缩会抢前台。

内存口径是沙箱私有页加压缩池,不含仍被 CoW 共享的模板页。主机密度还取决于模板有多大、能叠多少 cohort。论文也没报生产集群里和 E2B 自带内存策略的对照。

术语

原文与代码

社区讨论

相关论文

全部论文解读