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

注意

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

linux多队列网卡中断绑定,网卡中断及多队列 - osc_mzx9t9jk的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. 对linux的mv命令设计测试用例,测试用例中的细节 - 八音弦的个人空间 - OSCHINA - 中文开源技术交流社区...

    编写测试用例是在实际测试执行开始之前进行的软件测试活动的重要组成部分.因此,在编写测试用例时必须头脑清晰地理解需求.测试执行阶段的顺利程度主要取决于测试用例的编写质量,还取决于对需求的理解程度.理论上 ...

  2. linux 变量引用 和 变量的自动类型转换 c++,c++类型转换 - memristor的个人空间 - OSCHINA - 中文开源技术交流社区...

    C风格的强制类型转换(Type Cast) 不管什么类型的转换统统是:TYPE b = (TYPE)a. 缺点: 可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向非const ...

  3. 4核a5中断linux,中断与时钟 - osc_a5pzxo31的个人空间 - OSCHINA - 中文开源技术交流社区...

    0.序言 中断服务程序的执行并不存在于进程上下问中,要求中断服务程序的时间要尽量短.因此,Linux中断处理中引入上半部和下半部分离的机制.另外,内核对时钟的处理也是采用中断方式,而内核软件定时器最终 ...

  4. Linux环境变量隔代,python基础题 - osc_vwtuqll7的个人空间 - OSCHINA - 中文开源技术交流社区...

    47.metaclass作用?以及应用场景? metaclass,直译为元类,简单的解释就是:当我们定义了类以后,就可以根据这个类创建出实例, 所以:先定义类,然后创建实例.但是如果我们想创建出类呢? ...

  5. a33 linux内核启动网卡,a33核心板启动问题 - nevermore1981的个人空间 - OSCHINA - 中文开源技术交流社区...

    测试发现a33核心板有时无法正常启动,通过串口信息显示判断是uboot 对mmc初始化有时会出现问题: [      0.770][mmc]: ************Try MMC card 2** ...

  6. linux使用wdm设备驱动模型,驱动开发(WDM) - thomas_more的个人空间 - OSCHINA - 中文开源技术交流社区...

    windows 设备对象名称(内核对象必须命名才能被用户层访问产生句柄) \Driver\ 内核模式下访问 \.\ 用户模式下访问 winObj(symbollink设备名称的别名,各个节点查看)和d ...

  7. 私人linux远程连接,Linux远程连接 - osc_5g1gl9wp的个人空间 - OSCHINA - 中文开源技术交流社区...

    工具:虚拟机,xshell5 (个人推荐xshell5) 把虚拟机和xshell连接然后ping百度(这个百度ping的时候是拼音baidu) 修改网卡信息,利用系统命令修改 重启网卡服务 cento ...

  8. linux命令前期记不住,linux前期 - 浪里小白龙l的个人空间 - OSCHINA - 中文开源技术交流社区...

    Linux安装说明 1.4安装虚拟机  创建新的虚拟机 选择典型,点击下一步 选择第三项,稍后安装操作系统. 操作系统这里选择Linux ,因为我们的教材是centos 7 ,所以版本这个地方选择ce ...

  9. linux期中架构文档,Linux期中架构 - osc_jbr77wuo的个人空间 - OSCHINA - 中文开源技术交流社区...

    1    在构建完模板后  开启虚拟机后 需要再重启一次  以解决网卡不能看见的问题 ########################################add begin 2018-05 ...

  10. linux桌面环境日志,Linux桌面环境 - Zhenyu003的个人空间 - OSCHINA - 中文开源技术交流社区...

    早期的 Linux 系统都是不带界面的,只能通过命令来管理,比如运行程序.编辑文档.删除文件等.所以,要想熟练使用 Linux,就必须记忆很多命令. 后来随着 Windows 的普及,计算机界面变得越 ...

最新文章

  1. WordPress广告管理插件Adning Advertising1.5.8汉化版
  2. vue 项目上传到码云 解决push失败
  3. 二次封装dojo slider
  4. java 五大原则_面向对象五大原则
  5. 没想到裴勇俊留了一头长发。
  6. Awvs 12.x安装及使用教程
  7. vue图片裁剪:使用vue-cropper做图片裁剪
  8. oracle如何判断节假日,oracle function 用于判断是否为节假日
  9. 银行客户流失分析预测
  10. kubuntu14.10正式发布
  11. 双目相机标定Matlab
  12. TMS VCL UI Pack Crack,完整源代码
  13. EMCP 物联网云平台短信报警使用说明
  14. 5.网页中增加新的内容
  15. 坐标反算计算起始方位角_谁会坐标正算反算的公式,怎么计算两个坐标的方位角...
  16. 生活不可能像你想象的那么好,但也不会像你想象的那么糟。 ——莫泊桑《羊脂球》
  17. 嵩天老师python123测验7: 文件和数据格式化 (第7周)
  18. CSS3新特性-变量
  19. 基于java的果蔬在线销售系统/农产品销售系统
  20. 分布式文件存储系统Minio使用总结

热门文章

  1. 做一个网站要多少钱?
  2. win7 计算机刷新dns,win7系统刷新DNS缓存的操作方法
  3. 印象笔记 还回快捷_搭配这9款实用的第三方工具,小白也可以玩转印象笔记
  4. 〖Python 数据库开发实战 - MySQL篇⑤〗- 为大家推荐几款经典的数据库可视化工具
  5. 《第一行代码(第三版)》kotlin开发Android,学习笔记(进行中ing)
  6. 怎么利用微博进行营销?
  7. 如何判断自己的操作系统是32位还是64位?
  8. uniapp个人中心界面模板
  9. java .jar怎么打开_详解jar文件怎么打开
  10. 求极限简单总结 (基础)