Linux CPUInfo中的NUMA架构概念与定位
NUMA架构的核心要点
- NUMA(Non-Uniform Memory Access,非一致性内存访问)将CPU与内存划分为多个NUMA节点(Node)。每个节点包含一组CPU核心与其“本地内存”,节点内访问延迟更低;访问其他节点的“远程内存”需经节点间互连(如 Intel UPI/QPI、AMD Infinity Fabric),延迟与带宽通常劣于本地访问。系统用“距离(distance)”描述跨节点访问成本,距离越大性能越低。为提升性能,应尽量让任务与数据“就近”匹配,减少远程访存。
在Linux中如何识别NUMA
- 使用lscpu快速查看:关注输出中的NUMA node(s)字段,若大于1则为NUMA系统;同时可查看节点与CPU的对应关系。示例:lscpu | grep -E “NUMA node(s)|CPU(s)”。
- 使用numactl --hardware查看节点拓扑与内存:显示如“available: 2 nodes (0-1)”、各节点包含的CPU列表及每节点内存大小,便于确认是否存在跨节点访问成本。
- 在**/proc/cpuinfo**中定位拓扑线索:虽无直接的“numa node”字段,但可用以下字段组合判断:
- physical id:物理插槽(Socket)编号;
- core id:物理核心编号;
- cpu cores:每个Socket的物理核心数;
- siblings:每个物理核心的超线程(逻辑CPU)数;
- processor:逻辑CPU编号。
结合这些字段可推断出CPU与Socket/Core/Thread的层级关系,再配合numactl确认节点归属。
CPUInfo字段与NUMA节点映射示例
- 典型字段含义与用途(示例命令:grep -E “physical id|core id|cpu cores|siblings|processor” /proc/cpuinfo):
- processor:逻辑CPU编号(如0…N-1),用于观察逻辑处理器列表;
- physical id:物理插槽编号,帮助识别Socket;
- cpu cores:单个Socket上的物理核心数;
- core id:该逻辑CPU在其Socket内的物理核心编号;
- siblings:同一物理核心的超线程兄弟线程数。
- 常见映射关系(以2路服务器、每路10核、开启超线程为例):
- 若每Socket ≈ 1 个 NUMA Node,则每个Node通常包含2 × cpu cores个逻辑CPU(因超线程);
- 同一物理核心的两个线程(同core id、不同processor)通常共享L1/L2,而同Node内所有逻辑CPU共享L3;
- 通过numactl可见如“node 0 cpus: 0-19;node 1 cpus: 20-39”的分配,从而把/proc/cpuinfo中的逻辑CPU归属到具体Node。上述规律有助于从CPUInfo推断NUMA布局。
性能影响与优化建议
- 影响:当任务与数据不在同一Node时会发生远程访存,常见现象是延迟上升、带宽受限,进而拖累吞吐与尾时延。
- 优化要点:
- 使用numactl进行CPU与内存亲和性绑定:如“numactl --cpunodebind=0 --membind=0 ./app”将进程绑定到Node 0的CPU与内存,尽量实现“本地分配、本地运行”。
- 启用或调优NUMA Balancing:通过“echo 1 > /proc/sys/kernel/numa_balancing”开启自动迁移页靠近使用它的CPU;对延迟敏感负载可结合应用特性选择开启或关闭。
- 监控numastat观察跨节点访问比例(如numa_hit、numa_miss),当远程访问偏高时优先调整线程绑定与内存分配策略。