首页/系统/Linux 内核与性能调优速查/numactl 绑定核与内存节点
CPU 与调度60 条

numactl 绑定核与内存节点

numactl --physcpubind 限定逻辑核、--membind/--preferred 控制内存节点;--localalloc 让分配尽量就近,降低跨节点延迟。

numactl 绑核与绑节点

numactl 从命令行启动进程并指定 NUMA 策略:--physcpubind 限定逻辑核,--cpunodebind 按节点限定核,--membind 强制内存只从指定节点分配,--preferred 优先某节点但允许兜底,--localalloc 就近分配,--interleave 在多个节点间交错。先用 numactl -H 看拓扑,再用 numastat -p <pid> 验证效果。绑核与绑节点必须匹配,跨节点组合会抵消收益。

基本信息

查看拓扑numactl -H
绑核--physcpubind=0-3 或 --cpunodebind=0
绑内存--membind=0 与 --preferred=1
交错分配--interleave=all
验证numastat -p <pid>

典型使用场景

  • 内存密集型服务需要确定性访存
  • 单节点内存不足时使用交错分配摊开压力
  • 排查跨节点访存比例偏高的问题
  • 与 cgroup cpuset 方案做效果对比
  • 数据库类服务部署前的节点规划

常用示例

常用示例
numactl -H                          # 节点数量与各节点的 CPU 范围
numactl --physcpubind=0-3 --membind=0 ./service
numactl --cpunodebind=0 --localalloc ./service
numactl --preferred=1 ./service     # 优先节点 1,允许兜底
numactl --interleave=all ./service  # 在所有节点间交错分配
numastat -p $(pgrep -f service | head -1)   # 验证实际分布
numactl --show                      # 查看当前进程的有效策略

选项语义

选项含义注意
--physcpubind按逻辑核编号绑定核编号跨机型可能不同
--cpunodebind绑定该节点下的全部核粒度更粗但不容易绑错节点
--membind内存只从指定节点分配节点内存不足会直接失败
--preferred优先指定节点,允许兜底不会因节点耗尽而失败
--interleave多个节点交错分配带宽型负载常用,延迟可能上升
--membind 是强制语义,节点内存超限会直接失败;--preferred 是兜底语义,两者不能互换使用。
绑核与绑节点必须与拓扑匹配:跨节点的核与内存组合会引入远程访存,把绑定的收益抵消掉。

部署检查清单

  • 先用 numactl -H 记录节点与核的对应关系,并写进部署文档
  • 绑核范围与内存节点应属于同一节点,避免远程访存
  • 启动后用 numastat -p 复核,确认策略确实生效
  • 更换硬件平台后重新核对拓扑,不要沿用旧的核编号
策略只影响之后新分配的页面:进程启动后再改内存策略,已有内存不会自动迁移,需要重启应用或借助迁移机制。

易错点

  • 把 --membind 当 --preferred 用:节点耗尽时直接失败而不是回退
  • 绑核不绑节点:内存仍可能落在远端节点,收益被抵消
  • 照抄别的机器的核编号:不同拓扑下绑核结果不可预期
  • 不做验证:应通过 numastat -p 确认实际分布
  • 在单节点机器上使用:没有 NUMA 拓扑时这些选项没有实际意义

数据来源与参考

  • numactl 官方文档
  • Linux 内核 Documentation/admin-guide/mm/numa_memory_policy.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