Warum verwendet ksoftirqd / 0 die gesamte CPU?

67

Ich hatte das Gefühl, dass Ubuntu etwas träge läuft, und dann ging ich zu den darauf laufenden Prozessen und fand einen, der so etwas wie 50% der CPU beanspruchte ksoftirqd/0.

Weiß jemand, was dieser Prozess macht, warum er so viel CPU verbraucht und wie man ihn weniger CPU-intensiv macht?

dasen
quelle

Antworten:

77

Ihr Computer kommuniziert mit den daran angeschlossenen Geräten über IRQs (Interrupt Requests). Wenn eine Unterbrechung von einem Gerät ausgeht, unterbricht das Betriebssystem die Ausführung und beginnt, diese Unterbrechung zu beheben.

In einigen Situationen kommen IRQs sehr, sehr schnell nacheinander und das Betriebssystem kann die Wartung nicht beenden, bevor ein anderer eintrifft. Dies kann passieren, wenn eine Hochgeschwindigkeitsnetzwerkkarte in einem kurzen Zeitraum eine sehr große Anzahl von Paketen empfängt.

Da das Betriebssystem die eingehenden IRQs nicht verarbeiten kann (weil sie zu schnell nacheinander eintreffen), werden sie vom Betriebssystem für die spätere Verarbeitung durch einen speziellen internen Prozess mit dem Namen in die Warteschlange gestellt ksoftirqd.

Wenn ksoftirqdmehr als ein winziger Prozentsatz der CPU-Zeit benötigt wird, bedeutet dies, dass die Maschine unter hoher Interrupt-Last steht.

Lucian Adrian Grijincu
quelle
22

Auf der Manpage ksoftirqdbefindet sich ein pro-CPU-Kernel-Thread, der ausgeführt wird, wenn die Maschine unter starker Soft-Interrupt-Last steht.

Sie können die Einstellungen etwas anpassen, indem Sie festlegen, welche CPU einen bestimmten Interrupt aufnimmt. Sie tun dies, indem Sie den Inhalt von ändern /proc/irq/$interrupt_number/smp_affinity. Sie können eine Liste der Interrupts und ihrer Bedeutung abrufen, indem Sie folgende Schritte ausführen:

cat /proc/interrupts

Die Zahl in smp_affinityist eine Bitmap von cpus, dargestellt in hexadezimalem Code. Das am weitesten rechts stehende Bit ist das niedrigstwertige. Zum Beispiel hat mein System 8 Kerne. Wenn ich nur die Kerne 1, 3 und 4 verwenden möchte, würde ich die smp_affinity auf Folgendes setzen 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)

Persönlich habe ich eine beliebige CPU eingerichtet, um Interrupt 29 (eth0 in meinem 8-Core-System) auszulösen:

sudo echo ff > /proc/irq/29/smp_affinity
Eduardo Bezerra
quelle
4

ksoftirqd ist ein pro-CPU-Kernel-Thread, der ausgeführt wird, wenn die Maschine unter starker Soft-Interrupt-Last steht. Es wird also nicht die CPU belastet, sondern die IRQ-Last reduziert.

akshatj
quelle
1
Ich weiß, es ist askubuntu.com, aber auf Raspberry Pi ist das Gegenteil der Fall, ksoftirqd frisst die gesamte CPU bei intensiver IRQ-Last.
Machineaddict
Soweit ich weiß, verarbeitet ksoftirqd verschobene Softirqs (wenn sie nicht schnell genug verarbeitet werden können). Wenn viele Softirqs vorhanden sind und / oder die Verarbeitung viel CPU-Zeit in Anspruch nimmt, verbraucht ksoftirqd viel CPU-Zeit.
Pabouk