it-swarm.com.de

Warum verwendet ksoftirqd / 0 die gesamte CPU?

Ich hatte das Gefühl, dass Ubuntu ein bisschen träge läuft, und dann habe ich mir die darauf ablaufenden Prozesse angesehen und einen gefunden, der ungefähr 50% der CPU verbraucht und ksoftirqd/0 heißt.

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

66
dasen

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 ksoftirqd in die Warteschlange gestellt.

Wenn ksoftirqd mehr als einen winzigen Prozentsatz der CPU-Zeit beansprucht, weist dies darauf hin, dass die Maschine unter hoher Interrupt-Last steht.

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

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

cat /proc/interrupts

Die Zahl in smp_affinity ist eine Bitmap von cpus, dargestellt in hexadezimalem Code. Das am weitesten rechts stehende Bit ist das am wenigsten signifikante. Zum Beispiel hat mein System 8 Kerne. Wenn ich nur die Kerne 1, 3 und 4 verwenden wollte, würde ich die smp_affinity auf 1a setzen:

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
21
Eduardo Bezerra

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

3
akshatj