为什么ksoftirqd/0进程占用了我的所有CPU资源?

我觉得Ubuntu运行有点慢,然后我查看了正在运行的进程,发现有一个进程占用了大约50%的CPU,名字叫做"ksoftirqd/0"。
有人知道这个进程是干什么用的吗?为什么它会占用这么多的CPU资源?还有没有办法减少它对CPU的使用呢?
3个回答

你的计算机通过中断请求(IRQs)与连接的设备进行通信。当设备发出中断时,操作系统会暂停当前的工作并开始处理该中断。
在某些情况下,IRQs会连续非常快地到达,以至于操作系统无法在一个中断到达之前完成对另一个中断的处理。这可能发生在高速网络卡在短时间内接收到大量数据包的情况下。
由于操作系统无法即时处理到达的IRQs(因为它们到达得太快),操作系统会将它们排队等待后续由一个名为“ksoftirqd”的特殊内部进程进行处理。
如果“ksoftirqd”占用了超过一小部分的CPU时间,这表明机器正承受着较重的中断负载。

从man页面来看,ksoftirqd是一个每个CPU的内核线程,在机器承受大量软中断负载时运行。
您可以通过定义哪个CPU接收特定中断来微调设置。您可以通过更改/proc/irq/$interrupt_number/smp_affinity文件的内容来实现此操作。您可以通过执行以下命令获取中断列表及其含义:
cat /proc/interrupts

smp_affinity中的数字是一个以十六进制代码表示的CPU位图。最右边的位是最低有效位。例如,我的系统有8个核心。如果我只想使用1、3和4号核心,我会将smp_affinity设置为1a
cpu_7 cpu_6 cpu_5 cpu_4 cpu_3 cpu_2 cpu_1 cpu_0
  0     0     0     1     1     0     1     0    = 0001 1010 = 1a (in hex)

个人而言,我设置了任何CPU都能够通过以下方式捕获中断29(在我的8核系统中是eth0):
echo ff | sudo tee /proc/irq/29/smp_affinity

ksoftirqd 是一个每个CPU的内核线程,在机器承受大量软中断负载时运行。因此,它并不占用你的CPU资源,而是减轻了IRQ负载。

2我知道这是askubuntu.com,但在树莓派上情况恰恰相反,ksoftirqd正在消耗所有的CPU资源,在高强度的中断请求负载下。 - machineaddict
据我了解,ksoftirqd进程会延迟处理软中断(当无法快速处理时)。当存在大量的软中断和/或它们消耗大量CPU时间进行处理时,ksoftirqd会消耗大量的CPU时间。 - pabouk - Ukraine stay strong
相反,软中断主要涉及CPU使用率,而硬(硬件)中断通常由DMA处理。 - Dmitry