![为什么 ksoftirqd/0 进程占用了我的所有 CPU?](https://linux22.com/image/956512/%E4%B8%BA%E4%BB%80%E4%B9%88%20ksoftirqd%2F0%20%E8%BF%9B%E7%A8%8B%E5%8D%A0%E7%94%A8%E4%BA%86%E6%88%91%E7%9A%84%E6%89%80%E6%9C%89%20CPU%EF%BC%9F.png)
我感觉 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 负载。