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如何彻底卸载JDK?

    在 Linux 系统中卸载 JDK(Java Development Kit)需要根据安装方式选择对应方法,以下是针对不同安装场景的详细步骤,操作前请务必备份重要数据,并确保拥有管理员权限(使用 sudo),卸载前的准备工作确认已安装的 JDK 版本终端执行以下命令查看已安装的 Java 环境:java -ve……

    2025年6月28日
    12400
  • Linux系统下whl文件如何正确安装?

    在Linux系统中,.whl文件是Python的wheel包格式,它是一种预编译的二进制分发格式,相比源码包(如.tar.gz)具有安装速度快、依赖处理更便捷的优势,正确安装.whl文件需要确保环境匹配、工具齐全,并处理可能出现的依赖或权限问题,本文将详细讲解在Linux系统中安装.whl文件的完整流程、注意事……

    2025年8月24日
    9200
  • 如何修改主机名linux

    Linux 中,可使用 hostnamectl set-hostname 新主机名 命令来

    2025年8月15日
    9000
  • Linux如何制作补丁?步骤与方法详解

    在Linux系统中,补丁(Patch)是一种记录文件修改的文本文件,用于在不同版本或环境间传递代码或配置的变更,通过补丁工具,开发者可以高效地应用或回滚修改,而无需手动逐行编辑文件,本文将详细介绍Linux环境下制作补丁的完整流程,包括常用工具、命令参数、实际操作示例及注意事项,补丁制作的基础工具与环境准备Li……

    2025年9月30日
    7200
  • 如何修改Linux内核版本号?具体操作步骤与注意事项详解?

    Linux内核版本号是标识内核迭代的重要信息,通常由主版本号(VERSION)、次版本号(PATCHLEVEL)、修订号(SUBLEVEL)和附加号(EXTRAVERSION)组成,格式如“5.15.0-rc1”,在开发、测试或特定场景下,可能需要修改内核版本号,例如自定义发行版、功能验证或版本标记,以下是详细……

    2025年9月29日
    7200

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信