Linux环境下如何查询NUMA节点信息、状态及绑定配置方式?

在Linux系统中,NUMA(Non-Uniform Memory Access,非一致内存访问)是一种多处理器架构设计,其中每个CPU核心拥有本地内存节点,访问本地内存的速度快于访问其他节点的远程内存,了解系统的NUMA拓扑对优化性能(尤其是数据库、虚拟化等高负载场景)至关重要,本文将详细介绍Linux系统中查询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类似,但仅包含当前节点的内存数据,

linux 如何查询numa

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

通过对比不同节点的MemTotalMemFree,可判断内存分布是否均衡。

查看节点包含的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

输出示例:

linux 如何查询numa

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/下的文件(如meminfocpulist)获取节点级别的内存和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

(0)
酷番叔酷番叔
上一篇 2025年10月1日 21:04
下一篇 2025年10月1日 21:16

相关推荐

  • Linux如何设置子目录权限

    在Linux系统中,目录权限管理是保障系统安全与文件共享的核心环节,尤其对于多用户或多项目环境,合理设置子目录权限能有效避免数据泄露或误操作,本文将详细讲解Linux中设置子目录权限的方法,涵盖基础命令、高级技巧及常见场景,帮助用户全面掌握权限管理技能,Linux权限基础:理解用户、组与权限位Linux权限管理……

    2025年9月26日
    4200
  • linux中如何修改ip地址

    Linux 中,可通过 ip addr add 命令或修改网络配置文件(如 /

    2025年8月15日
    6000
  • Linux如何监控网络流量?实用方法与工具全解析指南?

    Linux作为服务器和开发环境的主流操作系统,网络流量监控是系统管理和性能优化的重要环节,通过监控网络流量,可以及时发现异常连接、带宽瓶颈、安全威胁(如DDoS攻击、数据泄露),并为网络扩容提供依据,本文将详细介绍Linux中常用的网络流量监控工具,包括其原理、使用方法及适用场景,帮助读者根据实际需求选择合适的……

    2025年9月18日
    5100
  • Linux无法识别U盘?解决方法大全

    U盘识别原理当U盘插入Linux系统时:内核检测:内核通过udev服务自动识别USB设备,加载驱动(如usb-storage),挂载点创建:系统通常将U盘挂载到/media/用户名/或/run/media/用户名/目录,文件系统支持:Linux支持FAT32/NTFS/exFAT等常见格式,若无法识别需额外工具……

    2025年7月17日
    6100
  • Linux环境下如何正确链接数据库?

    在Linux系统中连接数据库是开发运维中的常见需求,不同数据库(如MySQL、PostgreSQL、MongoDB、Redis等)的连接方式和工具略有差异,但核心步骤可归纳为“环境准备→安装客户端→配置连接→执行操作”,以下从通用流程到具体数据库类型展开说明,并附工具对比及常见问题解答,连接数据库前的准备工作确……

    2025年9月21日
    4300

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信