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
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
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
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”
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
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
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
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
Relacionados:
Contenido