网卡中断及多队列

网卡中断及多队列

作者:cb9e58ff5a37
链接:https://www.jianshu.com/p/e64d8750ab1c

=============================

1、判断当前系统环境是否支持多队列网卡,执行命令:

lspci -vvv

如果在Ethernet项中。含有MSI-X: Enable+ Count=9 Masked-语句,则说明当前系统环境是支持多队列网卡的,否则不支持。

2、ethtool -l eth0命令可以看到eth0网卡是否支持多队列,最多支持多少、当前开启多少

3、设置网卡当前使用多队列。运行命令:ethtool -L eth0 combined <N> N为要使能的队列数

4、要确保多队列确实生效,可以查看文件:

# ls /sys/class/net/eth0/queues/

rx-0 rx-2 rx-4 rx-6 tx-0 tx-2 tx-4 tx-6
rx-1 rx-3 rx-5 rx-7 tx-1 tx-3 tx-5 tx-7

如上,如果rx数量是设定值,则正确。

X86系统采用中断机制协同处理CPU与其他设备工作。长久以来网卡的中断默认由cpu0处理,在大量小包的网络环境下可能出现cpu0负载高,而其他cpu空闲。后来出现网卡多队列技术解决这个问题。

通过命令cat /proc/interrupts 查看系统中断信息,应该是长下面这个样子。第一列是中断号,比如eth0对应的中断号是24,后面是每个cpu的中断数。

[~]# cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3
  0:        124          0          0          0   IO-APIC-edge      timer
  1:          0          3          2          1   IO-APIC-edge      i8042
  8:          0       1434          2        224   IO-APIC-edge      rtc0
  9:          0          0          0          0   IO-APIC-fasteoi   acpi
 11:          0          7          8          6   IO-APIC-fasteoi   uhci_hcd:usb1
 12:          0         40         38         37   IO-APIC-edge      i8042
 14:          0          0          0          0   IO-APIC-edge      ata_piix
 15:          0       1827         36        221   IO-APIC-edge      ata_piix
 24:          0          0          0          0   PCI-MSI-edge      eth0
 25:          0    7725709       1718       1717   PCI-MSI-edge      eth1
...

中断绑定

我们可以绑定中断号与处理CPU之间的关系,Linux系统用irqbalance服务优化中断分配,它能自动收集数据,调度中断请求。为了了解中断绑定,我们把irqbalance服务关掉,手工调整绑定关系。

/proc/irq/{IRQ_ID}/smp_affinity,中断IRQ_ID的CPU亲和配置文件,16进制
/proc/irq/{IRQ ID}/smp_affinity_list,10进制,与smp_affinity相通,修改一个相应改变。

[ ~]# cat /proc/irq/24/smp_affinity
0001
[ ~]# cat /proc/irq/24/smp_affinity_list
0
#上面表示0001对应cpu0,可以直接修改绑定关系
[ ~]# echo 4 > /proc/irq/24/smp_affinity
[ ~]# cat /proc/irq/24/smp_affinity_list
2
#此时中断号24对应的处理CPU为cpu2
[ ~]# mpstat -P ALL 1 1
Linux 2.6.32-504.23.4.el6.x86_64    03/02/2017  _x86_64_    (10 CPU)

03:04:22 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:04:23 PM  all    1.51    0.00    2.41    0.00    0.00    2.91    0.00    0.00   93.17
03:04:23 PM    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:04:23 PM    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:04:23 PM    2   15.62    0.00   25.00    0.00    0.00   30.21    0.00    0.00   29.17
03:04:23 PM    3    0.00    0.00    0.99    0.00    0.00    0.00    0.00    0.00   99.01

也可以通过查看/proc/interrupts,此时压测eth0,发现只有cpu2处理的中断数增加。

[ ~]# cat /proc/interrupts | grep 24:
 24:    5249258          0    1304158    2074483   PCI-MSI-edge      eth0
[ ~]# cat /proc/interrupts | grep 24:
 24:    5249258          0    1516771    2074483   PCI-MSI-edge      eth0

亲缘性文件smp_affinity是16进制掩码,可以配置一个中断号和多个cpu绑定,单测试结果并没有将中断自动分配到多个CPU。

[ ~]# echo 11 > /proc/irq/24/smp_affinity
[ ~]# cat /proc/irq/24/smp_affinity
0011
#16进制11,表示二进制0000,0000,0001,0001,代表cpu0, cpu4
[ ~]# cat /proc/irq/24/smp_affinity_list
0,4

