NUMA 是什么
多路服务器把内存划分成多个节点,每个 CPU 有自己的本地内存。进程访问本地节点很快,跨节点访问的延迟明显更高、可用带宽也更低。numactl 用来查看拓扑并绑定 CPU 与内存节点,numastat 用来观察各节点的命中与缺失计数,两者配合才能判断内存访问是否在「跨节点」。
基本信息
| 所属 | numactl 软件包 |
|---|---|
| 常用命令 | numactl --hardware、numactl --cpunodebind、numastat |
| 观察项 | numa_hit、numa_miss、numa_foreign |
| 典型用户 | 数据库、缓存等大内存应用 |
典型使用场景
- 数据库或缓存服务上线前确认是否存在跨节点访问
- 排查「CPU 不满但吞吐上不去」的隐性瓶颈
- 容器环境中评估可见的 NUMA 拓扑
- 绑定 CPU 与内存节点,减少跨节点访问
- 对比绑定前后延迟与吞吐的变化
- 多实例部署时规划节点分布,避免互相挤占
常用示例
常用示例
numactl --hardware # 查看节点、CPU 与内存分布
numastat # 各节点命中与缺失计数
numastat -p $(pgrep -f mysql | head -1) # 指定进程的节点分布
numactl --cpunodebind=0 --membind=0 java -jar app.jar # 绑核并绑内存
numactl --interleave=all ./cache-server # 交错分配,分摊带宽
lscpu | grep -i numa # 快速确认 NUMA 节点数
cat /sys/devices/system/node/node*/meminfo | head # 直接看各节点内存numastat 字段读法
| 字段 | 含义 | 异常表现 |
|---|---|---|
| numa_hit | 在本地节点成功分配 | 基线值,占比越高越好 |
| numa_miss | 本地分配失败改选其它节点 | 持续增长说明本地内存不足 |
| numa_foreign | 本节点内存被其它节点使用 | 说明存在跨节点访问 |
| interleave_hit | 交错分配命中次数 | 按交错策略分配时关注 |
| local_node | 在本地节点分配的次数 | 与 numa_hit 结合判断 |
容器里的 NUMA 拓扑由宿主机抽象:绑定前先确认容器内可见的节点数与宿主是否一致,否则绑定结果与预期不符。
把进程死绑在单个节点上,会让内存与带宽集中到一侧:节点内存用满后反而制造新瓶颈,绑定前先核对节点容量。
也可以在系统层开启自动 NUMA 平衡,让内核按访问模式迁移内存页;手工绑定与自动平衡应当二选一,或谨慎组合。