systemadmin.es > Rendimiento > Problemas de memoria: “kernel: Out of Memory: Kill process”

Problemas de memoria: “kernel: Out of Memory: Kill process”

En sistemas con pocos recursos, como podría ser el caso de sistemas empotrados (embedded), no resulta inusual encontrar en el log del sistema mensajes similares a estos:

Sep 1 23:04:12 sid kernel: Out of memory: Killed process 15641 (named).
Sep 1 23:04:12 sid kernel: Out of Memory: Kill process 2415 (atd) score 31 and children.

El sistema se encuentra que no dispone de suficiente memoria, por lo que decide matar algun proceso para liberarla.

Mediante el sistema de ficheros /proc podemos ver cual sería el procesos “con más numeros” de ser matado y modificar esta puntuación.

Pongamos, por ejemplo, un proceso con PID 333, si consultamos el fichero /proc/333/oom_score medite cat:

# cat /proc/3/oom_score 
7044

Esto es mucho o poco? Depende, si es el numero mas alto va a ser el primer proceso a ser matado para liberar memoria, si por el contrario tiene muchos por delante va a costar mas que sea matado por falta de memoria.

Mediante el siguiente script podemos ver ordenados los procesos según su oom_score:

#!/bin/bash
for i in $(find /proc -maxdepth 2 -iname oom_score | cut -d '/' -f 3);
do 
   NAME="$(cat /proc/$i/cmdline | awk '{print $1}')"
   if [ -z "$NAME" ];
   then
      NAME=$(cat /proc/$i/status | grep Name | awk '{print $2}')
   fi;
   echo $(cat /proc/$i/oom_score) $NAME
done | sort -n

Por ejemplo la salida sería:

# ./oom_list
0 aio/0
0 ata/0
0 ata_aux
0 events/0
0 kacpid
0 kacpi_notify
0 kblockd/0
0 khelper
0 khubd
0 kjournald
0 kjournald
0 kpsmoused
0 kseriod
0 ksoftirqd/0
0 ksuspend_usbd
0 kswapd0
0 kthreadd
0 migration/0
0 pdflush
0 pdflush
0 rpciod/0
0 /sbin/udevd-d
0 scsi_eh_0
0 scsi_eh_1
0 xfsdatad/0
0 xfslogd/0
0 xfs_mru_cache
8 klogd-x
13 syslogd-m0
41 /usr/sbin/atd
83 crond
170 /usr/local/sbin/dovecot-F
334 /usr/local/bin/nagios/usr/local/etc/nagios.cfg
401 init
404 /usr/sbin/sshd
422 /usr/local/bin/freshclam-d
862 /usr/local/sbin/clamd
1489 /bin/bash./oom_list
1580 -bash
1860 /usr/local/bin/searchd--config/usr/local/etc/sphinx.conf--console--pidfile
1879 sshd:
2395 /bin/bash./oom_list
6212 /usr/sbin/named-unamed-t/var/named/chroot-f

En este caso vemos que el primero que mataria seria el servidor de nombres BIND (named). Podemos evitar esto mediante el fichero especial del /proc llamado oom_adj. Sus valores válidos van del -16 al +15, con el valor especial -17.

Por ejemplo, mediante el valor -17 podemos quitarlo de la lista de posibles procesos a matar:

# cat /proc/27917/oom_score 
6212
# echo "-17" > /proc/27917/oom_adj 
# cat /proc/27917/oom_score 
0

Mientras que mediante los valores del -16 al 15 podemos jugar con la puntuación del proceso:

# echo 1 > /proc/27917/oom_adj 
# cat /proc/27917/oom_score 
12424
# echo "-1" > /proc/27917/oom_adj 
# cat /proc/27917/oom_score 
3106

Este parámetro puede resultar muy útil para quitar de los candidatos a ser matados los procesos són críticos para el funcionamiento del sistema, puendo dejar en la lista de candidatos a otros no resultan imprescindibles.

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>