网卡多队列

RSS(Receive Side Scaling)是网卡的硬件特性,实现了多队列,可以将不同的流分发到不同的CPU上。

通过将中断号绑定到多CPU并没有真正实现中断的分配。支持RSS的网卡,通过多队列技术,每个队列对应一个中断号,通过对每个中断的绑定,可以实现网卡中断在cpu多核上的分配。

[ ~]# ls /sys/class/net/eth0/queues/
rx-0  rx-2  rx-4  rx-6  tx-0  tx-2  tx-4  tx-6
rx-1  rx-3  rx-5  rx-7  tx-1  tx-3  tx-5  tx-7

#eth0都多个队列,/proc/interrupts截取一段,长下面的样子
  95:          1          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth0
  96:        161    2175974    2046333    4627889   74362460          0          0          0          0          0          0          0          0          0       8340   39971887     111995        452          0          0          0          0          0          0   PCI-MSI-edge      eth0-TxRx-0
  97:         18   27180874    5828740    3181746    1673296          0          0          0          0          0          0          0          0          0          0    7981462          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth0-TxRx-1
  98:       4255   20655084    5985539    3175797    2903580          0          0          0          0          0          0          0          0          0          0   11786675       2485          0          0          0          0          0          0          0   PCI-MSI-edge      eth0-TxRx-2
  99:         26   14077166    9826129    3129857    3050199          0          0          0          0          0          0          0          0          0          0   15454795          0       1252          0          0          0          0          0          0   PCI-MSI-edge      eth0-TxRx-3
 100:         80   13133364    9766015    2728504    3768519          0          0          0          0          0          0          0          0          0          0   14714758          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth0-TxRx-4
 101:         18   11351909   15644814    3581350    3822988          0          0          0          0          0          0          0          0          0          0   13055960          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth0-TxRx-5
 102:       2962    7283522   25860133   11902055    4747040          0          0          0          0          0          0          0          0          0          0    9042550        200          0          0          0          0          0          0          0   PCI-MSI-edge      eth0-TxRx-6
 103:         18   12908096   12612013    3411346    5934445          0          0          0          0          0          0          0          0          0          0   10059911          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth0-TxRx-7

这样就可以通过对eth0的不同队列的中断号进行绑定。

RPS/RFS

RSS需要硬件支持,在不支持RSS的环境中,RPS/RFS提供了软件的解决方案。RPS(Receive Packet Steering)是把一个rx队列的软中断分发到多个CPU核上,从而达到负载均衡的目的。RFS(Receive Flow Steering)是RPS的扩展,RPS只依靠hash来控制数据包,提供负载平衡,但是没有考虑到应用程序的位置(指应用程序所在CPU)。RFS目标是通过指派应用线程正在运行的CPU处理中断,增加数据缓存的命中率。

[ ~]# echo 7 > /sys/class/net/eth0/queues/rx-0/rps_cpus
#开启rps,16进制7代表二进制111,对应CPU0-2

[ ~]# mpstat -P ALL 1 1
03:32:42 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:32:43 PM  all    1.72    0.00    2.63    0.00    0.00    3.43    0.00    0.00   92.22
03:32:43 PM    0    7.95    0.00   12.50    0.00    0.00   10.23    0.00    0.00   69.32
03:32:43 PM    1    2.88    0.00    8.65    0.00    0.00   14.42    0.00    0.00   74.04
03:32:43 PM    2    5.94    0.00    5.94    0.00    0.00   10.89    0.00    0.00   77.23
03:32:43 PM    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
此时进行压测结果显示软中断基本分配到cpu0-2

注意

由于设备比较多,测试数据太长,上面的数据都是经过编辑,改动的地方不影响对中断、绑定和多队列的相关验证。

============= End

原文地址:https://www.cnblogs.com/lsgxeva/p/11124762.html

时间: 2024-10-10 10:41:41

网卡中断及多队列的相关文章

密集负载下的网卡中断负载均衡smp affinity及单队列RPS

原文 http://rfyiamcool.blog.51cto.com/1030776/1335700     简单的说就是,每个硬件设备(如:硬盘.网卡等)都需要和 CPU 有某种形式的通信以便 CPU 及时知道发生了什么事情,这样 CPU 可能就会放下手中的事情去处理应急事件,硬件设备主动打扰 CPU 的现象就是硬件中断. 关于SMP IRQ affinity? 新的内核, Linux改进了分配特定中断到指定的处理器(或处理器组)的功能. 这被称为SMP IRQ affinity, 它可以控

