Linux NUMA自动优化机制全解析

NUMA Balancing 是 Linux 内核自带的自动 NUMA 优化机制 ,核心作用是:自动把进程迁移到它频繁访问的内存所在节点,同时把内存迁移到进程运行的节点,尽量让 "CPU 与内存同节点",减少跨 NUMA 节点访问延迟。


一、它解决什么问题?

没有 NUMA Balancing 时常见问题:

  1. 进程刚启动被调度到 Node0,但内存被分配在 Node1 → 全程跨节点访问,性能大幅下降。
  2. 线程被调度到其他 NUMA 节点,内存不跟着动 → 远程访问变多。
  3. 大内存应用(数据库、DPDK、Java 堆)内存分布散乱,跨节点访问严重。

NUMA Balancing 就是内核自动做亲和性,不用手动 numactl。


二、基本工作原理(极简流程)

  1. **页面错误陷阱(NUMA hint fault)**内核把部分内存页标记为 "不可访问"。
  2. 进程访问时触发缺页异常,内核记录访问来源节点
  3. 内核统计:哪个节点的 CPU 在频繁访问这页内存。
  4. 动态迁移
    • 内存页 → 迁移到进程所在节点
    • 进程 / 线程 → 迁移到内存所在节点
  5. 周期性扫描、重新平衡

它是软机制,不强制绑定,会根据访问模式自动调整。


三、关键内核配置与开关

1. 查看是否开启

复制代码
cat /proc/sys/kernel/numa_balancing
  • 0 = 关闭
  • 1 = 开启(大多数现代发行版默认开启)

2. 临时开关

复制代码
# 开启
echo 1 > /proc/sys/kernel/numa_balancing

# 关闭
echo 0 > /proc/sys/kernel/numa_balancing

3. 永久开启(sysctl)

复制代码
kernel.numa_balancing = 1

四、相关可调参数(性能调优重点)

路径:/proc/sys/kernel/numa_balancing_*

  • numa_balancing_panic_threshold严重错误时是否 panic,一般默认即可。
  • numa_balancing_scan_delay_ms扫描任务间隔,默认几百 ms。调大 → 开销低、反应慢调小 → 更敏感、CPU 开销高
  • numa_balancing_scan_period_min_ms
  • numa_balancing_scan_period_max_ms自动扫描周期的上下限。
  • numa_balancing_scan_size_mb每次扫描多少 MB 内存页。

这些参数数据库、高性能计算场景经常微调


五、NUMA Balancing 好处

  • 自动优化,无需手动绑核、绑内存
  • 对多线程、内存密集型应用提升明显
  • 动态适应负载变化(进程迁移、流量变化)
  • 对虚拟化、KVM vNUMA 也能协同工作

六、什么时候应该关闭 NUMA Balancing?

这是高频面试 / 运维考点:

必须关闭的场景

  1. DPDK、XDP、高性能网络平面用户态驱动自己管理内存,内核自动迁移会导致性能抖动、丢包。
  2. **数据库手动绑核(numactl 固定节点)**手动优化已经最优,内核乱动反而变差。
  3. **低时延要求业务(高频交易、实时系统)**页面扫描、迁移会带来毛刺延迟。
  4. 大页(HugePage)场景大页本身不易迁移,迁移成本极高,平衡机制效果差。
  5. 自己做了 CPU 亲和性、内存绑核的应用

简单记:手动 NUMA 优化越精细,越要关内核自动 NUMA Balancing。


七、如何观察 NUMA Balancing 效果

复制代码
# 查看 NUMA 事件
numastat

# 持续观察
numastat -c 1

# 查看某个进程 NUMA 内存分布
numastat -p <pid>

重点看:

  • numa_hit:本地节点访问(越高越好)
  • numa_miss:跨节点访问(越高越差)
  • numa_foreign:内存分配在其他节点

开启 NUMA Balancing 后,正常情况 numa_hit 会上升。


八、与手动 numactl 的关系

  • numactl --cpunodebind / --membind强绑定,优先级高于 NUMA Balancing。
  • 内核不会把进程迁移出你绑定的节点。
  • 但内存迁移仍可能发生,所以高性能场景一般直接关闭 numa_balancing

九、总结一句话

NUMA Balancing 是内核自动让进程和内存就近配对 的机制,对普通应用提升明显、省心;但对DPDK、数据库、低时延业务,建议关闭,改用手动绑核绑内存。

相关推荐
开开心心就好2 小时前
桌面图标乱了怎么办,一键恢复固定位置工具
运维·服务器·windows·pdf·excel·3dsmax·houdini
zb200641202 小时前
自己编译RustDesk,并将自建ID服务器和key信息写入客户端
运维·服务器
渔民小镇2 小时前
不用前端也能测试 —— 模拟客户端请求模块详解
java·服务器·前端·分布式·游戏
桌面运维家2 小时前
KVM虚拟机:存储IO瓶颈诊断与Linux性能优化实战
linux·运维·性能优化
M1nat0_3 小时前
Linux 基础 IO 全解析:从文件本质到重定向与缓冲区
linux·运维·服务器
l1t3 小时前
在aarch64 Linux环境编译安装CinderX
linux·python
Lugas Luo3 小时前
SATA 协议报错信号与根因定位分析指南
linux·嵌入式硬件
SuperHeroWu73 小时前
【Neo4j 】图数据库容器化部署(国内源,Linux 详细步骤)
linux·数据库·neo4j
小码吃趴菜3 小时前
服务器预约系统linux小项目-第五节课
linux·服务器·oracle