system management
1753792 メンバー
3001 オンライン
108799 解決策
新規ポスト

bdfコマンドの表示内容について

 
Y_M
頻繁なアドバイザー

bdfコマンドの表示内容について

こんにちは。mattsuと申します。

bdfコマンドの表示内容についてご教授頂きたい事があり投稿させて頂きました。

===質問===

現在、bdfコマンドにて表示される/optの状態はTOTAL:1048576、USED:969446、AVAIL:74218、%USED:93%となっていますが、去年の8月頃では%USEDは91%だった為、約2%(=20Mbyte程)増えた形になっているのですが、昨年8月と現在とで取得した"ls -lR"の結果では、ファイルサイズに差分があるものは1つしかなく、しかもその差分は25Kbyteだった為、何故20Mbyteもbdfの結果が増加したのか分かりません。単純に/opt配下のファイルサイズの合計では無いのでしょうか。

6件の返信6
H_K
頻繁なアドバイザー

bdfコマンドの表示内容について

まずは基本から。

ls はファイルのサイズを報告する。

bdf はディスクを使用しているブロック数に基づいて報告する。

ファイルはブロック単位でディスクに格納される。

でもファイルサイズがブロックサイズの整数倍でないときは、最終ブロックには未使用部分が存在する。

だから、ファイルサイズの合計と、ディスク使用量は大抵は異なる。

いきなり上級。

ls は現在「存在」しているファイルのサイズを報告する。

bdf は現在「使用」しているブロックのサイズを報告する。

オープンした状態で削除され、まだオープン中のファイルは ls から見えない。

でもプロセスがオープンしたままだからディスクブロックは使用中のまま。

何らかのプロセスを終了したりマシンをリブートしたりした後、ディスク使用量がいきなり減る場合はこれが理由。

以上

nt
貴重なコントリビューター

bdfコマンドの表示内容について

"ls -lR" ではなく "ls -alR" で比較する必要があるのでは

ないですか?

/opt に .* ファイルが増える可能性が低いとは思いますが。

Y_M
頻繁なアドバイザー

bdfコマンドの表示内容について

kinokinoさん、ntさんご回答ありがとうございます。

ちなみにkinokinoさんより頂いた回答にございました"オープンした状態で削除されたファイル"という部分につきまして、去年の8月に該当の処理を実施しております。(肥大化したログファイルがあった為、それを削除)

この状態ではログを書込むためのファイルが無い状態の為、ログ出力がエラーとなり書込み処理が中止されると想像していたのですが、bdfの結果でその後も継続してUSEDの領域が増えるという事は、ファイルが無い状態でもプロセスがオープン中のステータスであれば継続してUSEDの領域は増えていくものなのでしょうか。

(諸事情により簡単にリブートを出来る環境ではございませんので、困っています・・・。)
H_K
頻繁なアドバイザー

bdfコマンドの表示内容について

ログをオープンし、書き込んで、クローズするようなタイプの場合は、クローズによって参照がなくなり、rm によってディレクトリエントリからの参照もなくなる。だからディスクブロックも解放され、完全に抹消される。

でもログをオープンしたプロセスがクローズしていなければ、他のプロセスからはファイルはないように見えても、そのプロセスにはオープンした状態が継続する。

ファイル名としてのディレクトリエントリは消えても、ファイルが存在しているディスクブロックは解放されない。

下記をコンパイルして実行するとよくわかる。

プロセスが動作中に ls や bdf するとファイルサイズもディスク使用量も増えていく。

プロセスを動作させたまま、rm でファイルを消す。

ls には見えなくなるが、bdf が報告するサイズは減らないし、プロセスの動作とともに増え続ける。

で、プロセスを止めた瞬間に、ディスクブロックを参照しているモノがなくなるので、使用エリアがファイルシステム上から解放される。

すると bdf で見える使用量が減る。

エラーチェックは全て省略。

#include

#include

main()

{

int fd;

char buf;

fd = open("./foo" , O_RDWR);

while (1) {

write(fd, buf, sizeof(buf));

usleep(10000);

}

}

H_K
頻繁なアドバイザー

bdfコマンドの表示内容について

ドットで始まるファイル名は意外と見落とす。

だから、いつも ls -alR とか find . -print で

全部対象にしています。

Y_M
頻繁なアドバイザー

bdfコマンドの表示内容について

kinokinoさんご教授ありがとうございました。私の薄い知識ではinclude以下のスクリプト?は良く理解出来なかったのですが、プロセス動作中にそのプロセスがオープンしているファイルについては"ls"で表示がなくてもbdfで増え続けるとの事でしたので、fuserコマンドで/opt配下にアクセスしているプロセスを調べ、可能であればそのプロセスを停止させてみます。

ご教授ありがとうございました。