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=
지침시스템 단위 파일에.