ディスク容量の枯渇予測スクリプト

zabbix で、せっかくディスク空き容量の推移を取得しているのだから、
その履歴データを有効に活用してみようと思って、スクリプトを書いてみました。

◆対象環境
 ・Linux (CentOS6 にて確認)
 ・zabbix 2.0.x (同 2.0.3 にて確認)
 ・MySQL 5.x (同 5.5.27 にて確認)
 ・php 5.x (同 5.4.6 にて確認)
 ・vfs.fs.size[/mount/point,free] というアイテムで、
  サーバのディスク空き容量推移を取得していること
 ・空き容量推移の取得間隔が、短すぎないこと(1時間に1~6回程度)
 ・空き容量推移の履歴を、30 日程度DBに保持していること

ディスクが徐々に埋まってきているのだけれども、
注意して観察していない限り、監視アイテム・トリガーで警告にならないと
容量不足が迫ってきていることに気づきません。
自分個人のサーバなら、埋まる直前でも増設作業が可能だったりしますが、
そううまく行かないことも多いのが現実‥。

◆処理内容・判定基準

私見まみれの判断基準による判定処理なのですが‥
vfs.fs.size[/mount/point,free] というアイテムによって、
過去 30 日程度の履歴が取得されているサーバを対象に、

・1日前を基準に、過去3日間の範囲  →A
・6日前を基準に、過去3日間の範囲  →B
・16日前を基準に、過去3日間の範囲 →C
・27日前を基準に、過去3日間の範囲 →D

というそれぞれの期間における「平均値」「最小値」を算出。

・期間Dの平均値 → 期間Cの平均値
・期間Cの平均値 → 期間Bの平均値
・期間Bの平均値 → 期間Aの平均値
・期間Dの最小値 → 期間Cの最小値
・期間Cの最小値 → 期間Bの最小値
・期間Bの最小値 → 期間Aの最小値

という形で、それぞれの期間と期間のあいだに発生した容量変化量を算出。

その中で、いちばん容量減少率の大きかったパターンから、
「一定時間に発生してしまう空き領域の減少量」を仮算定。

現時点での「空き容量の最新値」から、「容量減少の度合い」を基に、
「いつ頃枯渇してしまうのか?」を算出

というような、回りくどいことをやっています

保存されているデータ全体から、単純に min/max/avg などを採っても良かったのですが、
ある程度の時間経過において、「時々は埋まるけれども、また空き容量が増える」といった
使われ方をしている場合に、誤差を拾いにくくするための措置です

DB を直接参照していますので、zabbix のバージョンが異なるとうまく動かないかもしれません

◆使い方

DB サーバ上、もしくは zabbix server 上にスクリプトを配置しておいて、
zabbix_agentd の UserParameter 経由で、本 php スクリプトを実行。
DB から枯渇時期を示す値を算出させ、zabbix_sender コマンドを利用して、
trapper アイテムとして定義した「枯渇までの時間」アイテムへ
値を叩きこむ仕様です

1.添付 predict.php の先頭部分、環境に合わせ、設定を書き換えます
2.添付 predict.php を、適当なパスへ配置します
3.ディスクの枯渇を監視したいサーバに対して、アイテム・トリガーを追加します
---- (1) 空き容量取得用アイテム ---------------------
タイプ : ZABBIX エージェント
キー : vfs.fs.size[/path/to/monitoring,free]
データ型 : 数値(整数)
データ形式 : 10進数
単位 : B
更新間隔 : <<あまり短過ぎない値>> - 30分~くらいがいいかも?
ヒストリの保存期間 : 30 以上
-------------------------
---- (2) 枯渇時期予測値を書き込むための Trapper アイテム ---------------------
タイプ : ZABBIX トラッパー
キー : trapper.vfs.fs.predict[/path/to/monitoring]
データ型 : 数値(整数)
データ形式 : 10進数
単位 : uptime
-------------------------
---- (3) 枯渇予測が一定を下回ったときの警告用トリガー ---------------------
下記例は、30 日以内になったら警告する場合
条件式 : {targethost:trapper.vfs.fs.predict[/path/to/monitoring].last(0)}<30d
-------------------------
4.DB/Zabbix サーバの zabbix_agentd.conf へ、UserParameter 設定を追加します
-------------------------
# DB へアクセスするので、短すぎると失敗するかも?
Timeout=30
# php コマンドへのパスと、スクリプトへのパスを確認
UserParameter=user.vfs.fs.calc.predict, /usr/local/bin/php /path/to/script/predict.php
-------------------------
5.設定書き換えの反映のため、DB/Zabbix サーバの zabbix_agentd を再起動
6.DB/Zabbix サーバに対して、本スクリプトを実行させるためのアイテムと、実行失敗検知用のトリガーを追加
このアイテム1つで、該当 DB に登録されている全ホストの枯渇予測値を更新します
正常終了時には「0」、失敗時はそれ以外が出力されるので、それを捕まえます
---- (1) 枯渇時期情報アップデート用アイテム ---------------------
タイプ : ZABBIX エージェント
キー : user.vfs.fs.calc.predict
データ型 : 数値(整数)
データ形式 : 10進数
更新間隔 : 1日~くらいがいいかも?
ヒストリ : 短くて構いません
-------------------------
---- (2) 枯渇時期情報アップデートの失敗検知用トリガー ---------------------
条件式 : {DBSERVERHOST:user.vfs.fs.calc.predict.last(0)}#0
-------------------------

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー KAZ の写真

これ良いですね!
昔、ホスティングサービスでZabbix使ってDISK容量監視してたんですが、DISK容量残量はグラフ見ながら1週間単位で人力で計算してましたね。A(^^;
それが自動的にアラートが上がる仕組みは運用的には楽ですね。

今時のクラウドは自動拡張するかもしれませんが…A(^^;
自動拡張の無い環境には嬉しいですね。

ユーザー fripper の写真

対象サーバの台数が多いと、結構な演算量になってしまうので、
手順(6)の部分については、Zabbix サーバ側の cron で処理するなどの
手法も考えられます。

もっとも、一番重要な部分は、予測のアルゴリズム部分なので、
もっと良い指標とか、演算方法があればいいんですけどね‥

「今日いきなり使用量がガクンと上がった」などには対応しきれないのが事実なので。