クラウド型仮想サーバで多く発生するトラブルとして、ディスク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% 内で提供します。
マルチコア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待ち
sar -p 00時00分01秒 CPU %user %nice %system %iowait %steal %idle 00時10分01秒 all 0.83 0.00 0.26 30.0 0.02 70.0
・コア毎のI/O待ち
sar -P ALL 00時00分01秒 CPU %user %nice %system %iowait %steal %idle 00時10分01秒 all 0.83 0.00 0.26 30.0 0.02 70.0 00時10分01秒 0 0.95 0.00 0.24 100.0 0.04 0.00 00時10分01秒 1 0.72 0.00 0.30 0.02 0.02 98.94 00時10分01秒 2 0.82 0.00 0.25 0.01 0.01 98.91
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待ち時間を一目で確認できます。
sar -d 05時18分46秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 05時18分47秒 dev8-0 6.00 0.00 20.00 3.33 0.04 6.67 6.67 4.00 05時18分47秒 dev253-0 4.00 0.00 20.00 5.00 0.04 10.00 10.00 4.00 05時18分47秒 dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
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 コマンドを使って、ルート「/」パーテーションのディスクデバイス名を特定します。
lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 8G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 7.5G 0 part ├─centos-root 253:0 0 6.7G 0 lvm / └─centos-swap 253:1 0 820M 0 lvm [SWAP] sr0 11:0 1 1024M 0 rom sr1 11:1 1 1024M 0 rom
ルート「/」パーテーションの、メジャー番号:マイナー番号が「253:0」ですので、sar コマンドの「dev253-0」の行が、ルート「/」パーテーションの、ディスクI/O状況になります。
平均値: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 平均値: dev8-0 3.54 0.00 11.81 3.33 0.03 7.11 7.11 2.52 平均値: dev253-0 2.36 0.00 11.81 5.00 0.03 10.67 10.67 2.52 平均値: dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
以上をふまえ、ルートパーティションの「tps」の最新の値を取得するコマンドは、以下のようになります。grep で平均行(Average)を取り除く必要があるため、必ず英語で出力するように「env LANG=C」としておきます。
7.00 ← tpsの値
Zabbixエージェントが「sar -d」の各値を取得できるように、上のコマンドをユーザーパラメータ(UserParameter)として追加します。赤字の部分が、Zabbixのアイテムキーになります。
sudo vim /etc/zabbix/zabbix_agentd.d/userparameter_sar-d.conf
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エージェントを再起動します。
動作確認
Zabbixサーバ側で zabbix_get コマンドを使って、上で追加したアイテムキーで値が取得できるか確認します。sar -d コマンドと同じ出力結果が返ってくればOKです。
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性能の目安を表示してくれるとありがたいですね。
コメント