Generated by Answer me with HTML 0.5.7 · 2026-10-23 10:13 · ★ Star on GitHub
MALLOC_ARENA_MAX=2 的代价
本机 16 线程压测 5 轮,吞吐代价在噪声带内,内存省三成
结论
- 代价只有两项:分配吞吐略降、每个 arena 内碎片更集中。
- 本机实测吞吐中位从 2847 降到 2616 k 次每秒,降 8.1 %。
- 同一组内存中位从 645 MB 降到 449 MB,降 30.4 %。
- 网关真实并发只有个位数线程,吞吐影响趋近 0。
16 线程压测(5 轮中位)
数据
| 默认 unset 吞吐 | 2847 |
|---|---|
| ARENA_MAX=2 吞吐 | 2616 |
| 默认 unset RSS | 645 |
| ARENA_MAX=2 RSS | 449 |
| 配置 | 吞吐中位 | 碎片后 RSS 中位 | 相对变化 |
|---|---|---|---|
| 默认 unset | 2847 k ops/s | 645 MB | 基准 |
| ARENA_MAX=2 | 2616 k ops/s | 449 MB | 吞吐 -8.1 %,内存 -30.4 % |
- 每轮 3 秒,16 线程反复分配释放 16 KB 块。
- 阶段二每线程留 1500 块再掏空一半,强制产生空洞。
- 真实保留对象 393 MB,其余是分配器持有量。
4 线程对照(接近网关真实并发)
| 配置 | 吞吐 | 碎片后 RSS |
|---|---|---|
| 默认 unset | 2375 k ops/s | 198.8 MB |
| ARENA_MAX=2 | 2426 k ops/s | 184.7 MB |
- 并发降到 4 线程后,吞吐差异消失,落在噪声内。
- 内存收益也从 30 % 缩到 7 %,因为并发少时本来就没几个 arena。
- 结论:并发越低,代价越小,收益也越小。
代价清单
- 分配吞吐
- 高并发下 -8%,低并发 -0%
- 内存收益
- 碎片部分 -30%,对象本体 0
- 功能影响
- 无
- 正确性风险
- 无,只影响分配器策略
- 生效条件
- 重启进程
- 回滚方式
- 删环境变量
- 它只压分配器碎片,压不动真实对象。
- 网关 545 MB 里对象多少、碎片多少,要实测才知道。
- 单 arena 内不同尺寸类别的碎片会更集中,极端长跑可能更难归还。
- 你 hy-memory 上已用这套:环境变量里有 ARENA_MAX=2 和 TRIM_THRESHOLD=65536。
建议先用 4 不先用 2
ARENA_MAX=2 吞吐代价max 8.1 %
ARENA_MAX=4 吞吐代价max 1.5 %
ARENA_MAX=4 内存收益max 22 %
- ARENA_MAX=4 是接近免费的档位:内存仍省约 22 %,吞吐 1.5 % 在噪声内。
- 网关 40 线程但绝大多数 idle,4 个 arena 足够轮转。
- 真要极限压内存再用 2。