root: fork failed: Cannot allocate memory

En uno de los servidores que administro me ha ocurrido que no podía entrar con SSH ni ejecutar procesos en remoto a través de un software que tiene un agente instalado, etc. dando el error root: fork failed: Cannot allocate memory.

Linux - cannot allocate memory

Sin embargo, la aplicación del usuario no se estaba viendo afectada.

Al prinipio pensé que habíamos alcanzado el límite de PIDs que el sistema puede crear pero no fue así, como veremos más tarde. No obstante, os dejo el procedimiento para aumentar este valor:

Aumentar el número de PIDs en Linux RedHat

Para aumentar el número de identificadores de proceso o PIDs, configuraremos el parámetro del kernel apropiado:

sysctl -w kernel.pid_max=1000000

[root ~]# grep -i pid /etc/sysctl.conf
kernel.pid_max=1000000
[root ~]#

El problema, es que he tenido que rebotar el servidor, ya no podía acceder a él.

Más información en la documentación oficial de RedHat:

Número Máximo de Ficheros Abiertos

Una vez que puede acceder al servidor, saqué algunas gráficas de procesos y ficheros abiertos. Lo que vi fue que unos pocos procesos abrieron muchos ficheros en el sistema, llegando a alcanzar el límite de 65536 (open files):

[root]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 579334
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root]#
Linux open files
Número de ficheros abiertos

La explicación de que el usuario root tuviera tantos ficheros abiertos es que el proceso de dockers abría muchos ficheros que son del usuario root, como librerías compartidas del sistema.

lsof

La solución pasa por limitar el número máximo de procesos y ficheros que puede abrir el proceso de dockers, garantizando el buen funcionamiento de la aplicación pero evitando que se colapse el sistema operativo.

Por lo tanto, podemos configurar el fichero /etc/security/limits.conf (RedHat 7) de la siguiente manera:

#Parametros para Dockers – Número de procesos corriendo
docker soft nproc 1024
docker hard nproc 10000
#Parametros para Dockers – Número de ficheros abiertos
docker soft nofile 15000
docker hard nofile 50000

Y no limitar los procesos o ficheros abiertos que puede abrir el root, con el fin de que podamos establecer una conexión SSH en el sistema, en caso de que tengamos que matar algún proceso de la aplicación que se haya desmadrado.

[root ]# grep -i ulimit /root/.bash_profile
ulimit -n 1000000
ulimit -u 1000000
[root]#

Te puede interesar

Limitar los recursos de memoria y CPU con parámetros del kernel de Linux

COMPÁRTEME

Deja un comentario