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服务(如SSH、Apache、Nginx、MySQL等)的端口修改方法,涵盖配置文件编辑、服务重启、防火墙配置及SELinux策略调整等……

    2025年9月25日
    16500
  • Linux线程退出的常用方法有哪些?如何正确实现与避免问题?

    Linux线程作为操作系统调度的基本单位,其退出机制是并发编程中的核心环节,正确的线程退出不仅能确保程序逻辑的完整性,还能避免资源泄漏、死锁等问题,本文将详细解析Linux线程的多种退出方式、底层原理及注意事项,帮助开发者掌握线程退出的最佳实践,线程退出的核心方式及原理Linux线程(本质为轻量级进程)的退出主……

    2025年9月8日
    17900
  • 在Linux操作系统中,如何查看当前系统正在使用的DNS地址信息?

    在Linux系统中,DNS(域名系统)地址是网络通信的关键配置,它负责将域名解析为IP地址,查看当前系统使用的DNS地址有多种方法,适用于不同的Linux发行版和场景,以下是常用且详细的操作方式,使用nslookup命令查询DNS服务器nslookup(Name Server Lookup)是Linux中最基础……

    2025年8月25日
    16300
  • Linux如何清理cache缓存?内存释放操作方法详解?

    在Linux系统中,缓存(Cache)是内核为了提升系统性能而设计的内存管理机制,主要分为Page Cache(页面缓存,用于缓存文件数据)、dentry cache(目录项缓存,用于缓存文件名到inode的映射)和inode cache(索引节点缓存,用于存储文件元数据),这些缓存能有效减少磁盘I/O操作,提……

    2025年9月16日
    78500
  • linux如何转为汉语版

    Linux 系统中,可通过安装中文语言包来实现转为汉语版,具体因

    2025年8月17日
    16900

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信