首页/系统/Linux 内核与性能调优速查/numa_balancing 自动 NUMA 均衡
CPU 与调度60 条

numa_balancing 自动 NUMA 均衡

内核自动把任务与内存页向访存更近的节点迁移;开启可改善通用负载的跨节点访问,确定性的内存密集负载常关闭改为手工绑定。

自动 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 比例很低时,自动均衡带来的收益有限,关闭的成本也小
  • 出现周期性抖动且时间点与延迟毛刺吻合时,值得做对照实验
  • 业务访存模式固定且可预测时,手工绑定通常更稳定
  • 关闭后必须重新采集数据,确认跨节点访问没有变差

易错点

  • 直接关闭自动均衡:缺少 numastat 证据就关,可能反而让跨节点访问增加
  • 只看全局不看进程:定位不到具体哪个服务受影响
  • 忽略拓扑前提:禁用 NUMA 的机器上这个参数没有实际意义
  • 与手工绑定混用:两套机制同时作用,效果难以预期
  • 关闭后不验证:应重新采集 numastat 与延迟数据确认确有改善

数据来源与参考

  • Linux 内核 Documentation/admin-guide/mm/numa_memory_policy.rst
  • numactl 文档 numastat(8)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