关于linux系统上软中断只用到一个cpu的问题
有些网卡的中断没有用到多个cpu,只用到一个CPU,导致那个cpu的软中断是100%,系统缓慢。
[root@web ~]# cat /proc/interrupts
CPU0 CPU1
0: 939474003 0 IO-APIC-edge timer
1: 7 2 IO-APIC-edge i8042
6: 2 3 IO-APIC-edge floppy
7: 0 0 IO-APIC-edge parport0
8: 1 0 IO-APIC-edge rtc
9: 0 0 IO-APIC-level acpi
12: 0 116 IO-APIC-edge i8042
15: 47539568 94428 IO-APIC-edge ide1
51: 4557238 12181 IO-APIC-level ioc0
59: 0 0 IO-APIC-level vmci
75: 101314205 0 PCI-MSI eth0
NMI: 0 0
LOC: 998113903 999592029
ERR: 0
MIS: 0
可以看到eth0只用到了cpu0,加外
mpstat -P ALL 1
top中的si
也可以查看cpu中断的使用情况。
解决这个问题,有两个办法:
1) 用irqbalance服务
irqbalance针对多核以及超线程采用共享缓存的系统只处理一次设备中断均衡,也即以静态方式分配各设备中断对应的CPU。在双核及单核系统中启动irqbalance,并不会影响系统资源,因为irqbalance在做完中断均衡相关判断、处理后即退出。
centos上自带了irqbanlance,安装上
chkconfig –level 345 irqbalance on
service irqbalance start
就行了。
当然这个办法不是最好的办法。irqbalance仅是一个通用方案,而不是最佳方案。
2) 修改内核参数/proc/irq/irq#/smp_affinity
[root@archimedes /proc]# cat /proc/irq/75/smp_affinity
00000001
表示eth0只用到了第一个cpu,可以修改这个参数,使它使用多个cpu。
参数:
Binary Hex
CPU 0 0001 1
CPU 1 0010 2
CPU 2 0100 4
CPU 3 1000 8
参数是一个10进制的值,cpu n == 2 的 n 次方。
如果用cpu0和cpu2:
Binary Hex
CPU 0 0001 1
+ CPU 2 0100 4
———————–
both 0101 5
全用:
Binary Hex
CPU 0 0001 1
CPU 1 0010 2
CPU 2 0100 4
+ CPU 3 1000 8
———————–
both 1111 f
修改:
echo f > /proc/irq/75/smp_affinity
需要注意的是:
有些网卡在PCI-MSI模式下修改这个参数不起作用,需要在内核启动时加上pci=nomsi参数。网上看主要是Broadcom的网卡有这个问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)