分析网络的工具
1)发包程序
内核源代码在 net/core/pktgen.c,make menuconfig,make -j 8编译出pktgen工具,编译好的程序在目录samples/pktgen
2)执行发包
执行脚本 ./pktgen_sample03_burst_single_flow.sh,会列出相关的帮助信息下面两个命令是具体的执行发包命令
./pktgen_sample03_burst_single_flow.sh -i enp7s0 -s 64 -d 192.168.205.31 -m 40:8d:5c:d5:00:8b -t 2
./pktgen_sample04_many_flows.sh -i enp7s0 -s 3000 -d 192.168.205.31 -m 40:8d:5c:d5:00:8b -t 2
3) 用sar查看网络设备收发包的情况
sar -n DEV 24) 查看中断情况
watch -d -n 2 cat /proc/interruptswatch -d -n 2 cat /proc/softirqs
这两个命令可以查看硬中断、软中断的情况(中断是在哪个逻辑cpu上处理,以及中断的数量)
5) 查看cpu中断情况
mpstat -I SUM 2 每隔2秒,查看系统发生的所有中断数量mpstat -P ALL -u 2 每隔2秒,查看各个CPU上的中断、负载情况
mpstat -P 2 -u 2 每隔2秒,查看2号逻辑CPU上的中断、负载情况
sar -u ALL 2
6)查看网卡的capability
lspci -s 02:00.0 -vvv
问题:网卡软中断不平衡
在执行过程2),结合方法4)和5)发现,一个逻辑CPU核被软中断耗尽
mpstat -P ALL -u 2
解决思路
1)设置网卡多队列
查看网卡是否支持多队列,运行命令:ethtool -l eth0
[root@localhost ~]# ethtool -l eth0
Channel parameters for eth0:
Pre-set maximums:
RX: 0
TX: 0
Other: 0
Combined: 2 # 这一行表示最多支持设置2个队列
Current hardware settings:
RX: 0
TX: 0
Other: 0
Combined: 1 #表示当前生效的是1个队列
[root@localhost ~]# ethtool -L eth0 combined 2 # 设置eth0当前使用2个队列
设置成功后,测试发现,网卡rx/tx队列分别分配了不同的硬中断,这些硬中断分别分配到了不同的逻辑CPU核上(在irqbalance起作用的情况下,由它根据其规则分配),同样也分配了不同的软中断,这些软中断也分配到了不同的逻辑CPU核上。
2)用google的RPS解决网卡软中断平衡
如果物理网卡不支持网卡多队列,就可以设置网卡的RPS来平衡软中断(针对收包过程)
通过设置/sys/class/net/enp2s0f0/queues/rx-0/rps_cpus
RPS方法是平衡一个rx queue的软中断到不同逻辑CPU上,多队列是rx/tx多个通路,分别管各种的中断,分散了负担