NUMA 拓扑与内存访问
多路服务器上,每颗 CPU 有自己的内存控制器:与它直连的内存构成一个 NUMA 节点,本地访问延迟低,跨节点访问要经过处理器互连,延迟更高、带宽更低。操作系统默认尽量让进程在本节点分配内存,但负载不均衡、绑定策略缺失或调度抖动都会让一部分内存访问变成跨节点。数据库、虚拟化、高性能计算这类对延迟敏感的场景需要显式感知拓扑。
基本信息
| 适用平台 | Linux 内核自带 NUMA 支持(多数 x86_64 发行版) |
|---|---|
| 查看命令 | lscpu 与 lscpu --extended、numactl --hardware、numastat |
| 内核接口 | /sys/devices/system/node 下按节点组织 |
| 绑定工具 | numactl、numad、服务自身的绑定配置项 |
| 权限要求 | 查看无需特权,绑定进程通常需要 root 或相应权限 |
| 典型距离 | 本地为 10,跨节点常见 20 以上(数值越大越远) |
典型使用场景
- 上架后确认 NUMA 节点与内存分布,作为容量台账的一部分
- 数据库调优:核对实例是否把内存与 CPU 绑在同一节点
- 虚拟化规划:按节点容量分配虚拟机,减少跨节点占用
- 性能抖动排查:用 numastat 看是否存在大量跨节点访问
- 跨节点访问比例偏高时评估关闭自动均衡或调整绑定策略
- 内存故障影响面评估:故障条属于哪个节点,影响哪些进程
查看拓扑与访问情况
查看拓扑与访问情况
# 看 NUMA 节点数量与 CPU 归属
lscpu | grep -i numa
lscpu --extended | head -5
# 每个节点的 CPU、内存容量与节点间距离
numactl --hardware | head -30
# 内存跨节点访问统计:本地命中与远端命中
numastat -m | head -20
# 按节点查看内存使用量(内核接口,实时)
grep -H MemTotal /sys/devices/system/node/node*/meminfo输出逐项读法
| 输出项 | 含义 | 判定要点 |
|---|---|---|
| available: N nodes | 节点总数,通常与 CPU 路数相关 | 与机型手册核对是否一致 |
| node N cpus | 该节点包含的 CPU 核心 | 绑定 CPU 时直接引用这些编号 |
| node N size / free | 该节点内存容量与空闲量 | 节点间容量明显不均时需检查内存分布 |
| node distances | 节点间访问代价矩阵 | 对角线为本地值,其余为跨节点值 |
| numa_hit / numa_miss | 本地命中与远端分配失败次数 | miss 持续偏高说明绑定策略不合理 |
| local_node / other_node | 在本节点与其它节点上分配的次数 | other_node 占比高即存在跨节点访问 |
numastat 的统计是累计值:判断趋势要看增量,连续两次采样相减比直接看绝对值更有意义。
部分平台允许在 BIOS 中把多节点合并为单节点呈现(如节点交织模式)。改这项会改变延迟特征,调整前先与业务方确认性能预期。