Introducción al Error Too Many Open Files en Linux
Uno de los problemas más molestos y comunes al administrar servidores Linux de alto rendimiento, bases de datos o aplicaciones web pesadas (como Nginx, Node.js o MySQL) es encontrarse con el mensaje de error Too many open files. Este fallo interrumpe el funcionamiento de los servicios y deniega el acceso a nuevos usuarios o conexiones. En este artículo te mostraremos exactamente por qué ocurre y cómo solucionarlo paso a paso.
Causas Principales del Problema
En los sistemas operativos basados en Linux, absolutamente todo se gestiona como si fuera un archivo: sockets de red, tuberías (pipes), directorios y archivos físicos. Por defecto, cada usuario y cada proceso tienen un límite estricto en la cantidad de descriptores de archivos (file descriptors) que pueden abrir simultáneamente. Las causas más frecuentes son:
- Aplicaciones mal optimizadas que abren conexiones a bases de datos o archivos sin cerrarlos adecuadamente (fugas de descriptores).
- Límites por defecto del sistema operativo demasiado bajos para entornos de producción con tráfico elevado.
- Servicios systemd que no heredan las configuraciones globales de límites de usuario.
Método 1: Comprobar los Límites Actuales y del Proceso
Antes de aplicar cualquier cambio, es fundamental diagnosticar cuál es el límite actual de tu sistema y qué proceso está consumiendo más recursos.
- Abre tu terminal SSH con privilegios de administrador.
- Ejecuta el siguiente comando para ver el límite global actual del sistema:
ulimit -n - Para identificar qué proceso específico está generando el problema, puedes revisar los registros del sistema con:
journalctl -xeo buscar en los logs de tu aplicación web.
Método 2: Aumentar el Límite Temporalmente con Ulimit
Si necesitas una solución rápida para restablecer un servicio caído de inmediato sin reiniciar el servidor, puedes modificar el límite de archivos abiertos para la sesión actual.
- Ejecuta el comando en tu terminal especificando el nuevo límite deseado:
ulimit -n 65535 - Reinicia tu servicio afectado (por ejemplo, Nginx o Apache) desde la misma sesión para que adopte el nuevo valor.
Método 3: Solución Definitiva Modificando limits.conf y Systemd
Para evitar que el problema vuelva a ocurrir después de reiniciar el servidor, debes modificar los archivos de configuración del sistema operativo.
- Edita el archivo de límites de seguridad con tu editor favorito:
sudo nano /etc/security/limits.conf - Agrega las siguientes líneas al final del archivo para aumentar los límites soft y hard para todos los usuarios (o reemplaza el asterisco por un usuario específico):
* soft nofile 65535* hard nofile 65535 - Si utilizas servicios gestionados por Systemd (como MySQL, PHP-FPM o Nginx), estos ignoran a veces el archivo anterior. Debes crear un directorio de configuración para el servicio:
sudo mkdir -p /etc/systemd/system/nombre-servicio.service.d/ - Crea y edita un archivo de anulación:
sudo nano /etc/systemd/system/nombre-servicio.service.d/override.conf - Añade las siguientes líneas dentro del archivo:
[Service]LimitNOFILE=65535 - Finalmente, recarga los daemons de systemd y reinicia el servicio afectado:
sudo systemctl daemon-reloadysudo systemctl restart nombre-servicio