问题描述
我觉得Ubuntu运行有点迟钝,然后我去看看它上面运行的进程,并发现一个使用50%CPU的东西叫做ksoftirqd/0
。
有谁知道这个过程是做什么的,为什么它使用如此多的CPU以及如何减少它的CPU-intensive?
最佳解决方案
您的计算机通过IRQ(中断请求)与连接到它的设备进行通信。当来自设备的中断时,操作系统会暂停它正在执行的操作并开始寻址该中断。
在某些情况下,IRQ一个接一个地非常快,并且操作系统无法在另一个到达之前完成一个服务。当高速网卡在短时间内收到大量数据包时,就会发生这种情况。
因为操作系统在到达时无法处理IRQ(因为它们一个接一个地到达得太快),操作系统将它们排队等待以后由名为ksoftirqd
的特殊内部进程处理。
如果ksoftirqd
占用的CPU时间超过一小部分,则表示机器处于严重的中断负载下。
次佳解决方案
在手册页中,ksoftirqd
是一个per-cpu内核线程,当机器处于重载soft-interrupt负载时运行。
您可以通过定义哪个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是一个per-cpu内核线程,当机器处于繁重的soft-interrupt负载时运行。因此,它不会占用你的cpu而是减少你的IRQ负载。