网卡中断负载篇~

网卡中断条件一般为:网卡型号为82576或者其他型号.作用:做网卡中断以优化服务器性能.1.检查命令:lspci |grep Eth2.cat /proc/interrupts |grep eth2以下图片是已做过优化的网卡 中断配置:根据图二查看到的0-7的对应网卡数值进行配置echo "1" >/proc/irq/91/smp_affinityecho "2" >/proc/irq/92/smp_affinityecho "4"

转帖-Linux网卡中断使单个CPU过载

Linux内核在性能方面已经经历了很长一段时间的考验,尤其是2.6/3.x内核.然而,在高IO,尤其是网络方面的情况下,对中断的处理可能成为问题.我们已经 在拥有一个或多个饱和1Gbps网卡的高性能系统上发现过这个问题,近来在有许多小包并发(大约10000packets/second)超载的虚拟机上 也发现了这个问题. 原因很清楚:在最简单的模式中,内核通过硬件中断的方式来处理每个来自于网卡的包.但是随着 数据包速率的增长,带来的中断渐渐超过了单个cpu可处理的范围.单cpu概念很重要,系统管理

查看网卡中断绑定情况的脚本

#!/usr/bin/ruby cpunum = ` cat /proc/cpuinfo |grep processor|wc -l`.to_i  before = {} while true   file = File.readlines('/proc/interrupts')   puts "ifname        cpu0       cpu1     cpu2    cpu3    cpu4    cpu5    cpu6    cpu7    cpu8    cpu9    cpu

网卡中断绑定CPU脚本

#!/bin/bashset_affinity(){if [ $VEC -ge 32 ]thenMASK_FILL=""MASK_ZERO="00000000"let "IDX = $VEC / 32"for ((i=1; i<=$IDX;i++))doMASK_FILL="${MASK_FILL},${MASK_ZERO}"done let "VEC -= 32 * $IDX" MASK_TMP=$

网卡中断负载均衡

http://novoland.github.io/%E7%BD%91%E7%BB%9C/2014/07/26/%E7%BD%91%E5%8D%A1%E4%B8%AD%E6%96%AD%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html http://www.simlinux.com/2017/02/28/net-softirq.html https://blog.packagecloud.io/eng/2016/06/22/monitoring-tuning-li

网卡多队列

网卡多队列 内容来自:https://help.aliyun.com/document_detail/52559.html 单个 CPU 处理网络中断存在瓶颈,您可以将 ECS 实例中的网卡中断分散给不同的 CPU 处理.经测试,在网络 PPS 和网络带宽的测试中,与 1 个队列相比,2 个队列最多可提升 50% 到 1 倍,4 个队列的性能提升更大. 支持多队列的 ECS 实例规格 各种实例规格对网卡多队列的支持现状,详见 实例规格族. 支持多队列的镜像 目前,由阿里云官方提供的公共镜像中,支

为什么使能RPS/RFS, 或者RSS/网卡多队列后,QPS反而下降?

http://laoar.github.io/blog/2017/05/07/rps/ TL;DR RPS 即receive side steering,利用网卡的多队列特性,将每个核分别跟网卡的一个首发队列绑定,以达到网卡硬中断和软中断均衡的负载在各个CPU上. 他要求网卡必须要支持多队列特性. RPS receive packet steering 他把收到的packet依据一定的hash规则给hash到不同的CPU上去,以达到各个CPU负载均衡的目的. 他只是把软中断做负载均衡,不去改变硬

linux内核对网卡驱动多队列的支持

linux的招牌就是它强大的网络功能,稳定,高效,能随着现实的日新月异而日趋完善.众所周知,linux的网卡由结构体net_device表示,一 个该结构体对应一个可以调度的数据包发送队列,注意,这里不谈数据包接收,数据包的实体在内核中以结构体sk_buff表示,这样的话,上述文字就可以用 以下图示来表示: 所谓的网卡对发送数据包的调度指的是多个数据包共享一个网卡的规则,当然就要拥有一系列的约定,比如区分数据包的优先级,区分数据包的类型,内核根据不同的调度策略来对不同的数据包进行排队,然后按照队