要查看linux中网卡对应的numa节点,可通过/sys/class/net/网卡名/device/numa_node文件查询;再使用lscpu或/proc/cpuinfo确认cpu所属numa节点;随后可按以下步骤优化性能:1. 将网卡中断绑定到同numa节点的cpu;2. 调整rps/rfs设置确保软中断本地处理;3. 使用numactl或taskset限制关键进程运行在特定numa节点;4. bios中设置优先访问本地内存;最后通过perf、numastat及网络压测工具验证优化效果。
linux系统中,网络接口(NIC)与CPU的NUMA节点绑定情况对性能影响很大,尤其是高性能计算、虚拟化或大规模网络服务场景下。如果网卡所在的NUMA节点和处理它的CPU不在同一节点,就会出现跨节点访问,带来额外延迟和性能损耗。要优化这个问题,首先得知道怎么查看当前网卡绑定了哪个NUMA节点。
一、查看网卡对应的NUMA节点信息
在Linux中,每个网络接口都对应一个设备目录,通常位于 /sys/class/net/ 下。比如你的网卡是 eth0,你可以通过下面这个路径来查看它所属的 NUMA 节点:
cat /sys/class/net/eth0/device/numa_node
输出结果是一个数字,表示该网卡关联的 NUMA 节点编号。例如输出 0 表示这个网卡属于 NUMA 节点0。
如果你不确定网卡名字,可以用 ip link show 或者 ls /sys/class/net/ 来列出所有可用的网络接口。
小提示:有些老旧或不支持NUMA的硬件可能会返回 -1,这表示没有指定NUMA节点。
二、确认CPU所在的NUMA节点
光知道网卡在哪一个NUMA节点还不够,你还得看看你打算用来处理网络数据包的CPU是否也在同一个节点上。
可以使用 lscpu 命令来查看每个CPU核心所属的NUMA节点:
lscpu | grep 'core.*node'
或者更详细地查看每个CPU的信息:
cat /proc/cpuinfo | grep -E 'processor|node'
这样你就能看到各个CPU核心分别属于哪个NUMA节点了。理想情况下,处理某个网卡中断或软中断的CPU应该和该网卡处于同一个NUMA节点。
三、优化建议:减少跨节点访问
为了尽量避免跨节点访问带来的性能损耗,可以做以下几个方面的优化:
-
绑定网卡中断到同NUMA节点的CPU
修改 /proc/irq//smp_affinity_list,将网卡的中断绑定到与该网卡同NUMA节点的CPU上。 -
调整RPS/RFS设置
如果你在使用多队列网卡或者启用了RPS(Remote Packet Steering),确保软中断处理也尽量在同节点执行。 -
使用numactl或taskset启动关键进程
对于一些关键应用,比如DPDK程序、KVM虚拟机监控器等,可以通过 numactl –cpunodebind=0 –membind=0 your_program 来限制其运行在特定NUMA节点上。 -
bios设置优先选择本地内存访问
某些服务器主板的BIOS中提供了“NUMA node interleave”或“Memory Access Mode”选项,设为 Local 可以优先访问本地节点内存,有助于减少延迟。
四、验证是否实现了同节点访问
完成上述配置后,可以通过以下方式验证是否成功减少了跨节点访问:
当然,最直接的方式还是测试性能变化。比如跑一个高吞吐量的网络压测工具(如iperf3、netperf等),对比优化前后的吞吐量、延迟和CPU利用率。
基本上就这些操作。虽然看起来有点复杂,但只要一步步查清楚各个部件的位置,再合理安排它们之间的关系,就可以有效避免不必要的跨节点访问问题。