Demasiados archivos abiertos: cómo encontrar al culpable


69

Cuando ejecuto tail -f filename, recibí el siguiente mensaje:

tail: inotify cannot be used, reverting to polling: Too many open files

¿Es eso un problema potencial?

¿Cómo diagnostico qué es responsable de todos los archivos abiertos? Tengo una lista de procesos sospechosos, pero si no resultan ser los culpables, serían útiles las instrucciones que no dependen de saber qué proceso verificar.


1
¿Ha aumentado el número de descriptores de archivo disponibles a través de ulimit?
Ignacio Vazquez-Abrams

2
@ IgnacioVazquez-Abrams Eso puede ser útil para otros usuarios, pero para mí sería como tratar el síntoma en lugar de la enfermedad.
Andrew Grimm

Si bien no está equivocado, a veces las aplicaciones tienen razones legítimas para tener muchos archivos abiertos.
Ignacio Vazquez-Abrams

Respuestas:


72

Puede usar lsof para comprender quién está abriendo tantos archivos. Por lo general, es un servidor (web) que abre tantos archivos, pero lsof seguramente lo ayudará a identificar la causa.

Una vez que entiendes quién es el malo que puedes

Si el resultado de lsof es bastante grande, intente redirigirlo a un archivo y luego abra el archivo

Ejemplo (puede que tenga que hacer Ctrl+ Cel primer comando)

lsof > ~/Desktop/lsof.log
cat ~/Desktop/lsof.log | awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -20
vim ~/Desktop/lsof.log

37
Para los perezosos:lsof | awk '{ print $2; }' | uniq -c | sort -rn | head
itsadok

1
Recibí el mismo error y usar ulimit no funciona. El comando tail -F aún devuelve el error. Aumenté el límite de 1024 a 3000, así que imagino que tengo suficiente espacio para entonces ... ¡Creo que tendría que reiniciar!
Alexis Wilke

15
Encontré útil la línea de itsadok, pero creo que debería ordenar primero (porque uniqsolo funciona con líneas adyacentes), ejecutar uniq, luego ordenar nuevamente. Por lo tanto lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head.
Tyler Collier

19
Ordenar y contar la mayoría de los archivos abiertos es definitivamente la mejor opción. Mostrar el nombre del proceso, así como pid: '' 'lsof | awk '{print $ 2 "" $ 1; } '| sort -rn | uniq -c | sort -rn | head -20 '' '
gaoithe

2
@gaoithe si pones eso en una respuesta, lo votaré con gusto:)
Matt Ball

23

En caso de que alguien más lo necesite ...

ulimit -a

Mostrará todos los límites actuales. Específicamente ulimit -n 70000establecerá el límite del descriptor de archivo.

También...

cat /proc/sys/fs/file-max

Mostrará / establecerá el límite del núcleo si se edita.

sudo echo 200000 > /proc/sys/fs/file-max

Una explicación mucho más detallada se puede encontrar en ...

¿Cómo aumento el límite de archivos abiertos para un usuario no root?


3
existen límites para que pueda mantener un control estricto sobre el uso de recursos en su sistema. Es mejor aumentarlos individualmente para los procesos que sabe que necesitarán usar muchos descriptores de archivo. Al mantenerlos ajustados en las pruebas, encontrará procesos que pueden perder constantemente los descriptores de archivos con el tiempo. Tenga en cuenta también que los identificadores de archivos se utilizan para cualquier acceso de dispositivo en unix / linux. Por ejemplo, cada socket de red abierto por un proceso utiliza un identificador de archivo. Eso explica por qué puede golpear los "demasiados archivos abiertos" en el caso de los archivos normales del sistema de archivos, así como cualquier archivo del dispositivo, como las conexiones de red.
gaoithe
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.