网卡中断平衡,网卡多队列

分析网络的工具

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 2

4) 查看中断情况

   watch -d -n 2 cat /proc/interrupts
   watch -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多个通路,分别管各种的中断,分散了负担


猜你喜欢

转载自blog.csdn.net/somyjun/article/details/79582377