ディスクフルとは?
ディスクフルとは記憶装置がいっぱいになった状態 – 空きディスク容量が無くなった状態のことを言います。
Linuxではdfコマンドを使うとディスク使用率を確認することができます。
$ df -h | grep /$
/dev/sda2 30G 30G 0G 100% /
100%の使用率ではディスクに何も書き込めなくなってしまいます。
ディスクフルの問題点は?
もしもディスクフルになると
- システム動作が遅くなる
- 最悪の場合シャットダウンする
webページやアプリケーションの表示が遅くなったり、最悪の場合は停止してしまいます。
ディスクフルで停止するのはなぜ?
サーバを動かす上で必要なファイルの書き込みができなくなるからです。
ディスクフルの状態では例えば以下のようなことができなくなります。
- 各種ログが保存できない
- ログインができない(シェルが正常に起動しない)
- タブ補完がきかない
OSを動かすのに必要なディスク書き込みができなければ操作を全く受け付けなくなり停止します。
ディスクは放置したら一杯になる
ディスクを使い切る前にOSが止める機能はありません。
そのため、ユーザ側でディスク残量をチェックしてディスクフルを防止しましょう。
ディスク管理はサーバー運用の超基本
ディスク残量の監視はサーバ運用の基本です。
ディスクの残容量がどのくらいか?を確認するとともに、放置すると増加するファイルを整理しましょう。
放置すると大きくなるファイルは以下のようなものが挙げられます。
- アップデートによる増加(キャッシュや未使用ファイルの増加等)
- コンテンツの増加
- ログの肥大化
- 各種キャッシュファイル
特にキャッシュやログは肥大化しやすいため、
サイズの上限を設定したり、ログローテーション設定して古いファイルを圧縮しましょう。
残容量のモニタリング・通知などの仕組みを組み込んで、ディスクフルになる前に対策をとるようにしましょう。
ディスクフルを回避する方法
ディスクフルを回避する方法はシンプルに2つあります。
- ディスク空き容量の監視
- 空き容量を確保
空き容量を確保する方法にはいくつかあるので環境に合った方法を実践してみましょう。
ディスク残容量の監視を行う
ディスクフルを回避するためには「空き容量の把握」が必要です。
現在の空き容量を定期的に確認しましょう。
手動の確認は大変なので、ツールを使って自動化をします。
監視ツールには以下があります。
- Zabbix
- Prometeus
- Nagios
これらのツールを利用すれば自動で監視し、閾値を超えたらメールやline、teamsなどに通知するように設定することができます。
ディスクの増設
最も簡単で効果的なものはディスクの増設です。
資産に余裕があれば、足りない分増設するのが簡単で効果的です。
コスト重視で見るとデータ削除に目が行きがちですが、ディスク増設は根本的な解決方法のひとつであることを認識しておきましょう。
ディスク増設のタイミングとしては
- 肥大化原因がログ等ではなく、必要なコンテンツによるもの
- OSが使用する必須領域が大部分を占めている(根本的に足らない)
- 慢性的にディスク容量が不足している
- ディスク追加が可能な状況
ディスク容量が根本的に足らないな?という場合は設計に問題があるので増設を積極的に検討しましょう。
クラウドではディスク容量にも課金されるのでなるべくコストを減らしたいという場合はより安価なストレージを用意してアクセス頻度が低いデータをそちらに移行するという方法も検討しましょう(AWSならEBSよりもS3の方が安価)
ディスクが一杯になるとサーバーが死ぬのでそこまでケチらないように!
ログの削除(不要データの削除)
起動時間が長いほど不要なデータは積もっていくものです。使用ていないアプリやデータは削除しましょう。
過去ログも調査のために必要になる場合がありますが、大抵は不要なので直近半年~1年程度は残して削除しましょう。どうしても必要なら圧縮して固めたログを別場所に保管しておくのも良いでしょう(S3 gracierなど)
不要なデータとしては
- 過去のログ
- パッケージ管理システムのキャッシュ(yumのキャッシュなど)
- 使用予定のないコンテンツ(過去サービスのもの
- 古いバックアップ
などがあります。
当時は必要で残しておいたファイルが今でも必要とはかぎりません。そういったファイルは定期的に削除して空き容量を確保していきましょう。
ソースインストールしたバイナリ、ローカルのgit、データベースのdumpファイル(バックアップ)など確認しておきましょう。
データ移動
システムのディスクはM.2などできるだけ高速なディスクを使いたいですが、読み書きを頻繁にしないデータを家賃の高い高速ディスク上に設置するのは無駄です。
取っておきたいデータは安価な大容量HDDに移動させることでシステムのディスク空き容量を確保しましょう。
「消すのはちょっと。。」という場合もデータの移動であれば気軽にできます
ログローテート(圧縮)
ログはアプリケーションの設定によってどのくらいの期間残すか?は変わります。
ログは舐めているとすぐに溜まっていくので、直近のログ以外は圧縮して保存するようにしましょう。
12か月、6か月、3か月などの期間を決めてそれまでのログをとっておき、それ以降のログは削除するようにした方がログ蓄積によるディスクフル状態は起きにくいです。logrotedで細かく設定が可能な他、より柔軟なバックアップポリシーを使うにはスクリプトを作ってcrotnabに登録して運用するという方法もあります。
定期バックアップを取る
定期的にサーバ全体や重要な一部を保存、スナップショットをとることでデータ削除もしやすくなります。
ディスクを逼迫している場所を探す
dfコマンドやduコマンドを駆使して容量が大きいディレクトリを探します。
$ df -h
$ du -sh ./*
(現在のディレクトリで大きいファイルを検索)
$ du -sh /*
↑のようにルートディレクトリ(上のディレクトリ)から大きいディレクトリを探していく
肥大化しやすいディレクトリは下記です
・/var/
・/home/
・/usr/
ncduを使用する
ncduはテキストユーザインターフェース版のduのようなもので、より視覚的に大きい容量のファイルを調査できます。
ncduを使ってディレクトリやファイルサイズを調査する