Generated by Answer me with HTML 0.5.7 · 2026-10-23 10:13 · ★ Star on GitHub

MALLOC_ARENA_MAX=2 的代价

本机 16 线程压测 5 轮,吞吐代价在噪声带内,内存省三成

sourcearena_bench2 实测 · 本机 · 2026-10-23
结论
  • 代价只有两项:分配吞吐略降、每个 arena 内碎片更集中。
  • 本机实测吞吐中位从 2847 降到 2616 k 次每秒,降 8.1 %。
  • 同一组内存中位从 645 MB 降到 449 MB,降 30.4 %。
  • 网关真实并发只有个位数线程,吞吐影响趋近 0。
A

16 线程压测(5 轮中位)

0500100015002000250030002847默认 unset 吞吐2616ARENA_MAX=2吞吐645默认 unset RSS449ARENA_MAX=2RSS
数据
默认 unset 吞吐2847
ARENA_MAX=2 吞吐2616
默认 unset RSS645
ARENA_MAX=2 RSS449
配置 吞吐中位 碎片后 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,其余是分配器持有量。
B

4 线程对照(接近网关真实并发)

配置 吞吐 碎片后 RSS
默认 unset 2375 k ops/s 198.8 MB
ARENA_MAX=2 2426 k ops/s 184.7 MB
  • 并发降到 4 线程后,吞吐差异消失,落在噪声内。
  • 内存收益也从 30 % 缩到 7 %,因为并发少时本来就没几个 arena。
  • 结论:并发越低,代价越小,收益也越小。
C

代价清单

分配吞吐
高并发下 -8%,低并发 -0%
内存收益
碎片部分 -30%,对象本体 0
功能影响
无
正确性风险
无,只影响分配器策略
生效条件
重启进程
回滚方式
删环境变量
  • 它只压分配器碎片,压不动真实对象。
  • 网关 545 MB 里对象多少、碎片多少,要实测才知道。
  • 单 arena 内不同尺寸类别的碎片会更集中,极端长跑可能更难归还。
  • 你 hy-memory 上已用这套:环境变量里有 ARENA_MAX=2 和 TRIM_THRESHOLD=65536。
D

建议先用 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。