3. Linux NUMA 检测:使用 lscpu、numactl --hardware、lstopo 查看 NUMA 拓扑
在进行 NUMA 亲和性优化之前,首要任务是准确掌握当前系统的 NUMA 拓扑结构。Linux 提供了多种工具来探测和展示 NUMA 节点、CPU 核心、内存区域以及它们之间的互连关系。本节将深入讲解三个最核心的命令行工具:lscpu、numactl --hardware 和 lstopo,帮助你从不同维度构建系统的 NUMA 视图。
3.1 使用 lscpu 快速获取 CPU 与 NUMA 节点信息
lscpu 是 Linux 系统中最常用的 CPU 信息查询工具,它从 /sys/devices/system/cpu/ 和 /proc/cpuinfo 中收集数据,并以清晰易读的格式输出。对于 NUMA 检测,我们重点关注其输出的 NUMA 节点数、每个节点的 CPU 列表以及内存信息。
关键字段解读:
- NUMA node(s): 系统物理 NUMA 节点的总数。
- NUMA node0 CPU(s): 属于节点 0 的 CPU 核心列表(如 0-15)。
- NUMA node1 CPU(s): 属于节点 1 的 CPU 核心列表(如 16-31)。
实战命令:
# 查看完整的 CPU 和 NUMA 拓扑信息
lscpu
# 以可解析的 JSON 格式输出,便于脚本处理
lscpu --json
典型输出示例(双路服务器):
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 32
On-line CPU(s) list: 0-31
Thread(s) per core: 2
Core(s) per socket: 8
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 85
Model name: Intel(R) Xeon(R) Gold 6248R CPU @ 3.00GHz
Stepping: 7
CPU MHz: 3000.000
BogoMIPS: 6000.00
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 1024K
L3 cache: 36608K
NUMA node0 CPU(s): 0-15
NUMA node1 CPU(s): 16-31
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single intel_ppin ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts pku ospke avx512_vnni md_clear flush_l1d arch_capabilities
快速判断: 如果
NUMA node(s) 显示为 1,说明系统未启用 NUMA 或为单节点架构;如果大于 1,则是一个典型的 NUMA 系统,需要关注跨节点内存访问的延迟问题。
3.2 使用 numactl --hardware 获取详细内存与节点距离
numactl 是 NUMA 管理的核心工具集,其 --hardware 选项提供了比 lscpu 更详细的硬件拓扑信息,包括每个节点的可用内存大小、空闲内存以及最重要的 节点间距离(Distance)矩阵。距离值反映了跨节点内存访问的相对延迟成本。
实战命令:
# 查看完整的 NUMA 硬件拓扑
numactl --hardware
典型输出示例:
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
node 0 size: 65536 MB
node 0 free: 48192 MB
node 1 cpus: 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
node 1 size: 65536 MB
node 1 free: 50234 MB
node distances:
node 0 1
0: 10 20
1: 20 10
距离矩阵解读:
- 对角线(0-0, 1-1): 值为 10,表示节点内访问的基准延迟。
- 非对角线(0-1, 1-0): 值为 20,表示跨节点访问的延迟是本地访问的 2 倍。
- 比值越大: 跨节点访问的惩罚越严重,优化亲和性的收益越高。
表格:numactl --hardware 关键字段说明
| 字段 | 含义 | 优化意义 |
|---|---|---|
available: 2 nodes |
系统可用的 NUMA 节点数 | 决定内存分配策略的复杂度 |
node 0 cpus |
节点 0 关联的 CPU 核心列表 | 绑定线程到指定节点 |
node 0 size |
节点 0 的总物理内存 | 评估内存容量是否充足 |
node 0 free |
节点 0 的可用内存 | 判断内存压力与分配倾向 |
node distances |
节点间相对延迟矩阵 | 量化跨节点访问代价 |
注意: 距离矩阵中的数值是相对值,并非纳秒或时钟周期的绝对延迟。不同厂商(Intel、AMD)的基准值可能不同,但比值关系始终有效。例如,AMD EPYC 处理器在 4 节点配置下,跨节点距离可能达到 30-40。
3.3 使用 lstopo 可视化硬件拓扑
lstopo 是 hwloc 软件包提供的强大工具,能够以图形化或文本化的方式展示完整的硬件拓扑树,包括 Socket、NUMA 节点、CPU 核心、缓存层次(L1/L2/L3)、PCIe 设备等。它是理解复杂 NUMA 系统最直观的工具。
安装 hwloc:
# Debian/Ubuntu
sudo apt-get install hwloc
# RHEL/CentOS
sudo yum install hwloc
# 验证安装
lstopo --version
实战命令:
# 以文本树状图输出
lstopo --no-io --no-legend
# 生成 PDF 图形文件(需要 Cairo 支持)
lstopo --output-format pdf output.pdf
# 生成 ASCII 图形
lstopo --of ascii
文本输出示例(简化):
Machine (125GB total)
Package L#0
NUMANode L#0 (P#0 64GB)
L3Cache L#0 (36MB)
L2Cache L#0 (1024KB) + L1dCache L#0 (32KB) + L1iCache L#0 (32KB) + Core L#0
PU L#0 (P#0)
PU L#0 (P#1)
L2Cache L#1 (1024KB) + L1dCache L#1 (32KB) + L1iCache L#1 (32KB) + Core L#1
PU L#1 (P#2)
PU L#1 (P#3)
... (更多核心)
Package L#1
NUMANode L#1 (P#1 61GB)
L3Cache L#1 (36MB)
L2Cache L#16 (1024KB) + L1dCache L#16 (32KB) + L1iCache L#16 (32KB) + Core L#16
PU L#16 (P#32)
PU L#16 (P#33)
... (更多核心)
实用技巧:
- 使用
lstopo --no-io过滤掉 PCIe 设备,只显示 CPU 和内存拓扑。 - 使用
lstopo --of fig生成 Xfig 格式,便于进一步编辑。 - 在无图形界面的服务器上,
lstopo --of ascii是最佳选择。
表格:三种 NUMA 检测工具对比
| 工具 | 输出格式 | 信息粒度 | 适用场景 |
|---|---|---|---|
lscpu |
文本 / JSON | CPU 与 NUMA 节点映射 | 快速概览、脚本解析 |
numactl --hardware |
文本 | 节点内存、距离矩阵 | 内存分配策略评估 |
lstopo |
图形 / 文本 / PDF | 完整硬件拓扑树 | 深度分析、文档记录 |
3.4 综合实战:构建系统 NUMA 拓扑档案
在实际性能调优项目中,建议将上述三个工具的输出整合成一份 NUMA 拓扑档案,作为后续所有优化决策的基准参考。以下是一个推荐的档案模板:
NUMA 拓扑档案模板:
# ============================================
# 系统 NUMA 拓扑档案
# 主机名: server-01
# 生成时间: 2025-01-15
# ============================================
# 1. CPU 与节点映射 (lscpu)
NUMA node(s): 2
NUMA node0 CPU(s): 0-15
NUMA node1 CPU(s): 16-31
# 2. 内存与距离矩阵 (numactl --hardware)
node 0 size: 65536 MB
node 1 size: 65536 MB
node distances:
node 0 1
0: 10 20
1: 20 10
# 3. 缓存层次 (lstopo)
Package L#0 -> NUMANode L#0 -> L3Cache (36MB) -> 8 Cores (16 PUs)
Package L#1 -> NUMANode L#1 -> L3Cache (36MB) -> 8 Cores (16 PUs)
# 4. 优化策略建议
# - 内存密集型进程绑定到 node0 (CPU 0-15)
# - 跨节点通信使用 MPI 或共享内存优化
# - 避免默认 interleave 策略
最佳实践:
- 将上述档案保存为
/etc/numa-topology.conf或纳入运维文档。 - 在部署新应用前,使用
numactl --hardware验证内存容量是否满足需求。 - 定期检查
lstopo输出,确保硬件拓扑未因 BIOS 设置或热插拔而变化。