仮想マシンとディスクのパフォーマンス

この記事は、ディスクのパフォーマンスと、Azure Virtual Machines と Azure ディスクを組み合わせたときの動作のしくみを明確にするために役立ちます。 ディスク IO のボトルネックを診断する方法と、パフォーマンスを最適化するために行うことができる変更についても説明します。

ディスクのパフォーマンス動作のしくみ

Azure 仮想マシンには、仮想マシンの種類とサイズに基づく 1 秒あたりの入出力操作 (IOPS) とスループットのパフォーマンス制限があります。 OS ディスクとデータ ディスクを仮想マシンに接続できます。 ディスクには、独自の IOPS とスループットの制限があります。

仮想マシンまたは接続されているディスクに割り当てられているものを超える IOPS またはスループットが要求された場合、アプリケーションのパフォーマンスは上限に達します。 上限に達した場合、アプリケーションのパフォーマンスは最適とはいえません。 これにより、待機時間の増加などの悪影響が生じる可能性があります。 この概念を明確にするために、いくつかの例を見てみましょう。 これらの例を簡単に追跡できるように、IOPS のみを確認します。 ただし、スループットにも同じロジックが適用されます。

ディスク IO の上限

セットアップ:

  • Standard_D8s_v3
    • キャッシュされない IOPS:12,800
  • E30 OS ディスク
    • IOPS:500
  • 2 台の E30 データ ディスク × 2
    • IOPS:500

ディスク レベルの上限を示す図。

仮想マシンで実行されるアプリケーションで、仮想マシンに 10,000 IOPS を必要とする要求を行います。 Standard_D8s_v3 仮想マシンは最大 12,800 IOPS を実行できるため、VM でそのすべてが可能です。

10,000 IOPS 要求は、異なるディスクに対する 3 つの異なる要求に分割されます。

  • オペレーティング システム ディスクに 1,000 IOPS が要求されます。
  • 各データ ディスクに 4,500 IOPS が要求されます。

接続されているディスクはすべて E30 ディスクであり、500 IOPS のみを処理できます。 そのため、それぞれ 500 IOPS で応答します。 接続されたディスクによってアプリケーションのパフォーマンスが制限され、1,500 IOPS しか処理できません。 Premium SSD P30 ディスクなどのパフォーマンスが高いディスクを使用した場合、アプリケーションが 10,000 IOPS のピーク パフォーマンスで動作する可能性があります。

仮想マシンの IO 上限

セットアップ:

  • Standard_D8s_v3
    • キャッシュされない IOPS:12,800
  • P30 OS ディスク
    • IOPS:5,000
  • 2 台の P30 データ ディスク × 2
    • IOPS:5,000

仮想マシン レベルの上限を示す図。

仮想マシンで実行されるアプリケーションで、15,000 IOPS を必要とする要求を行います。 残念ながら、Standard_D8s_v3 仮想マシンは 12,800 IOPS を処理するようにのみプロビジョニングされています。 アプリケーションで仮想マシンの制限による上限が発生し、割り当て済みの 12,800 IOPS を割り当てる必要があります。

要求された 12,800 IOPS は、異なるディスクに対する 3 つの異なる要求に分割されます。

  • オペレーティング システム ディスクに 4,267 IOPS が要求されます。
  • 各データ ディスクに 4,266 IOPS が要求されます。

接続されているディスクはすべて P30 ディスクであり、5,000 IOPS を処理できます。 そのため、要求された量で応答します。

非キャッシュ時とキャッシュ時の仮想マシンの制限

Premium Storage と Premium Storage キャッシュの両方に対応した仮想マシンでは、2 つの異なるストレージ帯域幅の制限があります。 例として、Standard_D8s_v3 仮想マシンを見てみましょう。 Dsv3 シリーズと Standard_D8s_v3 に関するドキュメントを次に示します。

Ds v3 の仕様を示すグラフ。

  • "キャッシュされない" ディスクの最大スループットは、仮想マシンが処理できる既定のストレージの上限になります。
  • キャッシュされる ストレージのスループットの上限は、ホストキャッシュを有効にすると、別個の制限になります。

ホスト キャッシュは、書き込みまたは読み取りを迅速に実行できるストレージを VM の近くに配置することで機能します。 ホスト キャッシュ用に VM で使用できるストレージの容量は、ドキュメントに記載されています。 たとえば、Standard_D8s_v3 には 200 GiB のキャッシュ ストレージが備わっていることがわかります。

仮想マシンを作成してディスクをアタッチするときに、ホスト キャッシュを有効にすることができます。 また、既存の VM 上のディスクに対するホスト キャッシュをオンまたはオフにすることもできます。

ホスト キャッシュを示すスクリーンショット。

各ディスクのワークロードの要件に合うように、ホスト キャッシュを調整できます。 ホスト キャッシュを次のように設定できます。

  • 読み取り専用:読み取り操作のみを行うワークロードの場合
  • 読み取り/書き込み: バランスの取れた読み取り操作と書き込み操作を行うワークロードの場合

ワークロードがこれらのパターンのいずれにも該当しない場合は、ホスト キャッシュを使用しないことをお勧めします。

さまざまなホスト キャッシュ設定の例をいくつか紹介し、データ フローとパフォーマンスにどのように影響するかを見てみましょう。 この最初の例では、ホスト キャッシュ設定が 読み取り専用 に設定されている場合の IO 要求の処理について説明します。

