怎么理解Linux软中断?
1、什么是中断
中断表示我们请求操作硬件操作准备就绪了,例如从磁盘读取数据,我们知道CPU执行速度比磁盘执行速度快几个数量级,因此如果CPU每次check磁盘是否准备就绪了,那么系统的并发能力和性能会大大下降,但是采用中断方式,异步事件驱动方式来提升系统效率,首先会在驱动程序中嵌入中断程序,一旦磁盘准备就绪就会通过驱动程序发生一个中断请求操作,CPU立马停下手里的活来执行中断程序,该中断程序会从磁盘中读取数据到内存中。
2、如何避免丢失其他中断请求
一定要保证中断程序快速能处理,因为当CPU在处理中断时,是不能响应其他中断请求的,那么就会导致其他中断请求丢失
举个取外卖的例子:我们在app上点外卖,但是这个外卖不知道什么时候到,因为送外卖小哥一旦到了目的地就会放下外卖就走,这个时候你就会一次又一次的check外卖是否到了,然而你什么时候也干不了,仅仅在来来回回看外卖是否到了,导致浪费你的时间。
改进方式:如果换一种方式,你和外卖小哥约定一个通知方式,例如当外卖到了家门口小哥就打电话通知我,我就出去取外卖。 打电话就是一次中断请求,你就安心的干其他事情,静静等电话。 如果你点了两份外卖,当第一份外卖到了,小哥电话通知你,但是你在电话中沟通发票问题,这个时候第二份外卖到了另外一个小哥给你打电话发现占线,几次尝试后还是失败,这个时候外卖小哥就走了,导致丢失了这次外卖。
3. 解决
在电话中只回答好,然后沟通发票问题当面说,这个时候就可以接到另外小哥的电话。 所以中断请求分为两个阶段:
第一阶段(上半部请求):接受硬件中断请求(从硬件中取完数据后发送一次软断请求,复杂逻辑交给下半部分请求,),称为硬中断,特点是处理速度快
第二阶段(下半部请求): 内核线程接受到上半部分软中断请求,就会异步的继续执行上半部未完成的请求, 称为软中断,特点延迟执行
举个网络接受数据例子:
当网卡接收到数据时,首先会发送一个硬中断请求,这个时候CPU就会执行中断处理程序,快速将网卡中数据读取到内存中,完成后会发送一个软中断请求,下半部被软中断信号唤醒后就会按照网络协议栈将内存数据进行解析处理,最终递给应用程序。(处理期间还是可以响应其他硬中断请求的)
4、查看硬中断和软中断运行情况
可以查看 /proc/interrupts 和 /proc/softirq 文件
5. 问题:因为软中断出现的性能问题?
之前的c程序用到了别人写的动态库[如:lib.a],在物理机上,进程的cpu利用率在0%;而切换到了云服务器,即使空载,单进程的cpu利用率都有30%+。
以前没经验嘛,各种自查,无结果,但是自己的进程cpu利用率又那么高,总是不安心.
后来才通过vmstat 检测到系统的软中断每秒有100W+次.
最后各自百度,找人,才发现是那个动态库在处理网络收发消息时,使用了usleep(1)来休息,每次休息1纳秒,单次中断的耗时都不止1纳秒.
6. 分析
1) 检测是哪个线程占用了cpu: top -H -p XX 1 / pidstat -wut -p XX 12.在进程中打印各线程号. 找到是哪个线程.[ 此过程也可以省略 但可以快速定位线程]
3) 第一步应该可以判断出来中断数过高. 再使用 cat /proc/softirqs 查看是哪种类型的中断数过高.
4) 不知道perf report -g -p XX 是否可以定位到具体的系统调用函数.
5) 最终还是要查看源码,定位具体的位置,并加以验证.