リソース監視ツール「マカレル」の導入方法と監視項目の見方

WordPress を動かしている EC2 インスタンスが時々応答しなくなるので、外形監視を入れて通知するようにしました。

https://hodalog.com/alive-monitoring-by-uptime-robot/

外形監視のおかげで問題が発生した時に気づける体制になりましたが、根本的な対策を施すには CPU やメモリの使用率などのリソースを監視し、分析する必要があります。

そこで、はてなのマカレルというツールでリソースを監視することにしました。

リソース監視とは

CPU やメモリの使用率など、サーバーのリソース情報を取得、分析することをリソース監視またはメトリクス監視と呼びます。どれだけの負荷がかかっているのか定量的に調査できるため、障害発生時の原因特定や対策を決めるための指標となります。

監視する項目としては大きく次の 4 つがあります。

  • CPU 使用率
  • メモリ使用率
  • ディスク I/O(ディスクの読み書き量)
  • ネットワーク I/O(ネットワークの読み書き量)

リソース監視ツールについて

機能に制限はありますが、前述した 4 項目を無料でモニタリングできるツールとして DataDog 、 はてなの マカレル 、AWS の CloudWatch などがあります。

それぞれ軽く使ってみた所感ですが

  • DataDog > オシャンティー
  • マカレル > みやすい
  • CloudWatch > なんかわかりにくい

という感じだったので、取り急ぎマカレルを導入しました。

マカレルの導入手順

マカレルのマニュアルがかなり分かりやすいので迷う要素がありませんでした。導入の流れは下記です。

  1. マカレルにサインアップ
  2. オーガナイゼーションを作成
  3. ホスト(監視対象のサーバー)にエージェントをインストール
  4. 必要に応じてサービス名とかロールを作成して設定
  5. あとは自動で取得されるデータを眺めるだけ

こんな感じでデータが取得できます。

リソース監視ツールのマカレルで表示できるリソースデータ

監視項目について

マカレルはデフォルトで 6 つのデータを取得する設定となっています。

  • loadavg5
  • cpu
  • memory
  • disk
  • interface
  • filesystem

loadavg5

5 分間のロードアベレージ、負荷平均のことです。実行待ちとなっているプロセス数の平均数を表していて、この値が大きいほど負荷が大きく、小さいほど余裕がある状態です。

Linux では uptimewtop コマンドなどで確認できます。

コマンド出力結果の load average:  の項目、左から順に 1min、5min、15min の負荷平均を表しています。マカレルに表示されているのは 5min の平均値です。

cpu

CPU の使用率を表します。マカレルではデフォルトで9種類のデータを拾ってくれます。このうち実務でもよくチェックするのは user、system、idle の値です。

  • user - カーネル以外の、ユーザー側で動作しているプロセスの CPU 使用率
  • nice - nice 値を設定しているプロセスの CPU 使用率
  • system - カーネル側で動作しているプロセスの CPU 使用率
  • irq - カーネルの割り込み処理の CPU 使用率
  • softirq - カーネルのソフト割り込み処理の CPU 使用率
  • iowait - I/O 待ちによりアイドル状態になった CPU リソースの割合
  • steal - ゲスト OS(他の仮想マシン)に盗られた CPU リソースの割合
  • guest -  ゲスト OS(他の仮想マシン)の CPU 使用率
  • idle - アイドル状態(何も使われていない)の割合

カーネルとユーザー空間について

カーネルは Linux の中枢となるシステムのこと。ユーザー空間はカーネル以外の部分のソフトウェア群のこと。ユーザー空間で動作しているソフトウェアは、例えば Nginx や Apache、PHP とかです。

nice 値について

Linux ではプロセスの優先度を nice という値で管理しています。nice は-20〜+19 の値をとり、高いほど優先度が低く、nice が低いほど優先度が高くなります。nice の値は通常 0 ですが、 nice コマンドで設定を変更できます。

割り込み処理について

割り込みは、とあるプログラムを実行中に別のプログラムからの応答を受けて、並列処理したりするための仕組みのことです。SSD ドライブやマウスのような入力デバイスからカーネルの機能を呼び出すときなどに発生します(この場合はハードウェア割り込み)。カーネルがソフトウェア的に作り出す割り込み処理はソフトウェア割り込みと呼ばれています。

I/O 処理について

ここでの I/O はディスクやネットワークの入出力のこと。

Steal について

一つのホスト上に複数の VM が建っている時、ホストのリソースを VM 同士で奪い合うことがあり、これを Steal と言います。AWS は一つのホストに、複数のユーザーによって建てられた VM が混在している状態(マルチテナンシー)なので、Steal が発生することがあります。AWS では Steal を防ぐ手段として、単一のハードウェアを専有できるシングルテナンシーサービスを提供しています(めちゃくちゃお高いですが)。

guest と steal 以外は topvmstatsar コマンドなどで確認できます。

memory

メモリの使用状況についてチェックできます。

  • used - メモリの使用量
  • available - 利用できるメモリ領域(available = total - used)
  • total - ホストに積んである最大メモリの容量(total = used + available)
  • swap chached - スワップキャッシュの量
  • swap used - スワップ領域の使用量
  • swap total - スワップ可能な量(total = swap chached + swap used)

スワップについて

サーバーに負荷がかかって処理が追いつかなくなると、メモリの容量を超えた分を応急処置としてディスクで読み書きするようになります。これを スワップアウト と言います。ディスクの読み書き速度はメモリに比べてめちゃくそ遅いのでパフォーマンスは悪いです。そのため、スワップ領域を使う必要がない運用・設定にするのが望ましいです。逆に、スワップアウトした内容を再度メモリに読み込むことを スワップイン と言います。一度スワップアウト・インするとデータは スワップキャッシュ に保持されます。再度スワップ処理が発生した場合、スワップ処理が効率よく動作します。

Linux では vmstatfree コマンドなどで確認できます。

disk

ディスクの読み書きに関する、IOPS(1 秒あたりの I/O アクセス)の値をチェックできます。ディスクの読み書きはデータベースやストレージ用途のサーバーで顕著に現れるため、そういったサーバーで注視すべきメトリクスです。

Linux では sariostatvmstat -d コマンドなどで確認できます。

interface

ネットワーク帯域の使用状況です。単位は KB/秒tx は送信、 rx は受信です。

AWS ではネットワークの通信料がかかるので、帯域をガバガバ利用していないか注視すると良いと思います。

filesystem

ディスクのサイズと使用量をチェックできます。Linux では df コマンドで確認できます。ディレクトリ以下のサイズをチェックする場合は du コマンドを使います。

監視アラートの設定

CPU の使用率が 90%!を(MISSING)超えた時に通知をだす、というような設定ができます。

とりあえず cpu と memory に対して設定しておきました。対応が迅速にできれば VM がダウンする前に救出したりできるかもですね!

まとめ

マカレルを導入していい感じにリソース監視できるようになりました。やったね!