跳到正文
齿轮与路径

SDK WASM Agent 容量基线:1 GiB 内的 220 个空转 Agent

在 1 GiB 宿主 RSS 下实测 WASM 后端可同时存活的空转 Agent。共享 WebAssembly.Module 后,容量从 20 个提升到 219–222 个,每 Agent 边际内存从 39.6 MiB 降到约 4.2 MiB,启动 p50 从 79.5 ms 降到 45.5–46.2 ms。

更新于 查看 Markdown

这是一次受控容量测量,答案是「1 GiB 宿主 RSS 能装多少空转 Agent」,不是「真实对话能跑多少」。空转 Agent 没有 prompt、工具调用和模型请求,真实负载的容量会更低;本文不给未经测量的折算倍数。

结论

  1. 1 GiB 宿主 RSS 下实测 N_max:219 / 220 / 222(三次独立 run,中位 220),N_stop:220 / 221 / 223。
  2. 每 Agent 边际内存 3.905–4.508 MiB(中位 4.380,R² 0.9907–0.9962),约 4.2 MiB。
  3. 首个 Agent 一次性增量 110.8–114.0 MiB;Manager 基线约 29–31 MiB。
  4. 优化前是 N_max = 20、39.6 MiB/agent、首个 +118.8 MiB、启动 p50 79.5 ms。容量提升约 11 倍,边际内存降到约九分之一。
  5. 提升来自共享 WebAssembly.Module:独立复核记录 compileCalls = 1、instantiateCalls = 221,而优化前每个 Agent 都要重新编译约 10 MB 的 wasm。
  6. 从 200 个起步时 N=200 约 941–946 MiB,距 1024 MiB 约 80 MiB 余量。

口径

项 定义
测量对象 单宿主 Bun 进程构造一个 ChatManager,每个 Agent 是一个 chat 句柄
运行时 chatConfig.runtime.kind = "wasm",每个 chat 建立独立 ACP session 后空转,不发送 prompt
启动方式 串行启动,启动后不关闭、不销毁;默认每新增一个 Agent 采样一次
主指标 宿主进程 RSS:ps -o rss= -p <pid>,三次采样的中位数
停止条件 宿主 RSS ≥ 1024 MiB,或达到脚本上限,或启动失败
进程边界 本地 sqld 是独立进程,约 32 MiB,不计入宿主 RSS
复测前提 WASM 线性内存只增不减,同一进程跑过大 N 后 RSS 不会回落;每轮必须用全新进程
  1. 环境:Bun 1.4.3、macOS 26.6.2(arm64)、16 GiB RAM,运行期间主机负载约 1.7–2.3。
  2. 测量日期:2026-10-28。优化前后使用同一协议,优化后三次 run 中一次为独立复核。
  3. N_max 是 initial 仍低于 1024 MiB 的最大 N;N_stop 是首个 initial 超过阈值的 N。启动失败单独记为 failure,不产生容量值。
  4. 斜率为尾部最后 8 个已采样点的 OLS 拟合,单位 MiB/agent;R² < 0.95 视为未测稳。

结果

优化后三次 run:

指标 run 1 run 3(复核) run 2 中位 极差
N_max 219 220 222 220 219–222
N_stop 220 221 223 221 220–223
每 Agent 边际(MiB) 4.508 4.380 3.905 4.380 3.905–4.508
R² 0.99207 0.99071 0.99617 0.99207 0.99071–0.99617
首个 Agent 增量(MiB) 111.1 114.0 110.8 111.1 110.8–114.0
启动 p50(ms) 45.92 45.457 46.235 45.92 45.457–46.235
启动 p95(ms) 49.536 49.910 50.01 49.910 49.536–50.01
峰值 RSS(MiB) 1025.922 1027.578 1025.734 1025.922 1025.734–1027.578
N=200 RSS(MiB) 945.719 944.109 941.406 944.109 941.406–945.719
sqld 结束 RSS(MiB) 32.531 31.984 32.563 32.531 31.984–32.563

优化前后对照:

指标 优化前 优化后
N_max 20 219–222
每 Agent 边际 39.6 MiB 约 4.2 MiB
首个 Agent 增量 +118.8 MiB +110.8–114.0 MiB
启动 p50 79.5 ms 45.5–46.2 ms
N=20 总 RSS 约 1015–1019 MiB —

三次 run 的 sessionId 全部唯一,失败数为 0,停止原因均为 rss。

提升来自哪里

  1. 优化前每个 Agent 都会重新编译约 10 MB 的 wasm。在该 Bun / JSC 版本上,即使连续编译同一份 buffer,也不复用编译产物,因此斜率约 39.6 MiB/agent。
  2. 共享 WebAssembly.Module 后编译只发生在首次,后续 Agent 只承担实例、ACP session 与运行期数据,斜率降到约 4.2 MiB/agent。
  3. 首个 Agent 仍包含一次性编译、Emscripten 运行时与首个 session,所以首增量只从 118.8 MiB 降到 111–114 MiB,没有同比例下降。容量提升主要来自「不再每个 Agent 编译一次」。
  4. N_max 的 3 个 Agent 跨度来自尾部线性内存页增长和 GC 抖动,全宽约 1.4%,不是逻辑错误,也不应把 220 当作精确承诺。

边界与误判

  1. 空转不等于真实负载:没有 prompt、工具调用和模型请求,真实会话的常驻内存更高。本文只回答并发句柄的容量上限。
  2. 只覆盖 Bun + WASM 后端:native 后端、其他宿主运行时和托管部署不适用这份数字。
  3. 单机单版本:Bun 版本、宿主机或 wasm 产物变化后需要按同一协议复测。
  4. 不能用 process.memoryUsage().rss 代替主指标:WASM 线性内存由实例持有,Bun 对该部分记账不完整。优化前 N=21 时 ps 为 1035.7 MiB,而 process.memoryUsage().rss 只有 676.2 MiB,差 359.5 MiB;优化后接近阈值时的最大差仍有 174.1–176.5 MiB。用后者会系统性高估容量。
  5. sqld 不在账内:部署时还要加约 32 MiB 的独立进程内存。
  6. 跨度不是分布:三次 run 只能说明这台机器上的重复性,不能当作跨环境的容量分布。

复现要点

  1. 先构建 SDK 产物,确认 dist/index.js、dist/wasm/peri-wasm.js、dist/wasm/peri_wasm.wasm 存在;基准只消费构建产物,不从源码启动。
  2. 在第一个 WASM Agent 启动前拉起本地 sqld,每次 run 使用独立端口与独立 --db-path。
  3. 每轮使用全新进程采样,避免线性内存的历史峰值污染下一轮。
  4. 报告 N_max、N_stop、斜率与 R²;R² 低于 0.95 视为未测稳,不发布容量结论。

这项基准对应 4.4 的 WASM 模块共享变更,版本背景见 Peri 4.4 版本回顾。

导航

输入以搜索…

↑↓ 导航↵ 选择Esc 关闭