파일 열기 제한

파일 열기 제한

실패하는 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 -l771만 반환되며 이는 한도를 초과하지 않습니다.

여기서 무슨 일이 일어나고 있는지 이해하도록 도와줄 수 있는 사람이 있나요? 내가 무엇을 놓치고 있나요? 모든 사용자 프로세스에 걸쳐 제한이 합산됩니까(제가 예상하는 바입니다)?

이것은 RedHat 7, Lsof 개정판 4.87입니다.

편집하다:좋아, 차이점이 무엇인지 알고 있다고 생각합니다. lsof -p ...하위 프로세스가 존재하는 경우에만 상위의 열린 파일을 표시합니다.

@schily의 의견 덕분에 하위 프로세스당 제한이 30K가 아닌 4K에 불과하다는 것을 알게 되었습니다.

답변1

내 경우 해결책은 서비스로 실행했기 때문에 (중요한지 몰랐기 때문에 언급하지 않았다)

LimitNOFILE=8192

내 서비스 파일로 이동/etc/systemd

서비스 파일은 특정 사용자로 실행해야 한다고 지정하지만 해당 사용자에게는 여전히 사용 제한이 없습니다.

관련 정보