仮想マシンとディスクのパフォーマンス
適用対象: ✔️ Linux VM ✔️ Windows VM ✔️ フレキシブル スケール セット ✔️ 均一スケール セット
この記事は、ディスクのパフォーマンスと、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 データ ディスク x 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 に関するドキュメントを次に示します。
[リモート ストレージ] の "キャッシュされない" ディスク データは、仮想マシンが処理できる既定のストレージの上限になります。
ホスト キャッシュを有効にした場合、[ローカル ストレージ] タブの "キャッシュされる" ディスク データは、個別の制限になります。
ホスト キャッシュは、書き込みまたは読み取りを迅速に実行できるストレージを VM の近くに配置することで機能します。 ホスト キャッシュ用に VM で使用できるストレージの容量は、ドキュメントに記載されています。 たとえば、Standard_D8s_v3 には 200 GiB のキャッシュ ストレージが備わっていることがわかります。
仮想マシンを作成してディスクをアタッチするときに、ホスト キャッシュを有効にすることができます。 また、既存の VM 上のディスクに対するホスト キャッシュをオンまたはオフにすることもできます。 キャッシュ対応データ ディスクは、既定で読み取り専用キャッシュが有効になります。 キャッシュ対応 OS ディスクは、読み取り/書き込みキャッシュが有効になります。
各ディスクのワークロードの要件に合うように、ホスト キャッシュを調整できます。 ホスト キャッシュを次のように設定できます。
- 読み取り専用:読み取り操作のみを行うワークロードの場合
- 読み取り/書き込み: バランスの取れた読み取り操作と書き込み操作を行うワークロードの場合
ワークロードがこれらのパターンのいずれにも該当しない場合は、ホスト キャッシュを使用しないことをお勧めします。
さまざまなホスト キャッシュ設定の例をいくつか紹介し、データ フローとパフォーマンスにどのように影響するかを見てみましょう。 この最初の例では、ホスト キャッシュ設定が [読み取り専用] に設定されている場合に 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
- ホスト キャッシュ: 読み取り/書き込み
読み取りは、読み取り専用と同じ方法で処理されます。 読み取り/書き込みキャッシュで異なる部分は書き込みだけです。 ホスト キャッシュが読み取り/書き込みに設定されている書き込みの場合、ホスト キャッシュに書き込まれただけで、書き込みが完了したと見なされます。 その後、キャッシュが定期的にフラッシュされる際に、書き込みが遅延してディスクに書き込まれます。 お客様は、f/sync
または fua
コマンドを発行して、フラッシュを強制することもできます。 つまり、書き込みは、キャッシュに書き込まれるときに、キャッシュされた 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 仮想マシンが使用されます。 16,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 の範囲内であるため、それらの要求も正常に完了します。 上限には達しません。