실패하는 Java 애플리케이션이 있습니다.
java.io.IOException: Too many open files
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) ~[na:1.8.0-internal]
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:477) ~[na:1.8.0-internal]
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:287) ~[na:1.8.0-internal]
at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:455) ~[tomcat-embed-core-8.5.27.jar!/:8.5.27]
at java.lang.Thread.run(Thread.java:785) [na:1.8.0-internal]
내 열린 파일 한도는 30K입니다.
$ ulimit -a
...
open files (-n) 30480
...
이제 정확한 검사가 무엇인지 궁금합니다.
lsof | grep 123 | wc -l
(123은 Java 애플리케이션의 pid입니다.) 45633이라는 숫자가 반환됩니다.
왜 30K를 초과합니까?
반면에 lsof -p 123| wc -l
771만 반환되며 이는 한도를 초과하지 않습니다.
여기서 무슨 일이 일어나고 있는지 이해하도록 도와줄 수 있는 사람이 있나요? 내가 무엇을 놓치고 있나요? 모든 사용자 프로세스에 걸쳐 제한이 합산됩니까(제가 예상하는 바입니다)?
이것은 RedHat 7, Lsof 개정판 4.87입니다.
편집하다:좋아, 차이점이 무엇인지 알고 있다고 생각합니다. lsof -p ...
하위 프로세스가 존재하는 경우에만 상위의 열린 파일을 표시합니다.
@schily의 의견 덕분에 하위 프로세스당 제한이 30K가 아닌 4K에 불과하다는 것을 알게 되었습니다.
답변1
내 경우 해결책은 서비스로 실행했기 때문에 (중요한지 몰랐기 때문에 언급하지 않았다)
LimitNOFILE=8192
내 서비스 파일로 이동/etc/systemd
서비스 파일은 특정 사용자로 실행해야 한다고 지정하지만 해당 사용자에게는 여전히 사용 제한이 없습니다.