Generated by Answer me with HTML 0.5.7 · 2026-10-23 15:41 · ★ Star on GitHub
4 小时 A/B 结果
网关省了约 40 MB 并稳定不涨;hy-memory 补丁有效但不是主因
两个结论
- 网关:MALLOC 调优生效,4 小时稳定在 495 到 511 MB,比老进程低约 40 MB。
- hy-memory:缓存补丁按设计生效,隔离实测单条 41 KB 降到 4.3 KB。
- 但真机 RSS 仍从 91 MB 涨到 409 MB,说明缓存不是主要来源。
- 增长只跟着写入事件走,跟读取无关,这一点已用对照实验证实。
网关:4 小时平台化
数据
| 11:35 | 495MB |
|---|---|
| 12:05 | 504MB |
| 12:35 | 504MB |
| 13:05 | 502MB |
| 13:35 | 502MB |
| 14:05 | 508MB |
| 14:35 | 501MB |
| 15:05 | 495MB |
| 15:30 | 495MB |
| 指标 | 调优后 | 调优前 | 差 |
|---|---|---|---|
| RSS 中位 | 502 MB | 545 MB | -43 MB |
| RSS 区间 | 495 到 511 MB | 530 到 558 MB | 更窄 |
| 运行 4 小时走势 | 持平 | 仍在上行 | — |
| 匿名大块数 | 39 到 41 个 | 50 个 | -18 % |
| 最大单块 | 152 MB | 110 MB | 反而更大 |
- 4 小时内 RSS 首尾相同,都是 495 MB,峰值只到 511 MB,波动 ±1.6 %。
- 老进程同期没有采样点,但 8.4 小时时是 545 MB、9.8 小时时 530 MB,一直在高位。
- 收益落在下调后的 40 到 60 MB 区间下沿,不是最初说的 80 到 120 MB。
- 最大单块 152 MB 一直不变,说明有一笔固定大分配不受 arena 参数影响。
B hy-memory:补丁对,但不够
| 观察点 | 补丁前 | 补丁后 |
|---|---|---|
| 冷启 RSS | 90 MB | 91 MB |
| 缓存单条占用 | 41 KB | 4.3 KB |
| 缓存满额上限 | 约 400 MB | 约 42 MB |
| 真机 2 小时内 | 涨到 398 MB | 仍涨到 391 MB |
| 当前 | 398 MB | 409 MB,运行 3.5 小时 |
- 补丁在隔离环境完整验证过:15 个用例全过,精度余弦相似度 1.0000000000。
- 但真机 RSS 曲线几乎没变,幅度与时间都对得上老曲线。
- 说明缓存只解释了 400 MB 里的一小部分,主体在别处。
对照实验:读不涨,写才涨
recall 十次后增量max 0 MB
今日写入事件max 10 次
单次写入对应增量max 30 MB
- 连打 10 次
/api/v1/search唯一查询,RSS 全程 408.8 MB,一动没动。 - 静置 20 秒后仍是 408.8 MB,不是延迟回收的问题。
- 时间线上 12:35 到 12:40 这 5 分钟里 RSS 从 157 跳到 391 MB,同期只有 1 次写入。
- 15 点那一小时有 11 次读取、0 次写入,RSS 从 413 回到 410,横着走。
- 结论:增长挂在写入链路,读取链路是干净的。
下一步怎么定位
- 候选一:写入链路里有对象被长期持有,比如全部历史向量被拉成 Python list。
- 候选二:LLM 客户端或响应缓冲没有释放,每次写入留一份。
- 候选三:日志把整段对话打印两次,临时字符串造成堆碎片。
- 验证方式:隔离库起独立进程,只跑 3 次写入,量每次增量与是否回落。
- 这条路径不碰生产记忆,也不影响正在跑的服务。
现在要不要回滚
- 网关收益
- -43 MB,稳定,建议保留
- hy-memory 补丁
- 隔离实测有效,建议保留
- 看门狗阈值 450
- 当前 409 MB 未触发,观察中
- 系统可用
- 512 MB,空闲 66 MB,页缓存可回收
- 网关这 43 MB 是真收益,且 4 小时不涨,没有回滚理由。
- hy-memory 补丁即使不是主因,也省下了缓存层那部分,留着没有坏处。
- 真正要处理的是写入链路,找到后再决定是改代码还是调写入频次。 AM_EOF