跳转至

开发工具在 pVisor、Docker 和轻量 VM 中要等多久?

主要结论

七项工具到退出,pVisor host 为 0.47 s、staged 为 1.09 s、VM 为 4.27 s;Docker 为 0.82 s,Firecracker 为 2.29 s,QEMU microvm 为 1.50 s。staged 的审查能力有文件访问成本,VM 工具成本仍明显。

需求 选型含义
本机执行并保留改动 评估 host/staged 与完整审查流程
独立 guest 内核 同时预算启动和 VM 工具等待
并发或闲置环境 需要固定资源下的吞吐与物理内存实测

上述耗时来自 2026-10-06 的跨运行时基线,未计入后续缓存优化。当前缓存实验尚未建立默认 staged、VM 或完整审查任务的新性能结论,选型仍应使用这组基线。

Motivation

Agent 的工具循环需要遍历、读写、搜索、编译和安装依赖。选型要同时看单项操作与完整等待,避免用快速启动估计文件密集任务。

实验设计

Linux x86_64,AMD Ryzen 7 9700X,Fedora 7.2.8-200.fc44.x86_64。工具负载与专用 Docker daemon 固定到 CPU 0,1;容器初始化进程全生命周期的 CPU 亲和性未验证。VM 为 2 vCPU,shell 探针配置 128 MiB,工具任务配置 16 GiB。原生/Docker 未限制内存,因此不能推导相同资源预算下的容量。host/staged 使用 rootless_process。

同一套离线工具与固定输入,每次新建工作区;热缓存、3 次预热、每格 60 次正式采样,固定种子随机交替执行。环境准备、构建、镜像导入和输入重置不计时;启动和退出计入完整任务。Docker Engine 29.7.2 使用专用 rootless overlay2 daemon、经典镜像存储和可写 bind mount;Firecracker 1.13.1 PCI 不使用 jailer,QEMU 10.2.2 分别使用 q35/microvm 与私有 ext4。pVisor VM 使用 virtio-fs 和自己的固件。内核、存储和暂存语义不同,结果是这些配置下的任务成本,不是纯 VMM 或安全排名。

负载为 32 个目录中的 2,048 文件遍历、64 MiB 读取和 SHA256 校验、256 × 64 KiB 写入、git status、rg、64 个无外部依赖 Cargo 模块和 32 个离线 npm 包。单项含校验,不含启动与退出;完整任务包括七项和退出。大型仓库、冷磁盘、在线 registry 和并发吞吐未测。

这些样本未验证 Node/npm 编译缓存跨后端一致。新工作区不等于空工具缓存;npm 与完整任务的差值包含各配置下的缓存行为,不能全部归因于 FUSE、stage 或 VMM。

实验数据和分析

测于 2026-10-06,每个后端/负载 60/60 有效,正式失败 0。输出、退出和执行器记录必须通过校验;暂存模式还验证宿主原文件不变,以及 upper 中 256 个写入文件的数量和大小,未独立校验全部写入字节。保留所有有效慢样本,没有按耗时剔除。表格通常为 P50;分离分布展示各簇中位数和数量,P95 仅作观察参考。原始报告、二进制、输入与源码摘要保存在忽略的 .data/,公开 CSV 保留负载、批次和来源关联。

七项工具操作

单位 ms;P50 或分离簇的中位数与数量。

Operation Native pVisor host pVisor staged pVisor VM Docker rootless / overlay2 Firecracker PCI QEMU q35 QEMU microvm
遍历 2,048 文件 4.64 4.63 73.53 152.97 4.62 23.43 15.92 19.91
读取并校验 64 MiB 32.62 31.73 66.98 116.45 32.64 79.79 37.43 40.19
写入 256 文件 3.62 3.66 26.23 135.16 3.82 43.11 5.02 4.99
git status 14.50 14.30 120.01 352.11 (43/60); 665.46 (17/60) 14.42 129.97 80.27 155.03
Ripgrep 搜索 7.35 7.22 84.81 434.07 6.86 15.82 12.57 13.03
离线 Cargo 编译 51.00 50.81 71.76 482.69 48.14 373.88 260.34 296.94
离线 npm 安装 170.56 170.22 226.67 1320.16 215.77 546.50 399.42 421.37

启动到退出

Runtime Valid / failed Completion P50 s Completion P95 s
Native 60 / 0 0.45 0.46
pVisor host 60 / 0 0.47 0.48
pVisor staged 60 / 0 1.09 1.13
pVisor VM 60 / 0 4.27 4.60
Docker rootless / overlay2 60 / 0 0.82 0.85
Firecracker PCI 60 / 0 2.29 2.33
QEMU q35 60 / 0 1.49 1.51
QEMU microvm 60 / 0 1.50 1.54

staged 相对 Docker 的完整任务中位数差为 +268.81 ms,95% 配对 bootstrap 区间 [+264.64, +271.15] ms。VM 相对 QEMU microvm 为 +2778.04 ms,区间 [+2754.17, +2807.74] ms。暂存能力与存储配置均有差异,不能从总差距推断某一组件的成本。

完整 Ubuntu 文件负载在当前制品下尚未复测。

缓存优化的适用范围

不可变 lower 的物理元数据缓存已有独立工程 A/B,收益限定于显式声明并保持 lower 稳定的 Linux HOST FUSE 配置。宿主 rootfs、OCI 解包目录与 lazy 镜像的本地投影不自动获得不变性承诺。该实验未覆盖完整审查流程,不能用于折算上表 staged 或 VM 的耗时;实验设计、结果与置信区间见不可变 lower 缓存分析。

扩展内核缓存由 Linux HOST API 显式开启:可写长 metadata 缓存要求不可变 lower、独占 upper/work 和稳定 backing 元数据;KEEP_CACHE 仅支持稳定只读普通文件。配置不兼容 journal、读取观察指标或自定义路径策略时会拒绝启用,不会静默省略观察。当前版本的正式计时受并行构建检查干扰,尚无验收通过的加速幅度;未接入默认 pvisor run 或 VM。能力边界与验证状态见内核缓存分析。

数据下载与复现

整理后的统计 CSV · 全部运行时统计 · 差异与 95% 置信区间 · 源码与制品来源 · 比较方法 · 复现手册