파일 디스크립터 누출을 추적하는 방법? 8811u 양말

파일 설명자가 유출되는 Java 프로세스 (Glassfish)가 있습니다. 도움이되는 java.io.IOException: Too many open files예외가 있기 때문에 이것을 알고 있습니다. /proc/PID#/fd열려있는 모든 파일 설명자를보고 볼 수 있습니다 . lsof를 사용하면 다음과 같이 매우 많은 수의 항목이 나타납니다.

Java 18510 루트 8811u 양말 0,4 1576079가 프로토콜을 식별 할 수 없음
Java 18510 루트 8812u 양말 0,4 1576111이 프로토콜을 식별 할 수 없음
Java 18510 루트 8813u 양말 0,4 1576150이 프로토콜을 식별 할 수 없음

분당 12 개의 새로운 것이 만들어졌습니다. lsof에서 사용할 수있는 옵션 또는 프로토콜을 식별 할 수없는 소켓 파일 설명자를 추적하는 데 사용할 수있는 다른 도구는 무엇입니까?



답변

프로세스를 사용하여 상위 20 개 파일 핸들을 보려면 :

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

출력은 프로세스의 파일 핸들 수, pid, cmndline 형식입니다.

예제 출력

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

답변

strace 명령에 익숙해 지십시오. 시스템 호출을 모니터합니다. 최근에 snmpd 데몬이 반복적으로 충돌하는 파일 디스크립터 누출을 추적하는 데 사용했습니다. 익숙해지는 데는 다소 시간이 걸리지 만 강력한 도구입니다.

strace를 사용하여 실행중인 프로세스에 연결할 수 있습니다 (자식 프로세스를 따르는 -f 플래그를 잊지 마십시오).


답변

정확히 무엇을 추적하려고합니까? 유출 된 FD, 결함이있는 코드 또는 다른 것과 관련된 원격 IP 주소?

누출이 있음을 이미 확인 했으므로이 Java 프로세스를 담당하는 엔지니어에게 문의하는 것이 합리적인 다음 단계처럼 보입니다.


답변