软中断
软件中断上下文:softirq和tasklet
当一个系统调用准备返回到用户空间,或者一个硬件中断处理退出,任何被标记为pending
(等待)状态的软件中断
就会运行(通常软件中断是被硬件中断标记为等待执行状态的)。
include/linux/interrupts.h
列出了不同的软中断。其中一个重要的软中断是计时器软中断(include/linux/timer.h
):你可以用它来设置给定时间内调用功能。
软中断通常很难处理,因为一些软中断可以在多个CPU上并行运行。由于这个原因,tasklets(include/linux/interrupt.h
)经常使用:tasklets可以动态注册(意味着你想要多少就有多少),并且tasklet可以保证任何tasklet在任何时候只在一个CPU上运行,于此同时不同的tasklets可以并行。
ksoftirqd - softirq daemon
ksoftirqd
是一个在主机处于沉重的软中断负载情况下运行的针对每个cpu的内核线程。软中断通常服务于一个硬件中断的返回,但是有可能软中断会比它们所服务的对象更快地触发。如果一个软中断正在被处理时候又一次触发,则ksoftirq
服务就被触发在进程的上下文中处理这个软中断。如果ksoftirqd
占用了超出了CPU时间中少量百分比,就表明主机处于严重的软中断负载中。
检查方法
过查看/proc/stat文件,也可以得到中断数,及每个CPU core上的分布:
输出类似
一般情况下,中断总数略大于软中断数。
通过mpstat查看每个CPU core上softirq的开销:
输出可以看到所有CPU的负载
如果有非常集中的软中断,则需要处理
将软中断分布到多个cpu核
参考
Last updated