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

最終更新日: 2020 年 12 月 17 日

使用している Amazon Elastic Block Store (Amazon EBS) ボリュームが、Amazon 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 秒) でした。これは、その 1 分間の平均が 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 = (Sum(VolumeReadOps) + Sum(VolumeWriteOps) ) ÷ ( Period - Sum(VolumeIdleTime) )

注意: 上記の式で使用した「Period」は、CloudWatch における所定の時間のサンプルを使用します。指定された CloudWatch グラフの「Period」は、ボリュームの収集間隔と同じです。

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

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

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

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

実際の平均スループット (バイト/秒) = (Sum(VolumeReadBytes) + Sum(VolumeWriteBytes) ) ÷ ( Period - Sum(VolumeIdleTime) )

注意: 上記の式で使用した「Period」は、CloudWatch における所定の時間のサンプルを使用します。指定された CloudWatch グラフの「Period」は、ボリュームの収集間隔と同じです。

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

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


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


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