Zabbix クラウド時代のディスクI/O性能監視(sar -d)

Zabbix クラウド時代のディスクI/O性能監視(sar -d)
あぱーブログ
2016年3月13日  カテゴリー:Zabbix  タグ:
Pocket
LINEで送る

クラウド型仮想サーバで多く発生するトラブルとして、ディスクI/O性能の低下があります。物理サーバでは、ディスク障害や I/Oリクエストの増加により、I/O性能が低下することがありますが、クラウド型仮想サーバでは、 I/Oリクエスト数は変わっていないのに、ディスクI/O性能だけが低下することがあります。この性能低下の原因は、他の仮想サーバの巨大なI/O負荷や、クラウド事業者によるI/Oリクエスト制限によるものです。そこで今回は、これらの点に注意して Zabbix でディスクI/O性能を監視する設定を考えてみました。

I/Oリクエスト制限とは?

クラウドやVPSで使われている、サーバの仮想化技術は、1台の物理サーバ上に、複数のサーバを稼働できるため、サーバリソースを有効に使えます。そのため、利用料金のコストダウンに繋がり、私達ユーザは低価格でサーバを導入できるようになりました。

一方、サーバの仮想化で、一番ボトルネックになりやすいのが、ディスクI/O性能の低下です。そのため、詳細は公開されていませんが、クラウド事業者では、仮想サーバの I/Oリクエストを制限することがあるそうです。

通常はこの「I/Oリクエスト制限」が問題になることはありませんが、仮想サーバが極端にI/O負荷をかけると、I/Oリクエスト制限が厳しくなり、結果ディスクI/O性能が低下し、サービスレベルにまで影響が及ぶことがあります。

SLAなどで、I/O性能を保証してくれると嬉しいのですが、現時点で(2016年3月13日)具体的にI/O性能を保証しているのは、AWSの「Provisioned IOPS SSD ボリューム」くらいしか見つけられませんでした。

Provisioned IOPS SSD ボリュームは、ランダムアクセス I/O スループットにおけるストレージパフォーマンスと整合性が重要な、I/O 集約型ワークロード(特にデータベースワークロード)のニーズを満たすように設計されています。ボリューム作成時に IOPS レートを指定します。Amazon EBS は 1 年間のうちの 99.9%、プロビジョンド IOPS をパフォーマンスの 10% 内で提供します。

Amazon EBS ボリュームの種類 - Amazon Elastic Compute Cloud より引用

マルチコアCPUでの I/O負荷監視の注意点

マルチコアCPUで、I/O待ち時間の割合を監視している場合に、CPU全体で「I/O待ちがちょっと多いかな」くらいで表示されていても、コア毎に見ると、1つのコアでI/O待ちが100%で張り付いていることがあります。

下のサンプルは CPU(all) の %iowait は「30.0」ですが、CPUのコア毎に負荷を見ると、CPU(0) の %iowait が「100.0」になり、サービス遅延が発生しています。

・CPU全体のI/O待ち

・コア毎のI/O待ち

OSやアプリケーションがマルチコアに最適化されれば、各CPUコアに負荷が分散されるため、こういったことは無くなると思いますが、今のところは気をつけて監視した方が良さそうです。

監視方法としては、CPUのコア毎に負荷を監視するか、直接ディスクI/Oの状況を監視することになります。ディスクI/Oの状況を監視しておくと、I/Oリクエスト数や、I/O待ち時間の推移を残しておけますので、今回は、ディスクI/O状況を Zabbixで監視してみたいと思います。

ディスクI/O状況の確認コマンド(sar -d)

Linuxでは、ディスクI/O状況が確認できるコマンドは色々ありますが、イチオシは sar コマンドの -d オプションです。1秒あたりの I/Oリクエスト数や、I/O待ち時間を一目で確認できます。

DEV
 ディスクデバイス名、メジャー番号とマイナー番号で表示されているので「sar -d -p」とすると、デバイスを特定しやすいと思います。

tps
 1秒あたりの I/Oリクエスト数

rd_sec/s
 1秒あたりに読み込まれたセクタ数(セクタは512バイト)

wr_sec/s
 1秒あたりに書込まれたセクタ数(セクタは512バイト)

avgrq-sz
 I/Oリクエストの(セクタの)平均サイズ

avgqu-sz
 I/Oリクエストの平均キュー(待ち)数

await
 I/Oリクエストの平均待ち時間(単位はミリ秒)キューでの待ち時間も含む

svctm
 I/Oリクエストの平均処理時間(単位はミリ秒)

