
失敗する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
サービスファイルは特定のユーザーとして実行する必要があることを指定しますが、そのユーザーにはまだ使用制限がありません。