web-dev-qa-db-ja.com

ほとんどのiノードが開かれているプロセスを特定する方法

これが私の問題です、muninチャートで表示されます:

munin inode chart

私の使用済み/開いたiノードは、「突然」絶えず増加しています。

現在開かれているiノードを保持しているプロセスを特定する方法はありますか?私は https://unix.stackexchange.com/questions/117093/find-where-inodes-are-being-used のアプローチを使用して、取得できるメールとログを含むいくつかのフォルダーを見つけてクリーンアップしました取り除く...それでも、iノードがOPENの場合、それらを使用し続けるためのプロセスが必要ですよね?それは必ずしも増加が行われているほとんどのファイルが含まれているフォルダではない可能性があります-または私はそこに間違っていますか?

それで、誰がそれらを開いたままにしているのかを確認し、使用量を追跡して、増加の原因を確認したいと思います

更新

Andrewのスクリプトに基づいて、プロセス名も表示するバージョンを作成しました。再起動する可能性のあるnginx/Apacheプロセスがいくつか実行されているので、プロセス名の結果を確認したいと思います。

for dir in /proc/*/fd;
do
    echo -n "$dir ";
    pid=`expr "$dir" : '\/proc\/\(.*\)\/.*'`; # extract the pid
    pname=`ps -p $pid -o comm=`; # grab process name
    echo -n "$pname ";
    ls $dir 2>/dev/null | wc -l;
done | sort -n -k 3

出力例:

/proc/4612/fd sshd 49
/proc/46470/fd node 60
/proc/5655/fd nginx 66
/proc/6656/fd nginx 76
/proc/7654/fd nginx 81
/proc/8578/fd dovecot 107
/proc/9657/fd nginx 117
/proc/3495/fd Java 146
/proc/4785/fd mysqld 382

したがって、次のテストは、時間の経過とともにディストリビューションをログに記録して、どのような変更があり、それがMorganが言及した/ proc/sys/fs/inode-nrの数とどのように相関しているかを確認することです。

1年後...

少し時間が経ちましたが、ここに新しいチャートがあります munin open inodes

そして、9月末が故障したドライブが交換された時点です。したがって、全体の混乱はディスクエラーによって生成されたようです。それにもかかわらず、スクリプトはまだ役に立ちます!

4
Xosofox

/proc/[PID]/fdディレクトリのエントリ数をカウントします。これにより、各プロセスが開いているファイル記述子の数がわかります。すべてのプロセスを列挙するのにはしばらく時間がかかりますが、カウントの進行中に開始または停止する欠落したプロセスは、オープンファイル記述子が多数ある長期間有効なプロセスを探しているため、問題にはなりません。

このようなもの:

for dir in /proc/*/fd;
do
    echo -n "$dir "; #need a space to get real columns for the sort
    ls $dir 2>/dev/null | wc -l;
done | sort -n -k 2

出力の最後の行には、/ proc/[PID]/fdディレクトリと、各プロセスの開いているファイル記述子の数が表示されます。犯人のプロセスは下部近くにあるはずです。

/ proc/[PID]/fdの各エントリは厳密にはファイル記述子であり、個別のオープンiノードではないことに注意してください。各個別のオープンiノードは、/ proc/[PID]/fdディレクトリのどこかに少なくとも1つの個別のファイル記述子が必要です。

2
Andrew Henle

ここでの問題は、部分的には、muninが「オープンiノード」によって意味することだと思います。 muninのデフォルトのインストールには、割り当てられたiノードの数を取得するための2つのプラグインがあります。

「/ etc/munin/plugins/open_inodes」は、「/ proc/sys/fs/inode-nr」からiノードメトリックを取得します。

そして

「/ etc/munin/plugins/df_inode」は、「df -i」の出力からメトリックを取得します。

これらの数は、システム上のすべてのプロセスによって使用されているファイル/ iノードの数ではなく、既存のファイルを反映しています。

たとえば、このスクリプトは10個のファイルを作成し、それが終了すると、「df -i」とinode-nrの両方でiノード割り当ての増加を確認できます。

    #!/usr/bin/python

    f0 = open("foo0", "w")
    f1 = open("foo1", "w")
    f2 = open("foo2", "w")
    f3 = open("foo3", "w")
    f4 = open("foo4", "w")
    f5 = open("foo5", "w")
    f6 = open("foo6", "w")
    f7 = open("foo7", "w")
    f8 = open("foo8", "w")
    f9 = open("foo9", "w")

ただし、これを調整してプログラムが終了しないようにした場合(およびファイルが既に存在している場合)、ファイルはプロセスによって「開いた」状態で「使用中」のままになります。

    #!/usr/bin/python

    import time

    f0 = open("foo0", "w")
    f1 = open("foo1", "w")
    f2 = open("foo2", "w")
    f3 = open("foo3", "w")
    f4 = open("foo4", "w")
    f5 = open("foo5", "w")
    f6 = open("foo6", "w")
    f7 = open("foo7", "w")
    f8 = open("foo8", "w")
    f9 = open("foo9", "w")

    time.sleep(600)

「lsof -p PID」の出力に反映されていることがわかります

COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
...
open_some 6602 morgan    3w   REG  254,1        0 262198 /home/morgan/src/foo0
open_some 6602 morgan    4w   REG  254,1        0 262273 /home/morgan/src/foo1
open_some 6602 morgan    5w   REG  254,1        0 262284 /home/morgan/src/foo2
open_some 6602 morgan    6w   REG  254,1        0 262287 /home/morgan/src/foo3
open_some 6602 morgan    7w   REG  254,1        0 262289 /home/morgan/src/foo4
open_some 6602 morgan    8w   REG  254,1        0 262301 /home/morgan/src/foo5
open_some 6602 morgan    9w   REG  254,1        0 262302 /home/morgan/src/foo6
open_some 6602 morgan   10w   REG  254,1        0 262309 /home/morgan/src/foo7
open_some 6602 morgan   11w   REG  254,1        0 262457 /home/morgan/src/foo8
open_some 6602 morgan   12w   REG  254,1        0 268672 /home/morgan/src/foo9

しかし、この「開いたままにする」スクリプトは何度でも実行でき、df/inode-nrの数値は変更されません。

つまり、要するに、muninは、すべてのプロセスで使用されているすべてのiノードの数ではなく、割り当てられたiノードの数を報告しています。大量のファイルを削除した後、muninグラフに解放されたiノードが反映されない場合は、グラフが再生成されていないか、グラフの時間スケールが長すぎて反映できません。急変。

1
Morgan

ログファイルが原因である場合、クリーンアップ時にiノードが解放されなかった可能性があります。これらのログファイルを開いたサービスを再起動してみてください。そうしないと、echo "" > logfilenamegoeshere保存したいデータをログからバックアップした後。

0
sa289

著者の「ファイルアクセストレース」用のユーティリティ「fatrace」が見つかりました blogpost ダウンロード可能 here 。システム上のファイルにアクセスするすべてのプロセスが表示されます。

0
Morgan