温馨提示×

Linux CPUInfo的NUMA架构怎么理解

小樊
37
2025-12-13 02:28:21
栏目: 智能运维

Linux CPUInfo 中的 NUMA 架构理解

一、核心概念与工作原理

  • NUMA(Non-Uniform Memory Access)把 CPU 和内存划分为多个Node。每个 Node 拥有本地的 CPU 与内存,Node 之间通过高速互联(如 Intel UPI、AMD Infinity Fabric)相连。处理器访问本地内存更快,访问远端 Node 的内存更慢,且延迟/带宽差异是性能关键。Linux 提供 NUMA 感知调度NUMA BalancingNUMA-aware 分配策略来尽量把线程与数据放在同一 Node,降低跨 Node 访问开销。简单说:把“计算”和“数据”尽量放在同一 Node,性能更好。

二、CPUInfo 与拓扑层级对应关系

  • 在 Linux 的 CPU 拓扑里,层级从大到小通常是:Node → Socket → Core → Thread(逻辑处理器)
  • /proc/cpuinfo 中,常用字段含义:
    • processor:逻辑 CPU 编号(Thread)
    • physical id:物理插槽编号(Socket)
    • core id:物理核心编号(在同一 Socket 内唯一)
    • cpu cores:每个 Socket 的物理核心数
    • siblings:同一 Socket 的逻辑处理器数(通常 = core 数 × 每核线程数)
  • 小结:一个 Node 可包含1 个或多个 Socket;一个 Socket 包含多个 Core;一个 Core 开启超线程会产生多个 Thread。这些关系共同决定线程与内存的“远近”。

三、在 Linux 下快速查看与解读

  • 看全局拓扑与距离矩阵
    • 命令:numactl --hardware
    • 关注:available: N nodesnode distances(距离越小越快,跨 Node 通常更慢)
  • 看 CPU 与 Node 映射
    • 命令:lscpu
    • 关注:NUMA node(s)NUMA node0 CPU(s)Socket(s)Core(s) per socketThread(s) per core
  • 看每个 Node 包含哪些 CPU
    • 命令:ls /sys/devices/system/node/node*/cpucat /sys/devices/system/node/node0/cpulist
  • 用 /proc/cpuinfo 辅助判断
    • 统计逻辑 CPU:grep -c ^processor /proc/cpuinfo
    • 统计 Socket 数:grep 'physical id' /proc/cpuinfo | sort -u | wc -l
    • 统计每 Socket 的 CPU 数:grep 'physical id' /proc/cpuinfo | sort | uniq -c
  • 快速一致性校验
    • 恒等式:CPU(s) = Socket(s) × Core(s) per socket × Thread(s) per core
    • 示例:lscpu 若显示 CPU(s)=32、Socket(s)=2、Core(s) per socket=8、Thread(s) per core=2,则 2×8×2=32 一致。

四、从 CPUInfo 读懂 NUMA 布局的实用技巧

  • 识别 1 个 Node 是否等于 1 个 Socket:若 NUMA node(s)=2Socket(s)=2,常见是一一对应;但也可能出现 1 个 Node 包含 2 个 Socket(取决于 CPU/平台),此时应以 lscpuNUMA node0 CPU(s) 列表为准来确认映射关系。
  • 判断 超线程 是否开启:若 Thread(s) per core=2cpu cores 小于 siblings,说明同一物理核心有两个线程。
  • 快速定位某线程属于哪个 Node/Socket/Core
    • 先读 /sys/devices/system/node/nodeX/cpulist 确认 Node → CPU 映射
    • 再用 /proc/cpuinfo 中该 CPU 的 physical id(Socket)、core id(Core)、processor(Thread)确定层级。

五、性能提示与常见误区

  • 尽量让“线程运行位置”和“内存分配位置”在同一 Node,减少跨 Node 访存;必要时用 numactl 做 CPU/内存亲和绑定(如 --cpunodebind--membind)。
  • 观察 numastat 的跨 Node 访问指标,若远端访问偏高,考虑调整线程绑定或数据布局策略。
  • 开启或调优 NUMA Balancing/proc/sys/kernel/numa_balancing)可在运行时改善局部性,但也要结合应用特性评估。
  • 误区:把 Node 简单等同为 Socket;不同平台可能不同,务必以 lscpu/sysfs 的 Node-CPU 映射为准。

0