프로세스가 소진된 열린 파일 핸들

프로세스가 소진된 열린 파일 핸들

http 연결을 통해 데이터를 교환하는 두 개의 Java 프로세스를 기반으로 하는 내 애플리케이션은 파일을 실행하고 다음 오류 메시지를 생성합니다.

Aug 14 11:27:40 server sender[8301]: java.io.IOException: Too many open files
Aug 14 11:27:40 server sender[8301]: at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
Aug 14 11:27:40 server sender[8301]: at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
Aug 14 11:27:40 server sender[8301]: at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
Aug 14 11:27:40 server sender[8301]: at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:455)
Aug 14 11:27:40 server sender[8301]: at java.lang.Thread.run(Thread.java:748)

두 프로세스 모두 SystemD의 제어를 받습니다. 을 사용하여 프로세스를 확인했는데 cat /proc/5882/limits한계는 다음과 같이 정의되었습니다.

Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             63434                63434                processes
Max open files            4096                 4096                 files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       63434                63434                signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

실행하면 lsof | grep pid | wc -l항목이 2000개 미만이 됩니다. (lsof를 이런 식으로 실행하고 있습니다.프로세스당 열려 있는 파일 수를 가져오려고 할 때 lsof 명령과의 차이점)

무엇을 더 확인하거나 추가할 수 있는지 전혀 모르겠습니다.

답변1

프로세스에 열려 있는 파일 설명자 수를 확인하는 가장 좋은 방법은 다음을 사용하는 것입니다.

$ ls /proc/8301/fd/ | wc -l

(로그에서와 같이 PID 8301을 가정합니다.)

실행은 lsof전체 트리를 탐색 /proc하고 모든 파일의 이름을 확인하려고 시도하므로(이것은 확인하기 위해 각 파일에 대한 readlink 호출이 필요한 의사 심볼릭 링크입니다) 실행 시간이 lsof오래 걸립니다(사용량이 얼마나 되는지에 따라 다름). 귀하의 컴퓨터는) 따라서 결과를 확인할 때쯤에는 모든 것이 변경되었을 수 있습니다. 사용 속도가 빠르므로 ls /proc/${pid}/fd/(readdir 호출 한 번만) 현재 상황에 가까운 것을 캡처할 가능성이 더 높습니다.

문제 해결과 관련하여 서비스에서 허용하는 파일 설명자 수를 늘리는 것을 고려할 수 있습니다.설정 LimitNOFILE=지침시스템 단위 파일에.

관련 정보