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 复核,确认策略确实生效
- 更换硬件平台后重新核对拓扑,不要沿用旧的核编号
策略只影响之后新分配的页面:进程启动后再改内存策略,已有内存不会自动迁移,需要重启应用或借助迁移机制。