Je sentais qu'Ubuntu fonctionnait un peu lentement, puis je suis allé voir les processus en cours d'exécution et j'en ai trouvé un qui utilisait quelque chose comme 50% de la CPU appelée ksoftirqd/0
.
Est-ce que quelqu'un sait ce que fait ce processus, pourquoi il utilise autant de ressources processeur et comment le rendre moins gourmand en ressources processeur?
Votre ordinateur communique avec les périphériques qui lui sont connectés via des IRQ (demandes d'interruption). Lorsqu'une interruption provient d'un périphérique, le système d'exploitation met son activité en pause et commence à l'adresser.
Dans certaines situations, les IRQ sont très rapides les unes après les autres et le système d’exploitation ne peut pas terminer la maintenance de l’une avant l’autre. Cela peut se produire lorsqu'une carte réseau haut débit reçoit un très grand nombre de paquets dans un délai très court.
Étant donné que le système d'exploitation ne peut pas gérer les IRQ au fur et à mesure de leur arrivée (car elles arrivent trop rapidement les unes après les autres), le système d'exploitation les met en file d'attente pour un traitement ultérieur par un processus interne spécial nommé ksoftirqd
.
Si ksoftirqd
prend plus qu'un pourcentage infime de temps processeur, cela signifie que la machine subit une charge d'interruption importante.
De la page de manuel, ksoftirqd
est un thread de noyau per-cpu qui s'exécute lorsque la machine subit une lourde charge d'interruptions logicielles.
Vous pouvez modifier un peu les paramètres en définissant quel processeur prend une certaine interruption. Pour cela, vous modifiez le contenu de /proc/irq/$interrupt_number/smp_affinity
. Vous pouvez obtenir une liste d'interruptions et leur signification en faisant:
cat /proc/interrupts
Le numéro dans smp_affinity
est une bitmap de CPU, représentée en code hexadécimal. Le bit le plus à droite est le moins significatif. Par exemple, mon système a 8 cœurs. Si je voulais utiliser uniquement les cœurs 1, 3 et 4, je définirais 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)
Personnellement, j'ai configuré n'importe quel processeur pour pouvoir recevoir l'interruption 29 (eth0 dans mon système à 8 cœurs) avec:
Sudo echo ff > /proc/irq/29/smp_affinity
ksoftirqd est un thread de noyau per-cpu qui s'exécute lorsque la machine subit une charge importante d'interruptions logicielles. Ainsi, il ne consomme pas votre unité centrale, mais réduit plutôt votre charge IRQ.