numastat用于分析numa内存访问性能,numactl用于控制;需先用numastat定位跨节点访问异常(如numa_miss>10%、local_node

numactl 本身不是分析工具,而是控制工具;真正用于分析 NUMA 内存访问性能的是 numastat。numactl 的作用是执行干预——比如绑定 CPU、限定内存节点、切换分配策略,从而验证问题是否由 NUMA 分配不当引起,或实施优化方案。
先用 numastat 定位问题
不看数据就调优等于蒙眼开车。必须先确认是否存在跨节点访问异常:
-
查系统整体分布:运行
numastat -c,重点关注numa_miss(跨节点分配次数)和other_node(进程在非本地节点分配的内存 KB 数) -
盯住关键进程:用
numastat -p $(pgrep -f "mysqld")或numastat -p <pid></pid>,观察local_node占比是否低于 70%,other_node是否持续高于 15% -
结合延迟判断严重性:若
numa_miss占总访问比例超 10%,且应用延迟敏感(如数据库、实时服务),基本可判定 NUMA 分配已成瓶颈
再用 numactl 验证与干预
确认问题后,用 numactl 快速测试不同内存绑定策略的效果:
-
强制进程只用 Node 0 的 CPU 和内存:
numactl --cpubind=0 --membind=0 your_command -
允许内存在多个节点间交错分配(适合读写均衡型负载):
numactl --interleave=all your_command -
仅绑 CPU 不绑内存(让内核按需分配,但限制调度范围):
numactl --cpubind=0-3 your_command -
查看当前系统 NUMA 拓扑:
numactl --hardware,确认节点数、CPU 分布、距离矩阵(distance 值越大,跨访问代价越高)
对比前后指标看效果
每次用 numactl 启动服务后,必须重新运行 numastat -p <new_pid></new_pid>,对比三组核心值:
-
local_node / (local_node + other_node)是否提升至 85% 以上 -
numa_miss / (numa_hit + numa_miss)是否压到 5% 以内 -
other_node绝对值是否显著下降(例如从 8GB 降到 500MB)
注意生产环境的实用约束
numactl 是进程级控制,无法直接修改已运行进程的 NUMA 行为。常见落地方式包括:
- 数据库服务:在 systemd unit 文件的
ExecStart=前加numactl --cpubind=0 --membind=0 - Java 应用:在启动脚本中将
java -jar app.jar改为numactl --interleave=all java -jar app.jar - 容器场景:在 docker run 中使用
--cpuset-cpus和--memory配合 host 级 numactl 调度 - 避免盲目禁用内核自动平衡:可通过
echo 0 > /proc/sys/kernel/numa_balancing关闭,但仅建议在明确内存布局稳定时使用











