进程的不可中断状态是系统的一种保护机制,可以保证硬件的交互过程不被意外打断。所以短时间的不可中断状态是正常的,但是进程长时间都处在不可中断状态时,就要注意了。可以使用dstat、pidstat等工具,确认是不是磁盘I/O的问题,进而排查相关的进程和磁盘设备。
除了iowait,软中断CPU使用率升高也是常见的一种性能问题。
中断的含义是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求。
软中断
Linux将中断处理过程分成两个阶段,也就是上半部和下半部:
上半部用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感的工作。
下半部用来延迟处理上半部未完成的工作,通常以内核线程的方式运行。
查看软中断和内核线程
proc文件系统,是一种内核空间和用户空间进行通信的机制,可以用来查看内核的数据结构,或者用来动态修改内核的配置。其中:
/proc/softirqs提供了软中断的运行情况;
/proc/interrupts提供了硬中断的运行情况。
运行/proc/softirqs文件的内容,可以看到各种类型软中断在不同CPU上的累积运行次数:
软中断实际上是以内核线程的方式运行的,每个CPU对应一个软中断内核线程,这个软中断内核线程叫做 ksoftirqd/CPU编号。怎么查看这些线程的运行状况呢?用ps命令就可做到:
注意,这些线程的名字外面都有中括号,这说明ps无法获取它们的命令行参数。一般来说,ps的输出中,名字在中括号里的,一般都是内核线程。
小结
Linux中的中断处理程序分为上半部和下半部:
上半部对应硬件中断,用来快速处理中断。
下半部对应软中断,用来异步处理上半部未完成的工作。
Linux中的软中断包括网络收发、定时、调度、RCU锁等各种类型,可以通过查看/proc/softirqs来观察软中断的运行情况。