文章目录
什么是中断?
什么是计算机的中断?
什么叫硬中断、什么叫软中断?
怎么查看硬中断、软中断
查看硬中断的运行情况 cat /proc/interrupts
查看软中断的运行情况 cat /proc/softirqs
怎么排查软中断过高的问题?
软中断注意事项
什么是中断?
举个现实生活中的例子:你正在学习,突然快递员给你打电话通知你快递到了。快递员打的电话就是中断信号,因为它中断了你的学习。你接完电话转头给女朋友说给她买的礼物到了,她就蹦跶蹦跶地去拿快递了,这个过程属于对中断信号的处理。给女朋友说完之后你继续学习,这叫中断的恢复。
什么是计算机的中断?
在计算机中,中断是系统响应硬件/软件设备消息的一种机制。系统运行时收到设备发来的信号,会打断当前进程,调用内核的中断处理程序来处理此信号,这个过程叫中断。
很明显,中断机制大大提高了系统的并发能力,但由于中断处理会打断当前程序的执行,所以中断处理越快越好。
要注意的是:中断处理程序在响应中断时,可能会"临时关闭中断",即中断处理过程中无法响应新的中断信号,意味着中断信号会无响应。以上面的收快递为例,快递员在给你电话的时候,别人就没办法再给你打电话了,所以接快递员电话的时间越短越好。
什么叫硬中断、什么叫软中断?
继续以上面的收快递为例:你正在学习,这叫当前进程;快递员给你打电话,这叫中断信号;
你接快递员电话,这叫中断处理的上半部分,可以理解为硬中断,时间很短;
你挂掉电话,通知给了女朋友,她下楼去拿快递,这叫中断处理的下半部分,可以理解为软中断,处理过程比较慢,唯一好处是你立马恢复了学习;
举个计算机的例子:系统正在运行,这个时候收到一条网络消息,网卡把消息通过DMA复制到内存的RingBuffer后会向CPU发出中断信号,CPU的处理也很简单,唤醒一个内核中断进程,中断进程ksoftirqd会根据RingBuffer中的数据的IP和端口号将其拷贝到对应socket的缓冲区并唤醒对应的进程处理。其中:
1. DMA向CPU发出的信号就叫硬中断信号,CPU对该信号的处理叫硬中断处理。
硬中断的特点是向CPU发出了中断,会打断CPU当前工作,CPU的处理也很快,唤醒软中断处理就不管了。
2. CPU唤醒内核中断程序,发出的信号就叫软中断信号,中断进程对RingBuffer消息的分析处理,唤醒对应的进程,叫软中断处理
软中断的特点是由中断进程ksoftirqd处理,比较复杂且耗时。其实不仅有网络消息,系统内部也会触发软中断,比如定时器触发,内核调度,RCU锁等等。
每个CPU都有自己专属的中断进程,名字为「ksoftirqd/CPU编号」,比如第0号CPU对应的软中断内核线程的名字是 ksoftirqd/0
怎么查看硬中断、软中断
查看硬中断的运行情况 cat /proc/interrupts
各个列的说明如下
第1列:逻辑中断号(linux分配的中断号)
第2~5列:每个逻辑CPU上中断的数
第6列:处理这个中断的中断控制器。在具有I/O APIC的系统上,大多数中断会列出IO-APIC-level或IO-APIC-edge,为自己的中断控制器
最后一列:与这个中断相关的设备名字,比如i8042一般表示键盘和鼠标,比如 virtio3-intput.0 和virtio3-output.0对应的是虚拟网卡eth3的接收和发送队列
查看软中断的运行情况 cat /proc/softirqs
第一列表中断类型
TIMER表定时器中断;NET_TX表络发送中断;NET_RX表网络接收中断;SCHED表示内核调度中断,RCU表RCU锁中断
第2~5列表各个CPU上发生的中断计数
注意:这些数值是系统运行以来的累计中断次数,数值的大小没什么参考意义,我们更关注的是这些中断的变化速率。所以使用命令 watch -d cat /proc/softirqs 来查看软中断的变化速度,如下图
使用命令 ps axu | grep ksoftirqd 来查看各个软中断线程,跟上面的 cat /proc/softirqs结果一一对应,每个ksoftirqd对应一个逻辑CPU
怎么排查软中断过高的问题?
用top命令查看整体系统的运行情况,再按数字1可以查看各个cpu的详细信息(由于我手头上没有软中断高的机器,这个图是网上找的)
上图可以看到两个cpu的运行情况,虽然总体使用率不高,但是都用在了si(软中断)上。
另外,也可以看到 CPU 使用率最高的进程也是软中断 ksoftirqd/0 和ksoftirqd/1,所以可以认为此时系统的开销主要耗在了软中断
再结合命令 watch -d cat /proc/softirqs 来查看各个软中断的变化速度,看变化最快的是哪种类型的软中断
如果是网络IO型服务器,那么 NET_TX 和 NET_RX类型的软中断会比较多,再结合tcpdump工具抓包来分析,是不是有非法IP,流量是否正常,而且可结合网关服日志,一起分析
软中断注意事项
默认情况下,单队列的网卡只有一个中断号,同一时刻只能绑定到一个CPU上。虚拟机上很容易出现机器有多个CPU,但只有一个CPU繁忙的情况。
解决办法有多种
1. 把网卡改为多队列网卡,虚拟机可通过镜像设置
2. 设置多CPU中断亲和性配置
3. 设置网卡负载均衡
具体办法参见这几篇博客
软中断竟然是可一个CPU使劲造? - 知乎
软中断处理方法_51CTO博客_软中断
【转】ksoftirqd进程耗尽单核100%si处理软中断导致性能瓶颈 - 简书