it-swarm.cn

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

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

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

66
dasen

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

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

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

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

75
Lucian Adrian Grijincu

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

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

cat /proc/interrupts

smp_affinity中的数字是cpus的位图,以十六进制代码表示。最右边的位是最不重要的。例如,我的系统有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
21
Eduardo Bezerra

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

3
akshatj