《服务器测试百日学习计划——Day18:NUMA实战进阶,用 numactl、numastat 看懂内存分布》

张开发
2026/6/8 10:01:29 15 分钟阅读
《服务器测试百日学习计划——Day18:NUMA实战进阶,用 numactl、numastat 看懂内存分布》
大家好我是 JACK本篇是服务器测试百日学习计划 Day18。Day17 我们已经把 NUMA 的基础概念讲清楚了什么是本地节点、什么是远端节点、为什么同一台机器里“总量一样”不代表“性能一样”。但真正到了现场问题不会问你“NUMA 的定义是什么”而是会直接砸过来为什么这台机器 CPU 没满业务却跑不快为什么 NVMe 压测参数一样结果有时高有时低为什么设备明明正常延迟和 p99 却总在抖这些问题最后常常会收敛到同一件事设备、线程、内存到底有没有跑在同一个合理的 NUMA 路径上。所以 Day18 不再讲抽象概念直接上实战。本文结合我今天在一台真实 4 NUMA 服务器上的现场日志带你走一遍完整判断链路。一、NUMA 实战到底在看什么很多人学 NUMA 时只记住一句话本地访问快远端访问慢。这句话没错但太粗了。真正做整机测试、存储测试、网络测试时你要看的不是“快不快”三个字而是下面这条链路有没有对齐设备在哪个节点 线程在哪个节点 内存落在哪个节点如果三者对齐结果通常更稳定如果三者分裂问题就会先体现在延迟、抖动和尾延迟上。所以 NUMA 实战的核心不是背概念而是学会一个固定动作先看进程在哪再看内存在哪再看设备在哪最后再看结果稳不稳。二、第一步先把机器拓扑看清楚现场第一条命令很简单lscpu|grep-inuma真实输出如下NUMA 节点4NUMA 节点0 CPU0-63 NUMA 节点1 CPU64-127 NUMA 节点2 CPU128-191 NUMA 节点3 CPU192-255这一眼先看出三件事这台机器有4个 NUMA 节点每个节点64个逻辑 CPU如果一个线程跑到192-255之间它当前就更靠近node3这一步只是认地图还不能判断性能路径是否合理。要继续往下看细节。三、第二步用numactl -H看节点容量和距离系统没装numactl时先安装yuminstallnumactl然后执行numactl-H这次现场机器的关键输出如下available:4nodes(0-3)node0size:515918MBnode0free:514292MBnode1size:515401MBnode1free:513148MBnode2size:515051MBnode2free:512328MBnode3size:516086MBnode3free:513082MB以及最关键的距离矩阵nodedistances:node01230:101235371:121037402:353710123:37401210这个输出怎么解读1. 每个节点内存容量基本均衡四个节点都在515 GB左右说明这台机器没有明显的内存容量倾斜。2. 本地访问成本最低本地访问代价是10这就是最优路径。3. 相邻半边比跨半边便宜比如0 - 1 122 - 3 12这说明相邻节点还算近。但如果跨到远端0 - 2 351 - 3 40代价就明显上去了。这意味着这台机器上 NUMA 不对齐不是小损失而是可能直接影响压测结果。四、第三步numastat -p不是随便看一个 PID很多人一开始学 NUMA最容易犯的错是直接跑numastat-p1这次我现场也演示了一遍。PID 1看到的是systemd不是你的测试进程。这个结果没有任何资格代表你的 fio 路径。所以正确顺序应该是1. 先找真正的fiops-ef|grep[f]io真实输出里能看到root56734... fio--nameseq_read_nvme6n1... root56736... fio--nameseq_read_nvme6n1...后面写压测阶段还能看到root58008... fio--nameseq_write_nvme6n1... root58010... fio--nameseq_write_nvme6n1...这时候你不能只看父进程要优先盯真正吃 CPU、吃内存的那个工作子进程比如58010。2. 再看它的内存分布numastat-p58010关键输出如下Per-node process memory usage(in MBs)forPID58010(fio)Node0Node1Node2Total0.820.000.06Node3Total Total14.5215.40这个结果很清楚fio的内存主要落在node3其他节点只有少量零散分布也就是说从内存角度看这个进程已经明显偏向node3。五、第四步看 fio 线程当前实际跑在哪个 CPU 上继续执行ps-opid,psr,comm-p58010真实输出PID PSR COMMAND58010227fio前面我们已经知道node3 CPU 192-255所以PSR227说明这个 fio 线程当前就在node3上跑到这里已经拿到了两个非常关键的证据fio 内存主要在node3fio 线程当前也在node3接下来只差最后一步看这块盘是不是也在node3。六、第五步把 NVMe 设备节点查实这次压测的目标盘是nvme6n1。先看设备路径readlink-f/sys/class/block/nvme6n1/device真实输出/sys/devices/pci0000:c7/0000:c7:04.0/0000:ca:00.0/nvme/nvme6这说明这块盘对应的 PCI 设备地址是0000:ca:00.0然后继续查cat/sys/class/block/nvme6n1/device/numa_nodecat/sys/bus/pci/devices/0000:ca:00.0/numa_node lspci-sca:00.0-vv|grep-inuma现场输出分别是3和NUMA node:3这一步的意义就是彻底坐实nvme6n1设备归属node3七、真实闭环这次 fio 路径是对齐的把所有证据串起来机器有4个 NUMA 节点fio 工作子进程58010当前跑在node3numastat -p 58010显示内存主要落在node3nvme6n1对应设备0000:ca:00.0也在node3所以这次压测的路径是CPU node3 内存 node3 设备 node3这就是比较理想的 NUMA 放置。注意这不代表结果一定“特别高”但它至少说明一件非常重要的事这组 fio 数据没有被明显的跨 NUMA 路径污染。换句话说如果这时候BW、IOPS、lat还不正常你就更应该去查盘本身状态压测参数IRQ 热点后台业务干扰固件 / 驱动而不是先怀疑“是不是 NUMA 没对齐”。八、第六步怎么判断 fio 结果是否真的可信NUMA 对齐只是前提接下来还要看结果本身是否合理。判断顺序我建议固定成下面这套1. 顺序场景先看BW顺序读写主要看带宽不要拿顺序读去和随机 IOPS 做横比2. 随机场景先看IOPS4K 随机读写主要看 IOPS 和延迟带宽只是换算结果不是主角3. 混合场景一定要看R/W双向不能只看readwrite必须一起看否则很容易误判4. 平均值不够盯住p99平均时延只能看大概真正决定体验的经常是p99、p99.95. 多跑几次看稳定性如果 NUMA 已经对齐但结果还是大幅波动就要继续排查后台业务干扰盘共享IRQ 热点队列深度设置固件或驱动异常九、Day18 里最容易犯的 6 个错这次现场实操下来我觉得最值得记住的不是命令而是下面这些坑。1. 把numastat -p 1当成测试进程分析这是最常见的入门错误。PID 1是systemd不是你的 fio。2. 只看 fio 父进程不看真正工作的子进程真正跑业务的通常是子进程。3. 只看设备在哪不看进程在哪设备在node3线程跑在node1一样是跨 NUMA。4. 只看 CPU不看内存线程在本地不代表内存也在本地。5. 只看平均值不看尾延迟平均值好看不代表p99就一定健康。6. 混合读写场景只看一边这个坑我们前一天刚修过。混合读写如果只盯着read很容易把结果看偏。十、今天最值得背下来的一页命令如果你后面现场还要快速判断 NUMA直接记这组# 1. 看机器拓扑lscpu|grep-inuma numactl-H# 2. 找真实 fio 进程ps-ef|grep[f]io# 3. 看 fio 内存分布numastat-pfio_pid# 4. 看 fio 当前跑在哪个 CPUps-opid,psr,comm-pfio_pid# 5. 看设备属于哪个 NUMAreadlink-f/sys/class/block/nvme6n1/devicecat/sys/class/block/nvme6n1/device/numa_nodecat/sys/bus/pci/devices/0000:ca:00.0/numa_node lspci-sca:00.0-vv|grep-inuma记忆顺序还是那句先看进程在哪再看内存在哪再看设备在哪最后再看结果稳不稳。十一、Day18 结论NUMA 学到 Day18重点已经不是“知道它是什么”而是“会不会在现场把它用起来”。这次真实日志给出的结论非常干净fio 进程在node3fio 内存在node3NVMe 设备也在node3所以这次 fio 压测的 NUMA 路径是合理的这组结果就有资格作为基线去看。到这里Day18 真正建立起来的能力其实是这 5 个看懂机器 NUMA 拓扑找到进程真实落点找到进程内存分布找到设备归属节点判断 fio 结果是否具备解释价值这一步学会之后后面继续看 NVMe、网卡、NPU、IRQ、整机性能判断速度都会快很多。

更多文章