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

59

Sentivo che Ubuntu stava funzionando un po 'lento, e poi sono andato a vedere i processi in esecuzione su di esso, e ho trovato uno che utilizzava qualcosa come il 50% della CPU chiamata ksoftirqd/0 .

Qualcuno sa cosa fa questo processo, perché usa così tanta CPU e come renderlo meno impegnativo per la CPU?

    
posta dasen 17.10.2010 - 06:55

3 risposte

65

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

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

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

Se ksoftirqd occupa più di una piccola percentuale del tempo della CPU, indica che la macchina è sottoposta a un intenso carico di interrupt.

    
risposta data Lucian Adrian Grijincu 17.10.2010 - 13:37
17

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

È possibile modificare leggermente le impostazioni, definendo quale CPU preleva un determinato interrupt. Puoi farlo cambiando 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 è un bitmap di cpus, rappresentato in codice esadecimale. Il bit più a destra è il meno significativo. Ad esempio, il mio sistema ha 8 core. Se volessi utilizzare solo i core 1, 3 e 4, imposterei 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 configurato una CPU per poter intercettare l'interrupt 29 (eth0 nel mio sistema 8-core) con:

sudo echo ff > /proc/irq/29/smp_affinity
    
risposta data Eduardo Bezerra 13.07.2012 - 16:12
2

ksoftirqd è un thread del kernel per-cpu che viene eseguito quando la macchina è sottoposta a un pesante carico di interrupt morbido. Quindi, non sta mangiando la CPU, ma piuttosto riducendo il carico IRQ.

    
risposta data akshatj 17.10.2010 - 12:37

Leggi altre domande sui tag