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

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

我感觉 Ubuntu 运行得有点慢,然后我去查看其上运行的进程,发现有一个进程使用了​​大约 50% 的 CPU 容量ksoftirqd/0

有谁知道这个过程是做什么的、为什么它占用这么多的 CPU 以及如何降低它的 CPU 占用率?

答案1

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

在某些情况下,IRQ 会接二连三地快速出现,操作系统无法完成一个 IRQ 的服务,然后另一个 IRQ 就会到来。当高速网卡在短时间内收到大量数据包时,就会发生这种情况。

由于操作系统无法在 IRQ 到达时对其进行处理(因为它们一个接一个到达得太快),因此操作系统将它们排队以便由名为 的特殊内部进程稍后处理ksoftirqd

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

答案2

从手册页来看,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

答案3

ksoftirqd 是每个 CPU 的内核线程,它在机器承受繁重的软中断负载时运行。因此,它不会消耗您的 CPU,而是减少您的 IRQ 负载。

相关内容