年末年始のディスク容量アラートを回帰分析で回避しよう

こんばんは、 id:stanaka / @stanaka です。この記事は Mackerel Advent Calendar 2015 の20日目の記事です。

インフラエンジニアとかSREとか呼ばれている人は、長期休暇中にディスク容量が100%に達してしまったことによるアラートに現実に戻された経験を少なくとも一度はされていると思います。 その経験から、この年末年始前にも担当サーバーのディスク残容量チェックをされるかと思いますが、Mackerelを使うと要対処ホストが一瞬でリスト化できるようになりますので、その方法を紹介します。

先日Mackerelではmetricの値を取得するAPIがリリース(参考: https://mackerel.io/ja/blog/entry/2015/12/04/105057 )されていますので、これを利用してデータを取り出して分析します。予測はシンプルに最小二乗法による線形回帰分析を利用してみます。

統計分析といえばPythonだよな、ということでPythonで実装してみました。 回帰分析にはpandasのols(Standard ordinary least squares (OLS) multiple regression)を利用してみました。 pandasのolsについての解説は以下の記事などを参考にしてください。

というわけで、ディスク容量の回帰分析による予測をしてみましょう。コードは以下にあります。(python初心者ですので雑なコードですみません)

https://gist.github.com/stanaka/00d20c3f3d5d66bd375c

次のライブラリを入れる必要があります(過不足あるかもしれません)。

pip install numpy
pip install pandas
pip install statsmodels
pip install matplotlib
pip install scipy

実行すると次のグラフが得られます。(スクリプトの冒頭でホスト名を与えるようにしていますので、適宜書き換えてください)

青の点(数が多すぎて線になってしまっていますが..)が実データで緑の線が回帰分析による線となります。それっぽいですね。

ここから、ディスク容量までの到達時間を計算するようにし、さらにオーガニゼーション内の全ホストを調査するようにしてみました。コードは以下にあります。(python初心者ですので以下略)

https://gist.github.com/stanaka/a593bee5f53eeeadad23

実行するとのんびりと順番にAPIを叩いた後、次のような結果が得られます(APIの叩く頻度は数秒に1回程度にご配慮ください)。ソート順はホスト単位でファイルシステムの寿命順としています。複数のファイルシステムを持つホストについては、その中で最短の寿命で計算させています。ちなみにここでのファイルシステムの寿命とは容量が100%に達するまでの時間のことです。

fooproxy:sda1, size: 808.48 GB/1.62 TB, full in 187d22h29m28.490645s
foodb01:sdb1, size: 36.74 GB/52.84 GB, full in 478d1h12m31.461298s
foodb01:sda1, size: 1.74 GB/21.14 GB, full in 174624d18h43m36.810938s
fooapp01:sda1, size: 10.14 GB/21.14 GB, full in 768d7h59m9.087334s
foodb02:sdb1, size: 23.44 GB/52.84 GB, full in 897d11h57m15.711874s
foodb02:sda1, size: 1.74 GB/21.14 GB, full in 162214d18h50m12.952906s
...

どうやら、最短のものでも約188日と半年は持つようです。これで年末年始も安心ですね!

ちなみにディスク容量の回帰分析は時間毎の増分の変化、特にログローテートの影響を受けますので、ある程度以上長いデータを元にすることで精度があげられます。 Freeプランだと1日分しかデータがとれず、回帰分析の精度がいまいちですのでStandardプランへのアップグレードをお勧めしておきます:P