プロセスが使い果たされたオープンファイルハンドル

プロセスが使い果たされたオープンファイルハンドル

http接続を介してデータを交換する2つの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呼び出しを1回だけ)現在の状況に近いものをキャプチャする可能性が高くなります。

トラブルシューティングに関しては、サービスが許可するファイル記述子の数を増やすことを検討できます。設定 LimitNOFILE=手順システム単位ファイルに。

おすすめ記事