Linuxサーバがディスク容量不足になった!何か消さねば!ってなった時にどう対処するか

by T a k



とりとめもなく書いてみる。主にルーキー向けです。
サーバの運用とかやっていると、不定期ではあるが、たまにタイトルのようなディスク容量が逼迫する話題に直面します。
まぁ、それが起こるのは一旦良いとして、みんなこういう時、どうやって調べているのだろう?
とりあえず、僕がどうやってるか書いてみます。

何はともあれ現状確認

みんな大好き"df"コマンドです。細かい説明は省きますが、各パーティション・ファイルシステムごとにディスクの使用状況を確認。

# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/sda3             130G   88G   36G  72% /
/dev/sda1             494M   23M  447M   5% /boot
tmpfs                  12G     0   12G   0% /dev/shm

正確とは言いませんが、だいたいどのパーティションにどのくらい容量が空いているかが確認できます。

どのディレクトリ配下の容量が大きいか確認

"du"コマンドは、各ディレクトリ/ファイルの確認ができますが、そのまま実行すると再帰的なディレクトリまですべて表示して追いづらくなるので、"--max-depth=1"(1階層分を表示)とかオプションを付けて、少しずつ絞り込んでいくようにします。

# du -h --max-depth=1 /
0       /proc
8.0K    /mnt
95M     /etc
8.0K    /selinux
8.0K    /misc
264K    /dev
84G     /var
3.6G    /usr
2.4M    /opt
36M     /sbin
8.0K    /srv
16K     /lost+found
624K    /home
219M    /lib
2.1M    /root
12M     /boot
8.0K    /media
7.7M    /bin
36M     /tmp
18M     /lib64
0       /sys
88G     /


↑の例では、ルートパーティション("/")に対して、"du"コマンドを発行していますが、ファイル/ディレクトリの量によっては時間がかかるかもしれません。また、実行時間中、ディスクI/Oも発生させることになるので、その辺はいい感じで調整して実行しましょう。

↑では、"/var"以下に大きなファイルがありそうなことがわかったので、次は同様のコマンドを"/var"に対して実行する・・・みたいな感じでやっていくと、デカいファイルのありかが突き止められそうですね。

少し絞り込めたら、後は容量を見て確認

"du"コマンドの出力結果をsortしてもいいのですが、今回はサイズの大きなファイルを探すということで、"find"コマンドの"-size"オプションを使ってファイルサイズベースでの絞り込みをします。↓のような感じ。

# find /var -size +100M -exec ls -lh {} \;
-rw-r--r-- 1 daemon daemon 155M  7月 29 11:59 /var/log/hoge/activity/activity.log.2013-07-29
-rw-r--r-- 1 daemon daemon 218M  7月 18 02:00 /var/log/httpd/rewrite_log.20130717.gz
-rw-r--r-- 1 daemon daemon 123M  7月 17 02:00 /var/log/httpd/rewrite_log.20130716.gz
-rw-r--r-- 1 daemon daemon 230M  7月 28 02:00 /var/log/httpd/rewrite_log.20130727.gz
-rw-r--r-- 1 daemon daemon 230M  7月 23 02:00 /var/log/httpd/rewrite_log.20130722.gz
-rw-r--r-- 1 daemon daemon 230M  7月 26 02:00 /var/log/httpd/rewrite_log.20130725.gz
-rw-r--r-- 1 daemon daemon 1.2G  7月 29 11:59 /var/log/httpd/rewrite_log
-rw-r--r-- 1 daemon daemon 206M  7月 20 02:00 /var/log/httpd/rewrite_log.20130719.gz
-rw-r--r-- 1 daemon daemon 229M  7月 27 02:00 /var/log/httpd/rewrite_log.20130726.gz
-rw-r--r-- 1 daemon daemon 208M  7月 24 02:00 /var/log/httpd/rewrite_log.20130723.gz
-rw-r--r-- 1 daemon daemon 223M  7月 21 02:00 /var/log/httpd/rewrite_log.20130720.gz
-rw-r--r-- 1 daemon daemon 211M  7月 19 02:00 /var/log/httpd/rewrite_log.20130718.gz
-rw-r--r-- 1 daemon daemon 239M  7月 29 02:00 /var/log/httpd/rewrite_log.20130728.gz
-rw-r--r-- 1 daemon daemon 196M  7月 29 11:59 /var/log/httpd/fuga-access_log
-rw-r--r-- 1 daemon daemon 228M  7月 25 02:00 /var/log/httpd/rewrite_log.20130724.gz
-rw-r--r-- 1 daemon daemon 237M  7月 22 02:00 /var/log/httpd/rewrite_log.20130721.gz
-rw-r--r-- 1 daemon daemon 161M  7月 22 02:00 /var/log/foobar/foobar-access_log.20130721.gz
-rw-r--r-- 1 daemon daemon 150M  7月 21 02:00 /var/log/foobar/foobar-access_log.20130720.gz
-rw-r--r-- 1 daemon daemon 140M  7月 20 02:00 /var/log/foobar/foobar-access_log.20130719.gz
-rw-r--r-- 1 daemon daemon 143M  7月 19 02:00 /var/log/foobar/foobar-access_log.20130718.gz
-rw-r--r-- 1 daemon daemon 142M  7月 24 02:00 /var/log/foobar/foobar-access_log.20130723.gz
-rw-r--r-- 1 daemon daemon 163M  7月 29 02:00 /var/log/foobar/foobar-access_log.20130728.gz
-rw-r--r-- 1 daemon daemon 147M  7月 18 02:00 /var/log/foobar/foobar-access_log.20130717.gz
-rw-r--r-- 1 daemon daemon 154M  7月 25 02:00 /var/log/foobar/foobar-access_log.20130724.gz
-rw-r--r-- 1 daemon daemon 230M  7月 29 11:59 /var/log/foobar/foobar-access_log
-rw-r--r-- 1 daemon daemon 156M  7月 28 02:00 /var/log/foobar/foobar-access_log.20130727.gz
-rw-r--r-- 1 daemon daemon 155M  7月 27 02:00 /var/log/foobar/foobar-access_log.20130726.gz
-rw-r--r-- 1 daemon daemon 156M  7月 26 02:00 /var/log/foobar/foobar-access_log.20130725.gz
-rw-r--r-- 1 daemon daemon 156M  7月 23 02:00 /var/log/foobar/foobar-access_log.20130722.gz

特定のディレクトリ以下に対して、"-size +100M"を付けることで、ファイルサイズが100MB以上のものだけを抽出しています。こんな感じで結構あぶりだせました。
あとは内容を確認しながら、要らないものであればザックザクと消していきましょう。


とまぁ、簡単に書くとこんな感じですが、もっとエレガントなやり方があれば教えてくださいませ。
それでは! =͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́

追記

コメントを頂戴いたしました。

matsuuさんからコメントいただきました。
これはまさにその通りですね!アレコレ気にする前にnice/ioniceで優先度下げてしまえは、ごもっとも。
あと、本文でも少し言及していますが、duコマンドもsortした方が楽ですね。僕は結果表示が10〜20前後くらいまでなら、チャチャっと実行して、得意の目grepかましてしまう悪いクセがありまして・・・エヘヘ


Linuxエンジニア養成読本 [仕事で使うための必須知識&ノウハウ満載!] (Software Design plus)

Linuxエンジニア養成読本 [仕事で使うための必須知識&ノウハウ満載!] (Software Design plus)

Linuxシステム[実践]入門 (Software Design plus)

Linuxシステム[実践]入門 (Software Design plus)