セットアップ:

  • Standard_D8s_v3
    • キャッシュされる IOPS:16,000
    • キャッシュされない IOPS:12,800
  • P30 データ ディスク
    • IOPS:5,000
    • ホスト キャッシュ: 読み取り専用です。

読み取りが実行されたとき、必要なデータがキャッシュで利用可能になっている場合は、要求されたデータがキャッシュから返されます。 ディスクから読み取る必要はありません。 この読み取りは、VM のキャッシュ制限にカウントされます。

読み取りホスト キャッシュの読み取りヒットを示す図。

読み取りが実行されたとき、必要なデータがキャッシュで利用可能になって "いない" 場合は、読み取り要求がディスクに中継されます。 その後、ディスクからキャッシュと VM の両方に提供されます。 この読み取りは、VM の未キャッシュ制限と VM のキャッシュ制限の両方にカウントされます。

読み取りホスト キャッシュの読み取りミスを示す図。

書き込みが実行された場合、書き込みが完了したと見なされるには、キャッシュとディスクの両方に書き込まれている必要があります。 この書き込みは、VM の未キャッシュ制限と VM のキャッシュ制限にカウントされます。

読み取りホスト キャッシュの書き込みを示す図。

次に、ホスト キャッシュの設定が 読み取り/書き込み に設定されている場合の IO 要求の処理について説明します。

セットアップ:

  • Standard_D8s_v3
    • キャッシュされる IOPS:16,000
    • キャッシュされない IOPS:12,800
  • P30 データ ディスク
    • IOPS:5,000
    • ホスト キャッシュ: 読み取り/書き込み

読み取りは、読み取り専用と同じ方法で処理されます。 読み取り/書き込みキャッシュで異なる部分は書き込みだけです。 ホスト キャッシュが 読み取り/書き込み に設定されている書き込みの場合、ホスト キャッシュに書き込まれただけで、書き込みが完了したと見なされます。 その後、書き込みはバックグラウンド プロセスとしてディスクに遅延書き込みされます。 これは、キャッシュに書き込まれるときに、書き込みがキャッシュされた IO にカウントされることを意味します。 ディスクへの遅延書き込みの場合は、キャッシュされない IO にカウントされます。

読み取り/書き込みホスト キャッシュの書き込みを示す図。

Standard_D8s_v3 仮想マシンの説明を続けましょう。 この場合を除き、ディスクでホスト キャッシュを有効にします。 また、VM の IOPS の上限は 16,000 IOPS になりました。 VM にアタッチされているのは、それぞれ 5,000 IOPS を処理できる 3 台の基になる P30 ディスクです。

セットアップ:

  • Standard_D8s_v3
    • キャッシュされる IOPS:16,000
    • キャッシュされない IOPS:12,800
  • P30 OS ディスク
    • IOPS:5,000
    • ホスト キャッシュ: 読み取り/書き込み
  • 2 台の P30 データ ディスク x 2
    • IOPS:5,000
    • ホスト キャッシュ: 読み取り/書き込み

ホスト キャッシュの例を示す図。

アプリケーションにより、キャッシュが有効な Standard_D8s_v3 仮想マシンが使用されます。 15,000 IOPS で要求を行います。 この要求は、アタッチされている基になるディスクごとに 5,000 IOPS として分解されます。 パフォーマンスの上限が発生することはありません。

未キャッシュ制限とキャッシュ制限の組み合わせ

仮想マシンのキャッシュ制限と未キャッシュ制限は切り離されています。 つまり、VM にアタッチされているディスクでホスト キャッシュを有効にしながら、他のディスクではホスト キャッシュを有効にしないでおくことができます。 この構成により、仮想マシンで、キャッシュされた制限とキャッシュされていない制限の合計ストレージ IO を取得できるようになります。

これらの制限がどのように連携するかを理解しやすいように、例を使用して説明します。 引き続き、Standard_D8s_v3 仮想マシンと Premium ディスクがアタッチされた構成を使用します。

セットアップ:

  • Standard_D8s_v3
    • キャッシュされる IOPS:16,000
    • キャッシュされない IOPS:12,800
  • P30 OS ディスク
    • IOPS:5,000
    • ホスト キャッシュ: 読み取り/書き込み
  • 2 台の P30 データ ディスク x 2
    • IOPS:5,000
    • ホスト キャッシュ: 読み取り/書き込み
  • 2 台の P30 データ ディスク x 2
    • IOPS:5,000
    • ホスト キャッシュ: 無効

リモート ストレージを使用するホスト キャッシュの例を示す図。

この例で、Standard_D8s_v3 仮想マシンで実行されているアプリケーションにより、25,000 IOPS の要求を行います。 要求は、アタッチされている各ディスクに 5,000 IOPS として分割されます。 3 台のディスクではホスト キャッシュが使用されており、2 台のディスクではホスト キャッシュが使用されていません。

  • ホスト キャッシュが使用されている 3 台のディスクはキャッシュ制限である 16,000 の範囲内であるため、それらの要求は正常に完了します。 ストレージ パフォーマンスの上限に達することはありません。
  • ホスト キャッシュが使用されていない 2 台のディスクは非キャッシュ制限である 12,800 の範囲内であるため、それらの要求も正常に完了します。 上限には達しません。