两核、2 GiB 预算能同时完成多少个工具任务?¶
主要结论¶
在两核、2 GiB、禁用 swap 的共同预算下,stage 与 Podman 都在 32 路 Python/Git 任务中通过全部五轮;pVisor VM 在 16 路通过全部五轮,32 路只有三轮全部通过。stage 的空闲探针达到 128 路,Podman 达到 64 路;空闲容量不能代替活跃任务容量。
| 需求 | 选型含义 |
|---|---|
| 并行修改代码并检查 Git 结果 | stage 与 Podman 的本负载容量相同;按隔离和审查需求选择 |
| 大量空闲环境 | stage 达到更高的已测并发度;它使用宿主进程边界 |
| 每个任务需要 VM 边界 | 为 VM 留出更多预算;不要按空闲数规划活跃任务 |
Motivation¶
多个 Agent 同时执行时,成功完成多少任务比创建多少环境更有用。容量规划还要计入运行时、辅助进程、页缓存和 VM backing,不能用单个进程 RSS 或配置内存推算。
实验设计¶
Linux/x86_64 上比较原生进程、pVisor stage、pVisor VM 和 Podman 5.8.7。每批使用独立 cgroup:共同两核配额、CPU 0/1 亲和性、2 GiB 内存上限、零 swap;协调器、payload 和辅助进程包含在预算内,Podman payload/conmon 的归属经过检查。VM 每个配置 2 vCPU/256 MiB,仍受共同总预算限制。
并发扫描 1、2、4、8、16、32、64、128,每格五个新批次,无预热;每轮随机交替条件。所有任务先到 stdin readiness barrier,再共同释放。空闲组使用同一 Python 环境但不分配数据或改文件;工具组每任务触碰并校验全部 32 MiB 私有数据,在 64 文件 Git 仓库修改四个文件,执行 git status 并校验全部文件。stage/VM 的原工作区保持不变,结果与独立 Run 记录匹配。
主指标为整个 cgroup 的物理内存计费,包括已计费页缓存、内核内存和私有 backing。预先准备的共享工具/镜像缓存可能在父 cgroup 计费,因此这不是整机净内存排名。每批都记录失败、未知结果和 OOM;只有全部任务校验通过且没有 OOM 的批次进入内存/耗时摘要,保留所有慢样本。五轮不能建立长期可靠性或尾延迟保证。负载不包含模型推理、大型编译或真实 Agent CLI。
实验数据和分析¶
测量日期 2026-10-06(本地时间)。共 320 个批次,其中 263 个记录为全部通过,57 个失败;所有批次进入容量统计。内存为 readiness barrier 时 memory.current 的 P50,单位 MiB,仅由完整、无 OOM 批次计算;不足完整批次标为“—”。
Python/Git 工具任务¶
| 模式 | 并发度 | 全部通过批次 | 校验完成 / 尝试任务 | 结果未知 | OOM 批次 | barrier 内存 P50,MiB |
|---|---|---|---|---|---|---|
| 原生进程 | 16 | 5/5 | 80/80 | 0 | 0 | 640.4 |
| 原生进程 | 32 | 5/5 | 160/160 | 0 | 0 | 1268.3 |
| 原生进程 | 64 | 0/5 | 233/320 | 0 | 5 | — |
| 原生进程 | 128 | 0/5 | 244/640 | 0 | 5 | — |
| pVisor stage | 16 | 5/5 | 80/80 | 0 | 0 | 723.0 |
| pVisor stage | 32 | 5/5 | 160/160 | 0 | 0 | 1434.0 |
| pVisor stage | 64 | 0/5 | 204/320 | 0 | 5 | — |
| pVisor stage | 128 | 0/5 | 183/640 | 0 | 5 | — |
| pVisor VM | 16 | 5/5 | 80/80 | 0 | 0 | 2047.9 |
| pVisor VM | 32 | 3/5 | 138/160 | 0 | 0 | 2047.8 |
| pVisor VM | 64 | 0/5 | 1/320 | 0 | 0 | — |
| pVisor VM | 128 | 0/5 | 0/640 | 0 | 5 | — |
| Podman | 16 | 5/5 | 80/80 | 0 | 0 | 969.3 |
| Podman | 32 | 5/5 | 160/160 | 0 | 0 | 1931.8 |
| Podman | 64 | 0/5 | 120/320 | 64 | 5 | — |
| Podman | 128 | 0/5 | 128/640 | 128 | 5 | — |
stage 和 Podman 在 32 路均完成 160/160 个任务;它们在 64/128 路都有 OOM,不能凭部分完成任务宣称达到该并发容量。VM 在 32 路完成 138/160 个任务,只有 3/5 完整批次;更高并发的启动或完成失败同样保留,不能都归因为 OOM。结果未知表示没有保留到可校验的完成证据,不视为成功或零耗时。
空闲环境¶
| 模式 | 并发度 | 全部通过批次 | 校验完成 / 尝试任务 | 结果未知 | OOM 批次 | barrier 内存 P50,MiB |
|---|---|---|---|---|---|---|
| 原生进程 | 32 | 5/5 | 160/160 | 0 | 0 | 242.0 |
| 原生进程 | 64 | 5/5 | 320/320 | 0 | 0 | 471.9 |
| 原生进程 | 128 | 5/5 | 640/640 | 0 | 0 | 931.9 |
| pVisor stage | 32 | 5/5 | 160/160 | 0 | 0 | 407.8 |
| pVisor stage | 64 | 5/5 | 320/320 | 0 | 0 | 804.5 |
| pVisor stage | 128 | 5/5 | 640/640 | 0 | 0 | 1600.4 |
| pVisor VM | 32 | 5/5 | 160/160 | 0 | 0 | 2047.9 |
| pVisor VM | 64 | 0/5 | 7/320 | 0 | 0 | — |
| pVisor VM | 128 | 0/5 | 0/640 | 0 | 5 | — |
| Podman | 32 | 5/5 | 160/160 | 0 | 0 | 902.8 |
| Podman | 64 | 5/5 | 320/320 | 0 | 0 | 1806.9 |
| Podman | 128 | 0/5 | 141/640 | 384 | 5 | — |
stage 在空闲 128 路通过五轮,但相同环境加入私有数据和 Git 工作后,最高全部通过的已测级别是 32 路。两种负载分开规划;测量的离散级别也不是精确最大容量。
暂停后的压缩快照与容器 pause 容量尚未完成验证,不能由快照文件大小或单 VM 回收量推算。Firecracker/QEMU 的同预算密度未测;它们的单任务延迟见端到端任务。macOS 的对应容量未测。
数据下载与复现¶
完整并发扫描 CSV · 制品、预算和证据摘要 · 比较方法 · 复现手册
整理表保留每个条件的尝试数、完整批次数、失败原因、未知数、OOM、观察范围和来源摘要。原始报告、日志、输入清单及源码/二进制留在本地 .data/;没有将失败批次移出容量统计。