Perché il processo ksoftirqd / 0 utilizza tutta la mia CPU?


67

Mi sentivo Ubuntu in esecuzione un po 'lento, quindi sono andato a vedere i processi in esecuzione su di esso, e ho trovato uno che utilizzava qualcosa come il 50% della CPU chiamato ksoftirqd/0.

Qualcuno sa cosa fa questo processo, perché utilizza così tanta CPU e come renderlo meno dispendioso in termini di CPU?

Risposte:


77

Il computer comunica con i dispositivi ad esso collegati tramite IRQ (richieste di interruzione). Quando un interrupt proviene da un dispositivo, il sistema operativo mette in pausa ciò che stava facendo e inizia a indirizzarlo.

In alcune situazioni, gli IRQ arrivano molto velocemente uno dopo l'altro e il sistema operativo non può terminare la manutenzione uno prima dell'arrivo di un altro. Ciò può accadere quando una scheda di rete ad alta velocità riceve un numero molto elevato di pacchetti in breve tempo.

Poiché il sistema operativo non è in grado di gestire gli IRQ quando arrivano (perché arrivano troppo velocemente uno dopo l'altro), il sistema operativo li mette in coda per l'elaborazione successiva mediante uno speciale processo interno denominato ksoftirqd.

Se ksoftirqdimpiega più di una piccola percentuale di tempo della CPU, ciò indica che la macchina è sottoposta a un pesante carico di interruzione.


22

Dalla pagina man, ksoftirqdè un thread del kernel per CPU che viene eseguito quando la macchina è sottoposta a un carico di interrupt soft.

Puoi modificare un po 'le impostazioni, definendo quale CPU raccoglie un certo interrupt. Puoi farlo modificando il contenuto di /proc/irq/$interrupt_number/smp_affinity. Puoi ottenere un elenco di interrupt e il loro significato facendo:

cat /proc/interrupts

Il numero in smp_affinityè una bitmap di cpus, rappresentata in codice esadecimale. Il bit più a destra è il meno significativo. Ad esempio, il mio sistema ha 8 core. Se volessi usare solo i core 1, 3 e 4, impostare smp_affinity su 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)

Personalmente, ho impostato qualsiasi CPU per poter prendere l'interrupt 29 (eth0 nel mio sistema a 8 core) con:

sudo echo ff > /proc/irq/29/smp_affinity

4

ksoftirqd è un thread del kernel per CPU che viene eseguito quando la macchina è sottoposta a un pesante carico di interrupt soft, quindi non consuma la CPU ma riduce il carico IRQ.


1
So che è askubuntu.com, ma su Raspberry Pi è esattamente l'opposto, ksoftirqd sta mangiando tutta la CPU con un carico IRQ intenso.
machineaddict

A quanto ho capito, ksoftirqd elabora i softirq posticipati (quando non possono essere elaborati abbastanza rapidamente). Quando ci sono molti softirq e / o consumano molto tempo CPU per l'elaborazione, allora ksoftirqd consuma molto tempo CPU.
pabouk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.