linux numactl 命令详解:绑定 CPU 与内存
答案:numactl --hardware 看 NUMA 拓扑,--cpunodebind=N --membind=N 把程序绑到本地 CPU + 本地内存;numastat 看各 node 内存分配。多路服务器上远程内存访问慢,性能敏感程序要本地化。
一、NUMA 是什么(30 秒)
CPU socket 0 ──本地内存 node 0
CPU socket 1 ──本地内存 node 1
└────── QPI/UPI 互联 ──────┘
访问本地内存:快
访问远程内存:慢 1.5~2 倍(跨互联总线)二、常用命令
numactl --hardware # 查看拓扑:几个 node、各 node 内存
numactl --show # 查看当前默认策略
numactl --cpunodebind=0 --membind=0 ./program # 绑定 CPU+内存到 node0
numactl --preferred=1 ./program # 优先 node1 本地分配
numastat # 系统各 node 内存统计
numastat -p <PID> # 指定进程内存落在哪些 node
cat /proc/<PID>/numa_maps # 每段内存的 node 映射三、参数速查
| 参数 | 作用 |
|---|---|
--hardware | 查看 NUMA 拓扑 |
--show | 查看当前策略 |
--cpunodebind=N | 绑定 CPU 到 node N |
--membind=N | 绑定内存到 node N(严格) |
--preferred=N | 优先 node N 本地分配(可用远程兜底) |
--interleave=N1,N2 | 内存交错分配(HBM/带宽场景) |
四、判断要不要用
# 单 node = 单路机器,NUMA 影响小,不用折腾
# 多 node = 多路服务器,内存带宽敏感程序建议绑定
numactl --hardware适用场景:2+ socket 服务器、数据库、内存带宽敏感程序、虚拟化宿主。单路机器基本不用管。
五、常见坑
numastat不平衡不一定是问题:node 内存不均衡可能只是进程恰好分配在那里,要结合进程看;- 容器里 numactl 可能失效:cpuset 绑核后
--cpunodebind被覆盖,优先用容器 cpuset/cgroup 控制; --membind太严格会失败:node 内存不足时分配失败,用--preferred更稳妥;- 绑核 ≠ 绑内存:只
taskset绑 CPU 不绑内存,仍可能远程分配;要同时numactl --membind。
深度入口
- NUMA 原理深入:NUMA 架构
- numastat 字段详解:numastat
- 本地分配实验与数据:numa-access 实验
- NUMA 与内存分配策略:numactl 完整指南
FAQ
Q: linux numactl 怎么用? A: --hardware 看拓扑;--cpunodebind=N --membind=N 程序 绑定本地 CPU+内存;--show 看当前策略。
Q: numactl 常用参数有哪些? A: --hardware、--show、--cpunodebind、--membind、--preferred、--interleave。
Q: NUMA 是什么?为什么重要? A: 多路 CPU 每 socket 挂本地内存,远程访问慢 1.5~2 倍;numactl 让程序本地运行避免远程损耗。
Q: 怎么查看当前进程的 NUMA 分布? A: numastat -p PID、numastat、/proc/PID/numa_maps。
Q: 什么情况下需要 numactl? A: 多路服务器、内存带宽敏感程序、数据库;先 --hardware 确认是否多 node。
Q: NUMA 和 cgroup 内存限制冲突吗? A: 不冲突但容器 cpuset 可能覆盖 --cpunodebind,优先用容器 cpuset 控制。
一句话总结:NUMA 下"远程内存慢、本地内存快",numactl --hardware 先看拓扑,--cpunodebind + --membind 绑定本地 CPU+内存,numastat 观察分布;多路服务器和内存带宽敏感程序收益最大,单路机器不用折腾。