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=
手順システム単位ファイルに。