IT TIP

열려있는 파일이 너무 많음 : 열려있는 파일 수, 파일 내용 및 JVM이 열 수있는 파일 수

itqueen 2020. 12. 1. 20:22
반응형

열려있는 파일이 너무 많음 : 열려있는 파일 수, 파일 내용 및 JVM이 열 수있는 파일 수


Java에서이 예외가 발생합니다.

java.io.FileNotFoundException: (Too many open files) 

이 문제를 해결하는 방법을 찾고 있습니다.

이 오류는 JVM이 너무 많은 핸들을 할당했으며 기본 OS가 더 많은 것을 허용하지 않음을 나타냅니다. 부적절하게 닫힌 연결 / 스트림으로 어딘가에 누출이 있습니다.

이 프로세스는 중단없이 며칠 동안 실행되며 결국 예외가 발생합니다. 가동 시간 12-14 일 후에 반복적으로 발생합니다.

이걸 어떻게 싸웁니 까? JVM에서 할당 된 핸들 목록을 얻거나 특정 양에 도달했을 때 추적하는 방법이 있습니까? 나는 그것들을 인쇄하고 그것이 어떻게 그리고 언제 성장하는지보고 싶습니다. 프로파일 러는 프로덕션 시스템이기 때문에 사용할 수 없으며 개발 중에 재현하기가 어렵습니다. 어떠한 제안?

사용 가능한 힙 크기를 모니터링하고 -Xmx에 지정된 총계의 1 %에 가까워지면 "알람"을 발생시킵니다. 또한 내 스레드 수가 500 개를 넘으면 뭔가 문제가 발생한다는 것도 알고 있습니다. 자, 내 JVM 이 OS에서 너무 많은 핸들할당 하고이를 돌려주지 않는다는 것을 알 수있는 방법이 있습니까 ( 예 : 소켓, 열린 파일 등). 내가 그것을 알았다면 어디에서 언제 볼 것인지 알 것입니다.


실행중인 OS를 말하지 않았지만 Linux에서 실행중인 경우 lsof 명령을 사용할 수 있습니다.

lsof -p <pid of jvm>

그러면 JVM에서 연 모든 파일이 나열됩니다. 또는 Windows에서 실행중인 경우 모든 프로세스에 대해 열려있는 모든 파일을 표시하는 Process Explorer사용할 수 있습니다 .

이렇게하면 파일을 열어 두는 코드의 비트를 좁힐 수 있기를 바랍니다.


Linux를 사용하고 있으므로 / proc-Filesystem을 확인하는 것이 좋습니다. proc 내에서 'fd'라는 폴더를 포함하는 프로세스의 PID가있는 폴더를 찾을 수 있습니다. 프로세스 ID가 1234 인 경우 경로는 다음과 같습니다.

/proc/1234/fd

이 폴더 안에는 열려있는 모든 파일에 대한 링크가 있습니다 ( 'ls -l'수행). 일반적으로 파일을 닫지 않고 열 수있는 라이브러리 / 코드를 파일 이름으로 알 수 있습니다.


따라서 전체 답변 (@phisch 및 @bramp의 답변을 결합했습니다). 모든 프로세스를 확인하려면을 사용해야합니다 sudo. 또한 결과를 파일에 저장하는 것도 좋습니다. lsof는 저렴하지 않습니다.이 파일은 추가 조사에 유용 할 수 있습니다.

sudo lsof > lsof.log

나쁜 놈들 보여주기 ( @Arun의 코멘트에서 UPDATE 포함 ) :

cat lsof.log | awk '{print $1 " " $2 " " $5}' | sort | uniq |awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -5

    2687 114970 java
    131 127992 nginx
    109 128005 nginx
    105 127994 nginx
    103 128019 nginx

파일 설명자 목록도 파일에 저장합니다.

sudo ls -l /proc/114970/fd > fd.log

열려있는 상위 파일 표시 :

cat fd | awk '{ print $11 }' | sort -rn | uniq -c | sort -rn | head -n20

다음에 다음을 추가하여 열린 파일의 제한을 변경할 수 있습니다 /etc/security/limits.conf.

* soft nofile 2048 # Set the limit according to your needs
* hard nofile 2048

그런 다음 sysctl -p셸에서 사용하여 구성을 다시로드 할 수 있습니다 . 이 기사를 확인 하십시오 .

완전성을 위해 다음을 사용하여 열린 파일의 현재 제한이 무엇인지 확인할 수 있습니다. ulimit -n

참고 URL : https://stackoverflow.com/questions/2272908/too-many-open-files-how-many-are-open-what-they-are-and-how-many-can-the-jvm

반응형