¿Por qué el proceso ksoftirqd / 0 utiliza toda mi CPU?

67

Sentía que Ubuntu se estaba ejecutando un poco lento, y luego fui a ver los procesos que se ejecutaban en él, y encontré uno que usaba algo como el 50% de la CPU llamada ksoftirqd/0.

¿Alguien sabe qué hace este proceso, por qué está usando tanta CPU y cómo hacerlo menos intensivo de la CPU?

Dasen
fuente

Respuestas:

77

Su computadora se comunica con los dispositivos conectados mediante IRQ (solicitudes de interrupción). Cuando una interrupción proviene de un dispositivo, el sistema operativo detiene lo que estaba haciendo y comienza a abordar esa interrupción.

En algunas situaciones, las IRQ son muy rápidas una tras otra y el sistema operativo no puede finalizar el mantenimiento de una antes de que llegue otra. Esto puede suceder cuando una tarjeta de red de alta velocidad recibe una gran cantidad de paquetes en un corto período de tiempo.

Debido a que el sistema operativo no puede manejar las IRQ cuando llegan (porque llegan demasiado rápido una tras otra), el sistema operativo las pone en cola para su posterior procesamiento por un proceso interno especial denominado ksoftirqd.

Si ksoftirqdtoma más de un pequeño porcentaje de tiempo de CPU, esto indica que la máquina está bajo una carga de interrupción pesada.

Lucian Adrian Grijincu
fuente
22

Desde la página de manual, ksoftirqdhay un subproceso de kernel por CPU que se ejecuta cuando la máquina está bajo una carga pesada de interrupción suave.

Puede ajustar un poco la configuración, definiendo qué CPU recoge una interrupción determinada. Para ello, cambia el contenido de /proc/irq/$interrupt_number/smp_affinity. Puede obtener una lista de interrupciones y su significado haciendo:

cat /proc/interrupts

El número en smp_affinityes un mapa de bits de cpus, representado en código hexadecimal. El bit más a la derecha es el menos significativo. Por ejemplo, mi sistema tiene 8 núcleos. Si quisiera usar solo los núcleos 1, 3 y 4, establecería smp_affinity en 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, configuré cualquier CPU para poder recoger la interrupción 29 (eth0 en mi sistema de 8 núcleos) con:

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

ksoftirqd es un subproceso de kernel por CPU que se ejecuta cuando la máquina está bajo una carga pesada de interrupción suave, por lo que no se está comiendo su CPU sino que está reduciendo su carga IRQ.

akshatj
fuente
1
Sé que es askubuntu.com, pero en Raspberry Pi es todo lo contrario, ksoftirqd se está comiendo toda la CPU con una carga IRQ intensiva.
machineaddict
Según tengo entendido, ksoftirqd procesa softirqs pospuestos (cuando no pueden procesarse lo suficientemente rápido). Cuando hay muchos softirqs y / o consumen mucho tiempo de CPU para procesar, entonces ksoftirqd consume mucho tiempo de CPU.
pabouk