目录
- 什么是中断
- 什么是软中断
- 系统里有哪些软中断?
- 如何定位软中断 CPU 使用率过高的问题?
- 参考资料
什么是中断
中断是操作系统用来响应硬件设备请求的一种机制,操作系统收到硬件的中断请求,会打断正在执行的程序,然后调用内核中的中断处理程序来响应请求。
中断是一种异步的事件处理机制,可以提高系统的并发处理能力。
系统收到了中断请求会打断其他程序,所以中断的响应程序,要尽可能快的执行完,减少对正常程序运行的调度影响。并且,中断处理程序在响应中断时,会临时关闭中断,即如果系统当前的中断程序没执行完的话,其他中断无法被响应,即中断有可能会丢失,所以中断处理程序要短且快。
什么是软中断
Linux系统为了解决中断处理程序执行时间过长和中断丢失问题,将中断过程分为了两个部分:
- 上半部分:用来快速处理中断,一般会暂时关闭中断请求,主要负责处理和硬件紧密相关或者时间敏感的事情。
- 下半部分:用来延时处理上半部分未完成的工作,一般以内核线程的方式运行。
中断处理程序的上部分和下半部可以理解为:
- 上半部直接处理硬件请求,即硬中断,主要负责耗时短的工作,特点是快速执行;
- 下半部是由内核触发,即软中断,主要负责上半部未完成的工作,通常都是耗时比较长的事情,特点是延迟执行;
软中断不只是包括硬件设备中断处理程序的下半部,一些内核自定义事件也属于软中断,比如内核调度、RCU 锁(内核里常用的一种锁)等。
系统里有哪些软中断?
Linux 系统中,可以通过查看 /proc/softirqs
的 内容来知晓「软中断」的运行情况,以及 /proc/interrupts
的 内容来知晓「硬中断」的运行情况。
每一个 CPU 都有自己对应的不同类型软中断的累计运行次数,有 3 点需要注意下:
- 第一点,软中断一般包括了 10 个类型,分别对应不同的工作类型,比如
NET_RX
表示网络接收中断,NET_TX
表示网络发送中断、TIMER
表示定时中断、RCU
表示 RCU 锁中断、SCHED
表示内核调度中断。 - 第二点,要注意同一种类型的软中断在不同 CPU 的分布情况,正常情况下,同一种中断在不同 CPU 上的累计次数相差不多。
- 第三点,系统的中断次数的变化速率才是我们要关注的,我们可以使用
watch -d cat /proc/softirqs
命令查看中断次数的变化速率。
如何定位软中断 CPU 使用率过高的问题?
每一个 CPU 都有各自的软中断内核线程,我们还可以用 ps
命令来查看内核线程,一般名字在中括号里面到,都认为是内核线程。
如果在 top
命令发现,CPU 在软中断上的使用率比较高,而且 CPU 使用率最高的进程也是软中断 ksoftirqd
的时候,这种一般可以认为系统的开销被软中断占据了。
这时就可以分析是哪种软中断类型导致的,一般来说都是因为网络接收软中断导致的,如果是的话,可以用 sar
命令查看是哪个网卡的有大量的网络包接收,再用 tcpdump
抓网络包,做进一步分析该网络包的源头是不是非法地址,如果是就需要考虑防火墙增加规则,如果不是,则考虑硬件升级等。
参考资料
《小林 coding》
《深入理解计算机系统 第3版》