衝撃的事実
CloudwatchはagentをEC2に入れることで、指定したメトリクスなどを取得することが出来ますが、自分はよく考えもせず以下の値をagentに設定してディスク使用率を取得していました。
"disk": {
"measurement": [
"used_percent"
],
"metrics_collection_interval": 60,
"resources": [
"*"
]
}
とりあえず全部取っといて、インスタンス指定してディスク使用率取っとけば容量圧迫してもアラームで気付けるでしょと。
その後、取得してるデータからなにが圧迫してるか見ればいいかと。
インスタンス指定してディスク使用率にアラームを設定するというのは以下の画像のような状態です。
上記configファイルの設定でリソースを「*」にして、なにも指定せずにディスク使用率を取得すると、インスタンス単位での取得の他に、マウントポイントごとに取得されます。
しかしなんと、インスタンスを指定しても全体のディスク使用率が取得できるわけではありません。
インスタンスで指定しているから、使っているディスク全体の使用率を見ていると勝手に思っていました、、
ではインスタンスを指定して取得できるデータは何なのか。
OS上で全体のディスク使用率を見てみます。
df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 475M 0 475M 0% /dev/shm
tmpfs 190M 432K 190M 1% /run
/dev/xvda1 8.0G 2.0G 6.1G 25% /
tmpfs 475M 0 475M 0% /tmp
/dev/xvda128 10M 1.3M 8.7M 13% /boot/efi
tmpfs 95M 0 95M 0% /run/user/0
この中のどの使用率を取得しているのか。
答えは、これら全ての使用率を平均した値を取得しています。
例えば上記の「/tmp」は475MBの容量がありますが、ここの容量が100%になったとします。
そうするとインスタンス指定で取得するデータの計算は以下です。
平均 = (0 + 0 + 1 + 25 + 100 + 13 + 0) ÷ 7 = 19.86%
アラーム設定としては「/tmp」が100%になってもインスタンスの使用率としては「19.86%」となっているためアラームには引っかかりません。
元々インスタンスを指定すれば全体のディスク使用率を取得できると思っていました。
しかし実際はそれぞれの領域の使用率の平均を取得していました。
「/」の容量(オレンジの線)が増えても、以下のようにインスタンス単位のデータはほとんど変わりません。
そもそも、ディスク全体の使用率を取得できたとしても、例えば常時ログが保管されるディレクトリが100%になっても気づけないので、ディスク全体を監視する必要ってないんじゃないかと思います。
監視するとしても「/」や、追加でアタッチしたディスクのマウント先とかに対してでないと意味を為さないでしょう。
気づいたきっかけ
なぜこれに気付けたかも自分のために残しておきます。
CloudWatchには、「CloudWatch Metric Streams」という機能があり、メトリクス情報を直接S3に送ることが出来ます。
ただ、課金対象がメトリクスごとになっており、領域を絞らずに取得しているといらないデータも全部S3に送って無駄な課金が発生してしまいます。
(CloudWatch Metric Streams機能はインスタンス単位で絞れずメトリクス単位で選択するため、disk_used_percentを選択すると取得しているすべてのdisk_used_percentメトリクスが対象となります。)
そのため取得を「/」だけに絞って課金を抑えようと見ていたら、ディスク全体の使用率だと思っていた「/」とインスタンス指定で取得していたメトリクスに差異があることに気付きました。。
そもそも「/」も全体のディスク使用率ではなかったです、、
先ほど例に挙げた以下も、「/」の下に「/tmp」とかがあるから、「/tmp」の使用率が上がれば「/」の使用率も上がると思っていましたが、マウント先が別であれば領域として別にみなされるため、「/」の下に「/tmp」があろうと表示される使用率は全く別物ということでした。
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 475M 0 475M 0% /dev/shm
tmpfs 190M 432K 190M 1% /run
/dev/xvda1 8.0G 2.0G 6.1G 25% /
tmpfs 475M 0 475M 0% /tmp
/dev/xvda128 10M 1.3M 8.7M 13% /boot/efi
tmpfs 95M 0 95M 0% /run/user/0
補足
インスタンス指定だと、全体の使用率を平均した値を取得すると言いましたが、厳密には取得しているdisk_used_percentカスタムメトリクスを平均した値となるため、「/」だけを取得するようにすると、平均化するためのデータとして「/」しかなくなり、インスタンス指定の値は「/」とイコールになります。
以上!!