ファイル記述子をリークしているJavaプロセス(Glassfish)があります。役に立ちましたJava.io.IOException: Too many open files
例外。 /proc/PID#/fd
と開いているすべてのファイル記述子を参照してください。 lsofを使用すると、次のような非常に多くのエントリが表示されます。
Java 18510ルート8811u sock 0、4 1576079はプロトコルを識別できません
Java 18510ルート8812u sock 0,4 1576111がプロトコルを識別できません
Java 18510ルート8813u sock 0,4 1576150がプロトコルを識別できません
毎分12個の新しいものが作成されています。 lsofで使用できるオプション、またはプロトコルを識別できないソケットファイル記述子を追跡するために使用できるその他のツール
プロセスを使用した上位20ファイルハンドルを表示するには:
for x in `ps -eF| awk '{ print $2 }'`;do echo `ls /proc/$x/fd 2> /dev/null | wc -l` $x `cat /proc/$x/cmdline 2> /dev/null`;done | sort -n -r | head -n 20
出力は、プロセスのファイルハンドルカウント、pid、cmndlineの形式です。
出力例
701 1216 /sbin/rsyslogd-n-c5
169 11835 postgres: spaceuser spaceschema [local] idle
164 13621 postgres: spaceuser spaceschema [local] idle
161 13622 postgres: spaceuser spaceschema [local] idle
161 13618 postgres: spaceuser spaceschema [local] idle
Straceコマンドについて理解します。システムコールを監視します。私は最近それを使用して、snmpdデーモンが繰り返しクラッシュする原因となっていたファイル記述子のリークを追跡しました。慣れるには少し時間がかかりますが、強力なツールです。
Straceを使用して、実行中のプロセスにアタッチできます(子プロセスを追跡するには、-fフラグを忘れないでください)。
正確に何を追跡しようとしていますか?リークされたFD、欠陥のあるコード、またはその他に関連するリモートIPアドレス
リークがあることをすでに確認したので、このJavaプロセスの責任者であるエンジニアに連絡することは、次のステップとして妥当なようです。