自动 NUMA 均衡
kernel.numa_balancing 让内核自动把任务与内存页向访问更近的节点迁移。开启时通用负载的跨节点访问通常减少,代价是周期性扫描与迁移开销,敏感负载上可能表现为偶发抖动。对访存模式固定、要求确定性的内存密集负载,常见做法是关闭自动均衡,改用 numactl 手工绑定。该不该关,依据是 numastat 的本地与远程命中比例,而不是理论推测。
基本信息
| 开关 | kernel.numa_balancing |
|---|---|
| 观测 | numastat 与 numastat -p <pid> |
| 对立方案 | numactl 手工绑定并关闭自动迁移 |
| 相关开关 | vm.zone_reclaim_mode |
| 主要代价 | 周期性扫描与页迁移开销 |
典型使用场景
- NUMA 机器上出现难以解释的偶发抖动
- 内存密集型服务希望访存行为可预期
- 排查跨节点访存比例异常偏高
- 与手工绑定方案做效果对比
- 虚拟机上确认拓扑是否真实暴露给客户机
查看与观测
查看与观测
sysctl kernel.numa_balancing
numastat # 全局本地与远程命中计数
numastat -p 12345 # 指定进程的节点分布
numastat -m | head -12 # 各节点内存使用情况
numactl -H | head -20 # 节点与核的拓扑
sysctl -w kernel.numa_balancing=0 # 关闭前先留好基线数据numastat 指标读法
| 指标 | 含义 | 判读 |
|---|---|---|
| numa_hit | 分配到本地或指定节点的页数 | 比例越高越好 |
| numa_miss | 分配到其他节点的页数 | 比例显著偏高即跨节点访问多 |
| numa_foreign | 其他节点希望分配到本节点的页数 | 配合 miss 一起判断 |
| numastat -p | 进程级节点分布 | 用于定位到具体服务 |
自动迁移有周期性开销,敏感负载上可能表现为偶发抖动,排查抖动时不要漏掉这个开关。
关闭之前先用 numastat 确认跨节点访问确实是瓶颈,并准备好手工绑定的替代方案。
判断是否该关闭
- numa_miss 比例很低时,自动均衡带来的收益有限,关闭的成本也小
- 出现周期性抖动且时间点与延迟毛刺吻合时,值得做对照实验
- 业务访存模式固定且可预测时,手工绑定通常更稳定
- 关闭后必须重新采集数据,确认跨节点访问没有变差