%util
 CPUがディスクI/O待ちのために消費した時間の割合

Zabbix エージェントの設定

「sar -d」の出力結果を、Zabbixのユーザパラメータを使って取得します。今回は監視対象を、ルート「/」パーテーションとします。

はじめに、lsblk コマンドを使って、ルート「/」パーテーションのディスクデバイス名を特定します。

ルート「/」パーテーションの、メジャー番号:マイナー番号が「253:0」ですので、sar コマンドの「dev253-0」の行が、ルート「/」パーテーションの、ディスクI/O状況になります。

 
以上をふまえ、ルートパーティションの「tps」の最新の値を取得するコマンドは、以下のようになります。grep で平均行(Average)を取り除く必要があるため、必ず英語で出力するように「env LANG=C」としておきます。

env LANG=C sar 1 1 -d | grep dev253-0 | grep -v Average | awk '{print$3}'
7.00 ← tpsの値

Zabbixエージェントが「sar -d」の各値を取得できるように、上のコマンドをユーザーパラメータ(UserParameter)として追加します。赤字の部分が、Zabbixのアイテムキーになります。

sudo vim /etc/zabbix/zabbix_agentd.d/userparameter_sar-d.conf

UserParameter=sar-d.tps,env LANG=C sar -d 1 1 | grep dev253-0 | grep -v Average | awk '{print$3}'
UserParameter=sar-d.rd_sec,env LANG=C sar -d 1 1 | grep dev253-0 | grep -v Average | awk '{print$4}'
UserParameter=sar-d.wr_sec,env LANG=C sar -d 1 1 | grep dev253-0 | grep -v Average | awk '{print$5}'
UserParameter=sar-d.avgrq-sz,env LANG=C sar -d 1 1 | grep dev253-0 | grep -v Average | awk '{print$6}'
UserParameter=sar-d.avgqu-sz,env LANG=C sar -d 1 1 | grep dev253-0 | grep -v Average | awk '{print$7}'
UserParameter=sar-d.await,env LANG=C sar -d 1 1 | grep dev253-0 | grep -v Average | awk '{print$8}'
UserParameter=sar-d.svctm,env LANG=C sar -d 1 1 | grep dev253-0 | grep -v Average | awk '{print$9}'
UserParameter=sar-d.util,env LANG=C sar -d 1 1 | grep dev253-0 | grep -v Average | awk '{print$10}'

Zabbixエージェントを再起動します。

systemctl restart zabbix-agent

動作確認

Zabbixサーバ側で zabbix_get コマンドを使って、上で追加したアイテムキーで値が取得できるか確認します。sar -d コマンドと同じ出力結果が返ってくればOKです。

zabbix_get -s 172.16.1.108 -k sar-d.tps
3.22 ←tpsの値が取得できた

Zabbix サーバの設定

テンプレートの作成

ディスク状態監視用のテンンプレートを作成します。このテンプレートに、先ほどユーザーパラメータにて追加したアイテムキーを設定します。

[設定]→[テンプレート]→[テンプレートの作成]をクリックします。

[テンプレート]タブを選択 テンプレート名とグループを入力または選択し「追加」をクリックすればテンプレートが作成されます。


 ↓

アイテムの作成

作成したテンプレートにアイテムを追加します。

[設定]→[テンプレート] 「My Template Disk IO」行の「アイテム」をクリックします。

「アイテムの作成」をクリックします。

下記を設定し「追加」をクリックすればアイテムが作成されます。「キー」にユーザパラメータにて追加したアイテムキーを設定します。(データ型「数値(浮動小数)」を選択するのを忘れずに!)


---(設定箇所)---------------------------
名前:5010_tps
キー:sar-d.tps
データ型:数値(浮動小数)
更新間隔(秒):60
アプリケーションの作成:disk IO
------------------------------

同様に他のアイテムキーも追加していきます。すべてのアイテムキーを追加すると以下のようになります。(名前の先頭に数値を付けているのは、並び順を制御するためです)

動作確認

作成した「My Template Disk IO」テンプレートを監視対象のホスト(ユーザーパラメータを追加したホスト)に適用して、値を取得できていることを確認します。

[監視データ]→[概要]

特に注目すべきは、tps(1秒あたりの I/Oリクエスト数)と、await(I/Oリクエストの平均待ち時間)です。この辺りをトリガーキーにしても良いかと思います。

終わりに

上にも書きましたが、国産クラウドやVPSでも、SLAまで行かなくても、スペックにディスクI/0性能の目安を表示してくれるとありがたいですね。

スポンサーリンク
Pocket
LINEで送る

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です