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.

Andrew Grimm
fuente
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
Andrea Olivato
fuente
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?

Kervin
fuente
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