Answers:
您的计算机通过IRQ(中断请求)与其连接的设备进行通信。当中断来自设备时,操作系统将暂停正在执行的操作并开始处理该中断。
在某些情况下,IRQ接一个接一个地非常快地出现,并且操作系统无法在另一个到达之前完成一个服务。当高速网卡在短时间内收到大量数据包时,可能会发生这种情况。
因为操作系统无法在IRQ到达时对其进行处理(因为它们一个接一个地太快地到达),所以操作系统将它们排队,以供以后使用特殊的内部进程进行处理ksoftirqd
。
如果ksoftirqd
占用的CPU时间超过很小一部分,则表明计算机处于沉重的中断负载下。
在手册页中,ksoftirqd
是一个每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
ksoftirqd是每个CPU的内核线程,在计算机承受较大的软中断负载时运行,因此,它不是在消耗CPU而是减少IRQ负载。