在Linux系统中,NUMA(Non-Uniform Memory Access,非一致内存访问)是一种多处理器架构设计,其中每个CPU核心拥有本地内存节点,访问本地内存的速度快于访问其他节点的远程内存,了解系统的NUMA拓扑对优化性能(尤其是数据库、虚拟化等高负载场景)至关重要,本文将详细介绍Linux系统中查询NUMA信息的方法,包括基础命令、系统文件及专业工具的使用,并结合实例说明如何解读输出结果。
通过基础命令快速获取NUMA概览
使用lscpu
命令查看基础NUMA信息
lscpu
是Linux中查看CPU架构信息的常用工具,其输出包含NUMA节点相关的核心数据,执行以下命令:
lscpu
关键输出字段及含义如下:
- NUMA node(s):系统中的NUMA节点总数,NUMA node(s): 2”表示有2个节点。
- NUMA node0 CPU(s):节点0包含的CPU核心列表,如“0-7”表示核心0到7属于节点0。
- NUMA node0 CPU(s):节点1的CPU核心列表,若系统为双节点,通常会显示“NUMA node1 CPU(s): 8-15”。
- Vendor ID:CPU厂商信息(如GenuineIntel),用于确认是否支持NUMA。
示例输出:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 2
NUMA node(s): 2
NUMA node0 CPU(s): 0-3,8-11
NUMA node1 CPU(s): 4-7,12-15
上述输出表明系统有2个NUMA节点,每个节点包含8个CPU核心(共16核心),节点0和节点1分别对应物理插槽0和1的核心。
使用numactl
工具查看节点硬件信息
numactl
是专门用于NUMA管理的工具,可通过numactl --hardware
查看节点的内存和CPU分布情况:
numactl --hardware
输出会列出所有节点的内存总量、可用内存以及CPU核心列表,格式如下:
available: 2 nodes (0-1)
node 0 cpus: 0-3 8-11
node 0 size: 32768 MB
node 0 free: 31234 MB
node 1 cpus: 4-7 12-15
node 1 size: 32768 MB
node 1 free: 30876 MB
node distances:
node 0 1
0 10 20
1 20 10
- node X cpus:节点X包含的CPU核心。
- node X size:节点X的内存总量(MB)。
- node X free:节点X的可用内存(MB)。
- node distances:节点间的访问延迟权重,数值越小表示访问速度越快(如本地节点延迟为10,远程节点为20)。
通过系统文件系统获取详细NUMA数据
Linux内核将NUMA信息暴露在/sys/devices/system/node/
目录下,每个节点对应一个nodeX
子目录(X为节点编号),可通过读取其中的文件获取更详细的数据。
查看节点内存使用情况
进入目标节点目录(如/sys/devices/system/node/node0/
),读取meminfo
文件:
cat /sys/devices/system/node/node0/meminfo
输出与/proc/meminfo
类似,但仅包含当前节点的内存数据,
Node 0 MemTotal: 32767844 kB
Node 0 MemFree: 31234156 kB
Node 0 MemUsed: 1533688 kB
Node 0 HugePages_Total: 0
Node 0 HugePages_Free: 0
通过对比不同节点的MemTotal
和MemFree
,可判断内存分布是否均衡。
查看节点包含的CPU核心
在/sys/devices/system/node/nodeX/
目录下,cpulist
文件列出了节点X的所有CPU核心:
cat /sys/devices/system/node/node0/cpulist
输出示例:
0-3,8-11
与lscpu
中的NUMA node0 CPU(s)
一致,但此处直接提供核心列表,便于脚本处理。
查看NUMA节点间的距离矩阵
节点距离(NUMA distance)反映了访问不同节点内存的相对延迟,数据存储在/sys/devices/system/node/
目录下的distance
文件:
cat /sys/devices/system/node/distance
输出示例:
10 20
20 10
第一行和第一列分别对应节点0和节点1,对角线值(10)表示本地节点延迟,非对角线值(20)表示远程节点延迟,数值越大延迟越高。
使用专业工具进行NUMA性能分析
numastat
:查看节点内存分配统计
numastat
工具显示每个节点的内存分配和命中情况,可用于诊断内存访问热点:
numastat
输出示例:
node0 node1
numa_hit 12345678 12345678
numa_miss 1000000 1000000
numa_foreign 0 0
interleave_hit 100000 100000
local_node 12345678 12345678
other_node 1000000 1000000
- numa_hit:成功在本地节点分配的内存次数。
- numa_miss:需要在远程节点分配的内存次数(数值过高可能表明内存分配策略不合理)。
- local_node/other_node:本地/远程节点内存分配次数。
dmesg
:查看NUMA相关内核日志
系统启动过程中,内核会输出NUMA节点的初始化信息,可通过dmesg
过滤相关日志:
dmesg | grep -i numa
输出示例:
[ 0.000000] NUMA: Node0 0MB-32768MB
[ 0.000000] NUMA: Node1 32768MB-65536MB
[ 0.000000] NUMA: Node0 0MB-32768MB (2MB hole)
[ 0.000000] NUMA: Node1 32768MB-65536MB (2MB hole)
此信息可帮助确认节点的内存地址范围及是否存在空洞(内存未连续分配的区域)。
实际应用场景:进程与NUMA的绑定
在优化性能时,常需将进程绑定到特定NUMA节点,以减少远程内存访问,将进程PID=1234
绑定到节点0,并优先使用本地内存:
numactl --cpunodebind=0 --membind=0 -- 1234
--cpunodebind=0
:进程只能在节点0的CPU上运行。--membind=0
:进程的内存分配仅限于节点0。
查询Linux系统的NUMA信息可通过多种工具实现:
- 基础概览:
lscpu
快速查看节点和CPU分布,numactl --hardware
获取节点内存和距离矩阵。 - 详细数据:通过
/sys/devices/system/node/nodeX/
下的文件(如meminfo
、cpulist
)获取节点级别的内存和CPU信息。 - 性能分析:
numastat
统计内存分配命中情况,dmesg
查看内核初始化日志。
合理利用NUMA信息,可优化进程调度和内存分配策略,提升多路服务器在高负载下的性能。
相关问答FAQs
Q1: 如何查看当前进程的NUMA亲和性(即进程被绑定到哪些节点)?
A: 可通过numactl --show
查看当前进程的NUMA策略,或读取/proc/[PID]/status
文件中的Mems_allowed
字段(表示进程允许访问的内存节点掩码)。
numactl --show # 查看当前shell的NUMA策略 cat /proc/1234/status | grep Mems_allowed # 查看PID=1234的允许访问节点
Q2: 如果系统显示“NUMA node(s): 1”,是否说明系统不支持NUMA?
A: 不一定。“NUMA node(s): 1”表示系统只有一个NUMA节点,此时所有CPU和内存均属于同一节点,访问内存延迟一致,属于“平坦内存模型”(UMA),这种情况下,NUMA机制仍存在,但不会因跨节点访问产生性能损耗,真正的NUMA系统需至少2个节点,可通过numactl --hardware
确认是否存在节点间距离差异(如非对角线延迟值大于本地延迟)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/33997.html