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


11

파일 설명자가 유출되는 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에서 사용할 수있는 옵션 또는 프로토콜을 식별 할 수없는 소켓 파일 설명자를 추적하는 데 사용할 수있는 다른 도구는 무엇입니까?


//,이 질문에 대한 많은 훌륭한 답변은 검색 엔진 쿼리
일뿐입니다

답변:


7

프로세스를 사용하여 상위 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

4

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

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


1

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

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


해당 파일 설명자에 대해 가능한 모든 정보를 추적하려고합니다. can't identify protocol엔지니어들에게 많은 것을 제공하지 않습니다. lsof에 어떤 도구를 사용해야하는지 알 수없는 도구 나 옵션이 있습니까? 테스트 환경에서는 문제가 발생하지 않으며 캐비닛 마이그레이션 후에 만이 환경에서 시작됩니다. 동일한 코드는 마이그레이션 전에 아무런 문제가 없었으며 appl이 배포 취소 될 때 Glassfish는 여전히 자체적으로 누출됩니다. 내 최선의 추측은 네트워킹 관점에서 무언가가 깨졌고 소켓이 초기화하려고하지만 소켓이 초기화되지 않고 멈추고 남아 있습니다.
cclark
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.