Solucionar el error «Demasiados archivos abiertos» en Linux

Muy a menudo ‘demasiados archivos abiertos‘ocurren errores en servidores Linux de alta carga. Significa que un proceso ha abierto demasiados archivos (descriptores de archivo) y no puede abrir nuevos. En Linux, los límites máximos de archivos abiertos se establecen de forma predeterminada para cada proceso o usuario y los valores son bastante pequeños.

En este artículo, aprenderemos cómo verificar el límite actual en el número máximo de archivos abiertos en Linux y cómo cambiarlo para todo el host, servicio individual o una sesión actual.

Error ‘Demasiados archivos abiertos’ y límites de archivos abiertos en Linux

En primer lugar, veamos dónde aparece el error «demasiados archivos abiertos». La mayoría de las veces ocurre en los servidores con un servidor web NGINX / httpd instalado o un servidor de base de datos (MySQL / MariaDB / PostgreSQL) cuando se lee una gran cantidad de registros. Por ejemplo, cuando un servidor web Nginx excede el límite de archivos abiertos, verá un error:

socket () failed (29: Too many open files) while connecting to upstream

Error de demasiados archivos abiertos en los archivos de registro de Linux

Con este comando, puede obtener la cantidad máxima de descriptores de archivo que su sistema puede abrir:

# cat /proc/sys/fs/file-max

El límite de archivos abiertos para un usuario actual es 1024. Puede verificarlo de la siguiente manera:

# ulimit -n

obtener el límite predeterminado de archivos abiertos en LInux

Hay dos tipos de límites: Difícil y Suave. Un usuario puede cambiar un límite suave (sin embargo, el valor suave no puede exceder el estricto). Solo un usuario con privilegios o root puede modificar un valor de límite estricto.

Para mostrar el límite suave, ejecute este comando:

# ulimit –nS

Para mostrar el valor del límite estricto:

# ulimit -nH

¿Cómo aumentar el límite máximo de archivos abiertos en Linux?

Para permitir que todos los servicios abran una gran cantidad de archivos, puede cambiar los límites en su sistema operativo Linux. Para que la nueva configuración sea permanente y evitar que se restablezca después de reiniciar el servidor o la sesión, debe realizar cambios /etc/security/limits.conf. Agrega estas líneas:

* hard nofile 97816
* soft nofile 97816

Si está utilizando Ubuntu, agregue también esta línea:

session required pam_limits.so

Este parámetro permite establecer límites de archivos abiertos después de la autenticación del usuario.

Después de realizar cualquier cambio, vuelva a cargar la terminal y verifique el valor de max_open_files:

# ulimit -n

97816

Aumento del límite de descriptores de archivos abiertos por servicio

Puede cambiar el límite de descriptores de archivos abiertos para un servicio específico, en lugar de para todo el sistema operativo. Tomemos apache como ejemplo. Abra la configuración del servicio usando systemctl:

# systemctl edit httpd.service

Agregue los límites que desee, por ejemplo:

[Service]
LimitNOFILE=16000
LimitNOFILESoft=16000

establecer LimitNOFILE para el servicio systemd

Después de realizar los cambios, actualice la configuración del servicio y reinícielo:

# systemctl daemon-reload
# systemctl restart httpd.service

Para asegurarse de que los valores hayan cambiado, obtenga el PID de servicio:

# systemctl status httpd.service

Por ejemplo, el PID de servicio es 3724:

# cat /proc/3724/limits | grep "Max open files”

obtener el máximo de archivos abiertos por proceso por PID

Por lo tanto, ha cambiado los valores del número máximo de archivos abiertos para un servicio específico.

¿Cómo establecer el límite máximo de archivos abiertos para Nginx y Apache?

Al cambiar el límite en la cantidad de archivos abiertos para un servidor web, también debe cambiar el archivo de configuración del servicio. Por ejemplo, especifique / cambie el siguiente valor de directiva en el archivo de configuración de Nginx /etc/nginx/nginx.conf:

worker_rlimit_nofile 16000
Al configurar Nginx en un servidor de 8 núcleos muy cargado con worker_connections 8192, debe especificar 8192 * 2 * 8 (vCPU) = 131072 en worker_rlimit_nofile.

Luego reinicia Nginx.

Para apache, cree un directorio:

# mkdir /lib/systemd/system/httpd.service.d/

Luego crea el archivo limit_nofile.conf:

# nano /lib/systemd/system/httpd.service.d/limit_nofile.conf

LimitNOFILE establece ulimiys para apache y nginx

Añádalo:

[Service]
LimitNOFILE=16000

No olvide reiniciar httpd.

Cambiar el límite de archivos abiertos para la sesión actual

Para cambiar los límites máximos de archivos abiertos para su sesión de terminal, ejecute este comando:

# ulimit -n 3000

Después de cerrar la terminal y crear una nueva sesión, los límites volverán a los valores originales especificados en /etc/security/limits.conf.

Para cambiar el valor general del sistema / proc / sys / fs / file-max, cambie el valor fs.file-max en /etc/sysctl.conf:

fs.file-max = 100000

Y aplícalo:

# sysctl -p

fs.file-max

En este artículo, hemos aprendido cómo resolver el problema cuando el valor del límite del descriptor de archivos abiertos en Linux es demasiado pequeño y hemos discutido algunas opciones para cambiar estos límites en el servidor.

 

Artículos Interesantes