EBS ボリュームがマイクロバーストしているかどうかを判断する方法と、それを防ぐ方法を教えてください。

最終更新日: 2020 年 10 月 29 日

Amazon Elastic Block Store (Amazon EBS) ボリュームは、CloudWatch のスループット (バイト/秒) または IOPS (オペレーション数/秒) の制限を超過していませんが、スロットルされているように見え、レイテンシーが高く、キューの長さが長くなっています。マイクロバーストがこの原因であるかどうかを判断するにはどうすればよいですか? また、これを防ぐにはどうすればよいですか?

簡単な説明

Amazon CloudWatch では、ほぼすべてのボリュームについて 5 分ごとにサンプルを収集して、EBS ボリュームの IOPS (オペレーション数/秒) とスループット (バイト/秒) をモニタリングします。IO1 および IO2 ボリュームは、1 分間隔でサンプルを収集する詳細モニタリングをサポートします。

マイクロバーストは、EBS ボリュームが収集期間よりも大幅に短い期間で高い IOPS またはスループットを「バースト」したときに発生します。ボリュームは収集期間よりも短時間で高い IOPS またはスループットをバーストするため、CloudWatch はバーストを反映しません。

例: 950 IOPS がプロビジョニングされた IO1 ボリューム (1 分の収集期間) には、1000 IOPS を 5 秒間プッシュするアプリケーションがあります。Amazon EBS は、ボリュームの IOPS 制限に達すると、アプリケーションをスロットルします。この時点で、ボリュームがワークロードをハンドリングできないため、キューの長さが長くなりレイテンシーが高くなります。

収集期間が 60 秒のため、CloudWatch はボリュームが IOPS 制限を超過したことを示しません。1000 IOPS が発生したのは 5 秒間だけです。1 分の収集期間の残りの 55 秒間、ボリュームはアイドル状態のままでした。したがって、1 分間のVolumeReadOps + VolumeWriteOpsの回数は、5000 オペレーション (1000* 5 秒) でした。これは、その分の平均である 83.33 IOPS (5000/60 秒) に相当し、通常では問題になりません。

このケースでは、ボリュームは収集期間の残り時間はアイドル状態だったため、同じサンプル時間での VolumeIdleTime は 55 秒となります。これは、そのサンプル時間での 5000 オペレーション (VolumeReadOps + VolumeWriteOps) が、わずか 5 秒で発生したことを意味します。5000 を 5 で割り、平均 IOPS を計算します。この結果の 1000 IOPS は、ボリュームの上限に相当します。

ボリュームでマイクロバーストが発生しているかどうかを確認するには、以下の手順を実行します。

  1. CloudWatch メトリクスを使用して、可能性のあるマイクロバーストを特定します。
  2. iostat などの OS レベルのツールを使用して、マイクロバーストを確認します。
  3. アプリケーションに合わせてボリュームのサイズやタイプを変更し、マイクロバーストを防止します。

解決方法

CloudWatch を使用して、可能性のあるマイクロバーストを特定する

CloudWatch で IOPS (オペレーション数/秒) を使用してマイクロバーストを特定するには、以下の手順を実行します。

1.    VolumeIdleTime メトリクスを確認します。

VolumeIdleTime の値が大きい場合、ボリュームは収集期間の大半でアイドル状態のままとなります。同じサンプル時間で IOPS が十分に高い場合は、マイクロバーストが発生している可能性があることを示します。

2.    平均 IOPS を計算します。

VolumeReadOps および VolumeWriteOps には、収集期間内に実行された I/O オペレーションの回数のみが表示されます。ボリュームがアクティブなあいだに到達した平均 IOPS を計算するには、次の式に示すように、Sum (VolumeReadOps) + Sum (VolumeWriteOps) をボリュームのアクティブ時間で割ります。

オペレーション数/秒での実際の平均 IOPS = (合計 (VolumeReadOps) + 合計 (VolumeWriteOps))/(期間 - 合計 (VolumeIdleTime))

注: 上記の式で使用した「期間」は、CloudWatch の任意のサンプル時刻を使用します。CloudWatch グラフで指定した「期間」は、ボリュームの収集期間と同じです。

ボリュームがサポートする最大 IOPS よりも大きい値が算出された場合、マイクロバーストが発生しています。

CloudWatch でスループット (バイト/秒) を使用してマイクロバーストを特定するには、以下の手順を実行します。

1.    VolumeIdleTime メトリクスを確認します。

2.    平均スループットの計算には、次の式を使用します。

実際の平均スループット (バイト/秒) = (合計 (VolumeReadBytes) + 合計 (VolumeWriteBytes))/(期間 - 合計 (VolumeIdleTime))

注: 上記の式で使用した「期間」は、CloudWatch の任意のサンプル時刻を使用します。CloudWatch グラフで指定した「期間」は、ボリュームの収集期間と同じです。

ボリュームがサポートする最大 IOPS よりも大きい値が算出された場合、マイクロバーストが発生しています。

iostat などの OS レベルのツールを使用してマイクロバーストを確認する

上記の式では、常にマイクロバーストがリアルタイムで特定されるとは限りません。これは、VolumeIdleTime の値が小さくても、ボリュームがマイクロバーストする可能性があるためです。

例: ボリュームがボリュームの制限を超過するレベルまで急増します。ボリュームはその後、収集期間の残り時間は完全にアイドル状態になることなく、非常に低いレベルのアクティビティまで減少します。VolumeIdleTime メトリクスは、マイクロバーストが発生しても低いレベルのアクティビティを反映しません。

マイクロバーストの確認には、CloudWatch よりも細分性の高い iostat などの OS レベルのツールを使用します。iostat の詳細については、Linux のマニュアルページの iostat(1) を参照してください。

1.    iostat を使用して次のコマンドを実行し、マウントされたすべてのボリュームの I/O 統計値を 1 秒単位の細分性でレポートします。

iostat -xdmzt 1

注: iostat ツールは sysstat パッケージの一部です。iostat コマンドが見つからない場合は、次のコマンドを実行して Amazon Linux AMI に sysstat をインストールします。

$ sudo yum install sysstat -y

2.    スループットの制限に達しているかどうかを判断するには、出力の rMB/swMB/s を確認します。rMB/s + wMB/s がボリュームの最大スループットより大きい場合は、マイクロバーストが発生しています。

IOPS の制限に達しているかどうかを判断するには、出力の r/sw/s を確認します。r/s + w/s がボリュームの最大 IOPS より大きい場合は、マイクロバーストが発生しています。

アプリケーションに合わせてボリュームのサイズやタイプを変更し、マイクロバーストを防止する

必要とする IOPS とスループットに対応するタイプやサイズにボリュームを変更します。ボリュームタイプと、それぞれの IOPS およびスループットの制限の詳細については、「Amazon EBS ボリュームタイプ」を参照してください。アタッチされているすべての EBS ボリュームにインスタンスがプッシュできる IOPS およびスループットには制限があることに注意してください。

ワークロードに対するボリュームのベンチマークを実施し、テスト環境でワークロードに安全に対応するボリュームタイプを確認することがベストプラクティスです。詳細については、EBS ボリュームのベンチマークを参照してください。</p


この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?