| B | ~162MB(bun 口径;node 口径 228MB) | R-BUN 实测,见 rounds/round-bun/round-bun.md。每次升级 bun / pi / encore 版本重测 |
| S_eventbuf_cap | 每会话对抗性最坏 ~56MB | 不用测,是代码里的结构性常数:MAX_EVENTS_PER_SESSION=2000 × 单事件 ≤8KB(MAX_EVENT_BYTES)≈16MB,加 PENDING_FLUSH_MAX=5000×8KB≈40MB(apps/api/spike/runtime.ts、apps/api/spike/events.ts)。R3 改这三个常数,预算随之改 |
| S_active_p95 / S_stream_p95 | 目前证据不足 | R1/R-BUN 只有空闲会话数字。R3/R4 落地后在预发用真实使用数据采 p95(长对话、大轨迹、并发流式各取),不做压测 |
| N_active / N_streaming | 先给保守值(8 / 4) | 由 R3 的并发上限与空闲回收参数决定——是「配出来」的,不是「测出来」的 |
| G | bun 口径需重新标定 | bun 用 JSC 堆与自有分配器,RSS 语义与 V8 不同,Node 时代的余量系数不可迁移 |
主机预算参考(3.6 GiB 物理内存,与 deploy/docker-compose.yml 的 mem_limit 对齐):
| 组件 | 预算 |
|---|---|
| OS + systemd + sshd + fail2ban + dockerd | ~450–550 MB |
| postgres(shared_buffers=256MB,mem_limit 768m) | ~300–500 MB |
| api(mem_limit 1g) | 1 GiB 上限 |
| web(mem_limit 384m,常态 ~100–150MB) | 384 MB 上限 |
| caddy(mem_limit 128m) | ~30–50 MB |
| skill-runner(mem_limit 384m,R-SKILLS-2;常态 ~20 MB,跑脚本时每个子进程 rlimit AS 256 MB、并发 2) | 384 MB 上限 |
| skill-runner-egress(mem_limit 256m,R-WEBFETCH 所有者裁定 C7;同一镜像,并发 1;常态 ~20 MB,抓一页时 trafilatura 进程按 dev.ps1 runner-test 的病态夹具实测) | 256 MB 上限 |
| filesystem cache 与余量 | 剩余 ~50–450 MB(加 egress 之后;OS 那一行按下限算才剩 ~650 MB)。这是六个容器全顶到上限的最坏值,常态远宽松;egress 容器 RSS p95 进 R-SKILLS-2 同一套观察口径,超 60% 再议 |
关于 api 的 1g:这是初始生产上限,依据是「Bun 口径实测基座 162.5MB + 事件缓冲的结构性上限 + 3.6GiB 主机的总预算」三者取平衡。它不代表「已证明 1GB 足够所有真实负载」——S_active_p95 目前是空值,任何容量结论都还缺这一项。
同样地,不要用空闲会话的 0.04MB 去推真实活跃会话的容量。空闲会话不持有上下文、消息历史、在途 provider 响应与流式写缓冲,两者不是一个量级的东西。
什么时候提高 limit / 升配:容器 RSS p95 持续一周超 mem_limit 的 60%,或出现首次 OOM kill → 先查泄漏,确认是真实负载后按上式重算。若推出 api 常态 >700MB,先做「把 PostgreSQL 拆到云托管」再考虑升配——拆库比升配便宜,且顺路解锁多实例前置。
服务器上不构建、不 clone 仓库、不装 encore/node/bun 工具链(CLAUDE.md 规则 10)。服务器只需要 docker + docker compose + 四个部署资产:docker-compose.yml、Caddyfile、migrate.sh、.env(由 .env.example 复制)。这四个文件首次部署随镜像一起 scp,之后仅在变更时重传——migrate.sh 是部署必经步骤,漏传就做不了迁移。
见 deploy/Caddyfile:/ → web、/api/* → api、/notes/**.webp 按扩展名分流到 api 供图;/api/mcp* 可选 IP 白名单段;全局限速可用 caddy-ratelimit 插件或前置云厂商防护。
每个环境各过一遍,不是过一次就完。130 预发的留证见 rounds/round-10/checklist.md(R10,SHA 5c98b3e,1–11 全绿); 生产尚未重跑:R11 收工时所有者裁定不重跑,13 项里 6 项静态属性在生产没有留证(哪 6 项见 rounds/round-11/round-11.md「收工」段);将来若重跑,留证补进 releases.md 对应发版行。 下面括号里的判据是 R9/R10 实测校准过的,照着核不会误判。