¿Qué es el error Too Many Open Files en Linux y por qué ocurre?
El error Too Many Open Files (Demasiados archivos abiertos) es un problema común en sistemas operativas basados en Linux. Ocurre cuando un proceso o el usuario del sistema alcanza el número máximo de descriptores de archivos permitidos simultáneamente. En Linux, prácticamente todo es un archivo (sockets de red, conexiones a bases de datos, tuberías y archivos físicos), por lo que las aplicaciones con alta concurrencia como servidores web, bases de datos o scripts de Node.js agotan este límite rápidamente.
Causas principales del límite de archivos abiertos
- Configuración predeterminada restrictiva de ulimit para usuarios y procesos en el sistema operativo.
- Fugas de recursos (resource leaks) en aplicaciones que abren conexiones o archivos y nunca los cierran adecuadamente.
- Demasiadas peticiones simultáneas manejadas por demonios o servicios como Nginx, Apache o MySQL sin la debida optimización.
Método 1: Aumentar el límite temporalmente con ulimit
Si necesitas una solución rápida para depurar o mantener un servicio funcionando mientras aplicas un cambio permanente, puedes usar el comando ulimit en la terminal.
- Abre tu terminal de Linux.
- Comprueba el límite actual ejecutando el siguiente comando:
ulimit -n - Establece un nuevo límite temporal (por ejemplo, 65535) escribiendo:
ulimit -n 65535
Nota: Este cambio solo afecta a la sesión actual de la terminal y se revertirá al reiniciar el sistema.
Método 2: Configurar permanentemente los límites en limits.conf
Para solucionar el problema de raíz y evitar que vuelva a suceder tras un reinicio, debes modificar el archivo de configuración de seguridad de PAM.
- Abre el archivo de configuración con permisos de superusuario:
sudo nano /etc/security/limits.conf - Agrega las siguientes líneas al final del archivo para aumentar los límites (soft y hard) para tu usuario o para todos (*):
* soft nofile 65535* hard nofile 65535 - Guarda los cambios y cierra el editor (en Nano presiona
Ctrl + O,Entery luegoCtrl + X).
Método 3: Ajustar systemd para servicios específicos
Si el error ocurre en un servicio gestionado por systemd (como MySQL, Nginx o un servicio personalizado), las configuraciones de limits.conf podrían ser ignoradas. Debes editar la configuración del servicio específico.
- Crea un directorio de anulación para tu servicio:
sudo systemctl edit nombre-del-servicio - Añade las siguientes líneas dentro del archivo de configuración:
[Service]LimitNOFILE=65535 - Guarda el archivo, recarga el daemon de systemd y reinicia el servicio con los comandos:
sudo systemctl daemon-reloadsudo systemctl restart nombre-del-servicio