ファイルを開く制限

ファイルを開く制限

失敗する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

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

おすすめ記事