¿Cómo rastrear una fuga de descriptor de archivo?

11

Tengo un proceso de Java (Glassfish) que está filtrando descriptores de archivos. Sé esto porque recibo la útil java.io.IOException: Too many open filesexcepción. Puedo mirar /proc/PID#/fdy ver todos los descriptores de archivos abiertos. Cuando uso lsof obtengo una gran cantidad de entradas como esta:

java 18510 root 8811u calcetín 0,4 1576079 no puede identificar el protocolo
java 18510 root 8812u calcetín 0,4 1576111 no puede identificar el protocolo
java 18510 root 8813u calcetín 0,4 1576150 no puede identificar el protocolo

Veo 12 nuevos creados por minuto. ¿Qué opciones puedo usar en lsof o qué otras herramientas están disponibles para ayudarme a rastrear los descriptores de archivos de socket donde no se puede identificar el protocolo?

cclark
fuente
//, Muchas respuestas excelentes a esta pregunta no son más que una consulta de un motor de búsqueda ... duckduckgo.com/?q=How+to+track+down+a+file+descriptor+leak
Nathan Basanese

Respuestas:

7

para ver los 20 mejores manejadores de archivos usando procesos:

for x in `ps -eF| awk '{ print $2 }'`;do echo `ls /proc/$x/fd 2> /dev/null | wc -l` $x `cat /proc/$x/cmdline 2> /dev/null`;done | sort -n -r | head -n 20

la salida está en el formato de archivo, número de identificadores, pid, cmndline para el proceso

salida de ejemplo

701 1216 /sbin/rsyslogd-n-c5
169 11835 postgres: spaceuser spaceschema [local] idle
164 13621 postgres: spaceuser spaceschema [local] idle
161 13622 postgres: spaceuser spaceschema [local] idle
161 13618 postgres: spaceuser spaceschema [local] idle
jojajamesmiller
fuente
4

Familiarícese con el comando strace. Monitorea llamadas del sistema. Recientemente lo usé para rastrear fugas en el descriptor de archivo que causaban que nuestro demonio snmpd se bloqueara repetidamente. Lleva un tiempo acostumbrarse, pero es una herramienta poderosa.

Puede usar strace para adjuntar a un proceso en ejecución (no olvide el indicador -f para seguir los procesos secundarios).

yoonix
fuente
1

¿Qué estás tratando de localizar exactamente? ¿Las direcciones IP remotas asociadas con los FD filtrados, el código defectuoso u otra cosa?

Como ya ha identificado que hay una fuga, ponerse en contacto con los ingenieros responsables de este proceso de Java parece ser un próximo paso razonable.

Andrés
fuente
Estoy tratando de localizar cualquier información que pueda sobre esos descriptores de archivo. can't identify protocolno les da a los ingenieros mucho para correr. ¿Hay herramientas u opciones en lsof que no veo qué debo usar? El problema no ocurre en el entorno de prueba y solo comenzó en este entorno después de una migración de gabinete. El mismo código no tuvo problemas antes de la migración y cuando la aplicación no está implementada, Glassfish todavía se filtra por sí solo. Mi mejor conjetura es que algo se rompió desde una perspectiva de redes y los enchufes están tratando de inicializarse pero no pueden y luego se cuelgan y se quedan.
cclark