为什么ksoftirqd / 0进程使用我的所有CPU?

我觉得Ubuntu运行有点迟钝,然后我去看看它上面运行的进程,发现一个使用50%CPU的东西叫做ksoftirqd/0

有谁知道这个过程是做什么的,为什么它使用如此多的CPU以及如何降低CPU密集度?

您的计算机通过IRQ(中断请求)与连接到它的设备进行通信。 当来自设备的中断时,操作系统会暂停它正在执行的操作并开始寻址该中断。

在某些情况下,IRQ一个接一个地非常快,并且操作系统无法在另一个到达之前完成一个服务。 当高速网卡在短时间内收到大量数据包时,就会发生这种情况。

因为操作系统在到达时无法处理IRQ(因为它们一个接一个地到达得太快),操作系统将它们排队等待以后由名为ksoftirqd的特殊内部进程处理。

如果ksoftirqd占用的CPU时间超过一小部分,则表示机器处于严重的中断负载下。

在手册页中, ksoftirqd是一个per-cpu内核线程,当机器处于严重的软中断负载时运行。

您可以通过定义哪个cpu获取某个中断来稍微调整设置。 您可以通过更改/proc/irq/$interrupt_number/smp_affinity的内容来完成此/proc/irq/$interrupt_number/smp_affinity 。 您可以通过执行以下操作获取中断列表及其含义:

 cat /proc/interrupts 

smp_affinity的数字是cpus的位图,以hex代码表示。 最右边的位是最不重要的。 例如,我的系统有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):

 sudo echo ff > /proc/irq/29/smp_affinity 

ksoftirqd是一个per-cpu内核线程,当机器处于严重的软中断负载时运行。因此,它不会占用你的cpu而是减少你的IRQ负载。