Почему процесс ksoftirqd / 0 использует весь мой процессор?

67

Я чувствовал, что Ubuntu работает немного вяло, а затем я пошел посмотреть на процессы, запущенные на нем, и нашел тот, который использует что-то вроде 50% вызываемого процессора ksoftirqd/0.

Кто-нибудь знает, что делает этот процесс, почему он использует так много процессора и как сделать его менее загруженным?

Dasen
источник

Ответы:

77

Ваш компьютер связывается с подключенными к нему устройствами через IRQ (запросы прерывания). Когда от устройства исходит прерывание, операционная система приостанавливает работу и начинает обрабатывать это прерывание.

В некоторых ситуациях IRQ приходят очень быстро один за другим, и операционная система не может завершить обслуживание одного до того, как прибудет другой. Это может произойти, когда высокоскоростная сетевая карта получает очень большое количество пакетов за короткий промежуток времени.

Поскольку операционная система не может обрабатывать IRQ по мере их поступления (поскольку они приходят слишком быстро один за другим), операционная система ставит их в очередь для последующей обработки специальным внутренним процессом с именем ksoftirqd.

Если ksoftirqdпроцесс занимает больше крошечного процента процессорного времени, это означает, что машина находится под большой нагрузкой прерывания.

Люциан Адриан Гриджинку
источник
22

На странице man ksoftirqd- поток ядра для каждого процессора, который запускается, когда машина находится под большой нагрузкой программных прерываний.

Вы можете немного изменить настройки, определив, какой процессор подхватывает определенное прерывание. Вы делаете это, изменяя содержимое /proc/irq/$interrupt_number/smp_affinity. Вы можете получить список прерываний и их значение, выполнив:

cat /proc/interrupts

Число в smp_affinityпредставляет собой растровое изображение процессора, представленное в шестнадцатеричном коде. Самый правый бит является наименее значимым. Например, моя система имеет 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)

Лично я настроил любой процессор, чтобы он мог обрабатывать прерывания 29 (eth0 в моей 8-ядерной системе) с помощью:

sudo echo ff > /proc/irq/29/smp_affinity
Эдуардо Безерра
источник
4

ksoftirqd - это поток ядра для каждого процессора, который запускается, когда машина находится под большой нагрузкой мягкого прерывания. Поэтому он не съедает ваш процессор, а скорее снижает нагрузку на IRQ.

akshatj
источник
1
Я знаю, что это askubuntu.com, но на Raspberry Pi все наоборот, ksoftirqd съедает весь процессор при интенсивной загрузке IRQ.
Machineaddict
Как я понимаю, ksoftirqd обрабатывает отложенные программы (когда они не могут быть обработаны достаточно быстро). Когда имеется много программных пакетов и / или они занимают много процессорного времени для обработки, тогда ksoftirqd потребляет много процессорного времени.
Пабук