¿Qué es el error 'Too Many Open Files' en Linux?
El mensaje Too Many Open Files (Demasiados archivos abiertos) es un error común en sistemas operativos basados en Linux y Unix. Ocurre cuando un proceso o el usuario del sistema intenta abrir más archivos o descriptores de red de los que el núcleo (kernel) le permite simultáneamente. En Linux, prácticamente todo es un archivo, incluidos los sockets de red, tuberías y directorios, por lo que este límite se alcanza fácilmente en servidores de alto tráfico.
Causas principales de los descriptores de archivos agotados
Existen diversas razones por las cuales tu servidor o aplicación puede quedarse sin descriptores de archivos disponibles:
- Fugas de recursos (resource leaks) en aplicaciones mal optimizadas que abren conexiones y nunca las cierran.
- Un límite predeterminado del sistema operativo (
ulimit) demasiado bajo para aplicaciones pesadas como bases de datos (MySQL, PostgreSQL) o servidores web (Nginx, Apache). - Tráfico web masivo que satura las conexiones simultáneas permitidas por proceso.
Método 1: Comprobar el límite actual y los archivos abiertos
Antes de aplicar cualquier solución, debes identificar qué usuario o proceso está sufriendo el bloqueo y cuáles son los límites actuales.
- Abre tu terminal SSH con privilegios de administrador.
- Ejecuta el siguiente comando para ver el límite actual del usuario en sesión:
ulimit -n - Para conocer el límite máximo global permitido por el sistema operativo, utiliza:
cat /proc/sys/fs/file-max - Si necesitas identificar qué proceso está consumiendo más descriptores, puedes usar el comando:
lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr | head -n 10
Método 2: Aumentar el límite de forma temporal con ulimit
Si necesitas una solución rápida y momentánea para verificar si el error desaparece sin reiniciar el sistema, puedes incrementar el límite mediante la terminal.
- Ejecuta el siguiente comando para aumentar el límite de archivos abiertos a 65535 para la sesión actual:
ulimit -n 65535 - Ten en cuenta que este cambio es efímero y se restablecerá en cuanto cierres la sesión o reinicies el servidor.
Método 3: Solución definitiva modificando limits.conf y sysctl.conf
Para solucionar el problema de manera permanente, es necesario configurar los límites del sistema a nivel de usuario y del kernel de Linux.
- Abre el archivo de configuración de límites con tu editor de texto favorito:
sudo nano /security/limits.confosudo nano /etc/security/limits.conf - Agrega las siguientes líneas al final del archivo para establecer los límites por usuario (reemplaza 'tu_usuario' por el usuario que ejecuta el servicio o usa un asterisco
*para todos):tu_usuario soft nofile 65535tu_usuario hard nofile 65535 - Guarda los cambios y sal del editor (en Nano presiona
Ctrl + O,Entery luegoCtrl + X). - Si utilizas un servicio gestionado por systemd (como Nginx o Node.js), también debes editar su archivo de servicio o agregar la directiva
LimitNOFILE=65535en la sección[Service]. - Finalmente, reinicia tu servidor o aplica los cambios reiniciando el servicio afectado para disfrutar de un sistema libre de errores.