Siguiente Anterior Contenido

8. Demonios del núcleo

Si ejecutas el comando ps aux verás algo parecido a esto:

USER       PID %CPU %MEM  SIZE   RSS TTY STAT START   TIME COMMAND
root         1  0.1  8.0  1284   536   ? S    07:37   0:04 init [2] 
root         2  0.0  0.0     0     0   ? SW   07:37   0:00 (kflushd)
root         3  0.0  0.0     0     0   ? SW   07:37   0:00 (kupdate)
root         4  0.0  0.0     0     0   ? SW   07:37   0:00 (kpiod)
root         5  0.0  0.0     0     0   ? SW   07:37   0:00 (kswapd)
root        52  0.0 10.7  1552   716   ? S    07:38   0:01 syslogd -m 0 
root        54  0.0  7.1  1276   480   ? S    07:38   0:00 klogd 
root        56  0.3 17.3  2232  1156   1 S    07:38   0:13 -bash 
root        57  0.0  7.1  1272   480   2 S    07:38   0:01 /sbin/agetty 38400 tt
root        64  0.1  7.2  1272   484  S1 S    08:16   0:01 /sbin/agetty -L ttyS1
root        70  0.0 10.6  1472   708   1 R   Sep 11   0:01 ps aux 

Esto es una lista de los procesos que están ejecutándose en el sistema. La información viene del sistema de archivos /proc que mencioné en la sección anterior. Fíjate en que init es el proceso número uno. Los procesos 2, 3, 4 y 5 son kflushd, kupdate, kpiod y kswapd. Aquí hay, sin embargo, algo extraño: fíjate en que tanto en la columna del tamaño de almacenamiento virtual (SIZE) com en la del tamaño de almacenamiento real (Real Storage Size, RSS) estos procesos tienen ceros. ¿Cómo puede un proceso no usar memoria?

Estos procesos son los demonios del núcleo. La mayor parte del núcleo no aparece para nada en la lista de procesos, y sólo pudes calcular cuánta memoria está usando restando la memoria disponible de la que tiene tu sistema. Los demonios del núcleo se arrancan tras init, por lo que reciben números de proceso igual que los procesos normales. Pero su código y sus datos vivne en la parte de memoria del núcleo.

Hay paréntesis rodeando las entradas de la columna de comando porque el sistema de archivos /proc no contiene información de línea de comandos para esos procesos.

¿Para qué sirven entonces esos demonios del núcleo? Las versiones anteriores de este documento tenían una petición de ayuda, ya que no sé mucho sobre los demonios del núcleo. La historia parcial que sigue se ha hecho con retazos de varias respuestas a aquella petición, por las que estoy sumamente agradecido. Agadeceré más pistas, referencias y correcciones.

La entrada y la salida se hacen a través de buffers de memoria. Esto permite que las cosas vayan más rápidas. Lo que los programas escriben se puede guardar en memoria, en un buffer, y luego escribirse en el disco en trozos más grandes y más eficientes. Los demonios kflushd y kupdate controlan esta tarea: kupdate se ejecuta periódicamente (¿unos 5 segundos?) para comprobar si hay buffers sucios. Si los hay, hace que kflushd los vierta al disco.

Muchas veces los procesos no tienen nada que hacer, y los que se están ejecutando muchas veces no necesitan todo su código y datos en memoria. Eso significa que podemos hacer mejor uso de nuestra memoria, desplazando las partes no usadas de los programas en ejecución a la(s) partición(es) de intercambio (swap) del disco duro. El movimiento de estos datos desde y hacia la memoria cuando se necesitan lo hacen kpiod y kswapd. Más o menos cada segundo, kswapd despierta para comprobar la situación de la memoria, y si se necesita algo en memoria que está en el disco o si no hay suficiente memoria libre, se llama a kpiod.

También puede haber un demonio kapmd ejecutándose en tu sistema si has configurado la gestión automática de energía en tu núcleo.

8.1 Configuración

El programa update te permite configurar kflushd y kswapd. Prueba update -h para conseguir información.

El espacio de intercambio se activa con swapon y se desactiva con swapoff. El script de init (/etc/rc.sysinit o /etc/rc.d/rc.sysinit) normalmente llama a swapon al arrancar el sistema. Me han dicho que swapoff va muy bien para ahorrar energía en los portátiles.

8.2 Ejercicios

Haz un update -d, fíjate en las jeremiadas de la última línea sobre "threshold for buffer fratricide" (umbral para el fratricidio de buffers). ¡He aquí un concepto intrigante, investígalo!

Cámbiate al directorio /proc/sys/vm y haz un cat de los archivos que hay allá. Intenta enterarte de algo.

8.3 Más información

"The Linux Kernel" de The Linux Documentation Project (ver la sección El núcleo de Linux para ver un url)

El código fuente del núcleo de Linux, ¡si te atreves! El Código de kswapd está en linux/mm/vmscan.c, y kflushd y kupdate están en linux/fs/buffer.c.


Siguente Anterior Contenido