ファイル記述子のリークを追跡する方法は?


11

ファイル記述子をリークしているJavaプロセス(Glassfish)があります。役立つjava.io.IOException: Too many open files例外が発生したので、これを知っています。/proc/PID#/fd開いているすべてのファイル記述子を調べて確認できます。lsofを使用すると、次のような非常に多くのエントリが表示されます。

java 18510ルート8811u sock 0,4 1576079がプロトコルを識別できない
java 18510 root 8812u sock 0,4 1576111がプロトコルを識別できない
java 18510 root 8813u sock 0,4 1576150がプロトコルを識別できない

1分あたり12個の新しいものが作成されています。lsofで使用できるオプション、またはプロトコルを識別できないソケットファイル記述子を追跡するために使用できるその他のツール


//、この質問に対する多くの素晴らしい回答は、検索エンジンのクエリにすぎませ
Nathan Basanese

回答:


7

プロセスを使用した上位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

4

straceコマンドについて理解します。システムコールを監視します。私は最近、これを使用して、snmpdデーモンを繰り返しクラッシュさせるファイル記述子のリークを追跡しました。慣れるには少し時間がかかりますが、強力なツールです。

straceを使用して、実行中のプロセスにアタッチできます(子プロセスを追跡するには、-fフラグを忘れないでください)。


1

正確に何を追跡しようとしていますか?リークされたFD、欠陥のあるコード、またはその他に関連するリモートIPアドレス

リークがあることをすでに確認しているので、このJavaプロセスの責任者であるエンジニアに連絡することは、次のステップとして妥当なように思えます。


私はそれらのファイル記述子についてできる限りの情報を追跡しようとしています。 can't identify protocolエンジニアが一緒に実行するために多くを与えていません。lsofに、使用すべきツールが表示されないツールまたはオプションはありますか?この問題はテスト環境では発生せず、キャビネットの移行後にこの環境でのみ発生します。移行前の同じコードには問題がなく、アプリケーションがアンデプロイされても、Glassfishはそれ自体でリークします。私の推測では、ネットワーキングの観点から何かが壊れており、ソケットは初期化を試みていますが、初期化できず、ハングし、そのまま残っています。
cclark
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.