あらためて、仮想マシンとプレミアムストレージのパフォーマンスについてまとめてみたいと思います。
プレミアムストレージのパフォーマンスについては Premium Storage を使ってみよう ~まずは性能をチェック~ からの一連の投稿が参考になります。
今回は、SQL Server 用途を想定しているため、以下の設定を基本としています。
- 読み取りキャッシュを有効
- フォーマット時のアロケーションサイズは 64KB を使用
- 記憶域プールのインターリーブは 64KB (OLTP 想定) を使用
プレミアムストレージを使用する場合、
- ディスク 1 本あたりの性能上限
- 仮想マシンの性能上限
の 2 つの上限を意識する必要があります。
ディスク当たりの性能上限については Premium Storage: Azure 仮想マシン ワークロード向けの高パフォーマンス ストレージ から、確認をすることができます。
- P10 : 128GB / 500 IOPS / 100MB/sec
- P20 : 512GB / 2,300 IOPS / 150MB/sec
- P30 : 1TB / 5,000 IOPS / 200MB/sec
がディスク当たりの性能上限となります。
仮想マシンのスループットについては、Sizes for Linux virtual machines in Azure から確認することができます。
- DS14 : キャッシュサイズ :576GB / 50,000 IOPS / 512MB/sec
- DS14 v2 : キャッシュサイズ : 576GB / 50,000 IOPS / 768MB/sec
- GS5 : キャッシュサイズ : 4,224 GB / 80,000 IOPS / 2,000 MB/sec
がプレミアムストレージを使用可能な環境の仮想マシンのディスク性能の性能上限となります。
DS v2 シリーズになると、IOPS は DS v1 と変わりませんが、帯域の上限が v1 より上昇しているようですね。
それでは、「読み取りキャッシュ」が有効になっている、1TB のディスクに対して、DS14 から発生させることができるディスク負荷を見てみたいと思います。
ディスク 1 本ですので、5,000 IOPS / 200MB/sec が上限になるかというとそうではありません。
以下は、diskspd を使用して、取得したディスク性能となります。
DS14 ディスク 1本 読み取りキャッシュあり
|
シーケンシャルリード |
シーケンシャル ライト |
ランダムリード |
ランダムライト |
4K |
254.64 65,187.52 |
19.92 5,099.64 |
254.98 65,274.70 |
19.92 5,099.91 |
8K |
509.43 65,207.48 |
39.84 5,099.78 |
509.88 5,264.63 |
39.84 5,099.75 |
64K |
509.97 8,159.52 |
194.55 3,112.73 |
510.00 8,159.93 |
194.55 3,112.86 |
256K |
500.96 2,003.84 |
193.96 775.83 |
510.04 2040.17 |
194.05 776.18 |
基本的なディスク性能としては、I/O サイズに応じて以下のようなトレンドが出てきます。
- I/O サイズが小さいアクセスが発生している場合は IOPS の上限
- I/O サイズが大きいアクセスが発生している場合は帯域の上限
書き込みのキャッシュは無効にしているため、ライト系に関しては、ディスクの性能上限となっていることが確認できますね。
読み取りに関しては、ディスクの性能上限以上となっています。
これは、キャッシュが効いているため、単純なディスク性能以上が発生している状態となります。
Premium Storage: Azure 仮想マシン ワークロード向けの高パフォーマンス ストレージ には、以下のような記載があります。
キャッシュ ヒット: キャッシュ ヒットには、ディスクの割り当て済みの IOPS とスループットによる制限はありません。たとえば、DS シリーズ VM または GS シリーズ VM でキャッシュを読み取り専用に設定したデータ ディスクを使用する場合、そのキャッシュからの読み取りは、Premium Storage のディスク制限の対象にはなりません。そのため、ワークロードの大部分が読み取りの場合、ディスクから非常に高いスループットが得られます。キャッシュには、VM サイズに基づいて、VM レベルで IOPS とスループットの個別の制限が適用されます。DS シリーズ VM は、IOPS が約 4000 で、キャッシュとローカル SSD の IO がコアあたり 33 MB/秒です。GS シリーズ VM の制限は、IOPS が 5000 で、キャッシュとローカル SSD の IO がコアあたり 50 MB/秒です。
今回は DS 14 を使用しているため 16 コアの環境となります。
そのため、キャッシュヒットについては、
- 4,000 IOPS × 16 コア = 64,000 IOPS
- 33MB/sec × 16 コア = 528MB/sec
となり、キャッシュにヒットしている場合は、ディスク 1 本でも 5,000 IOPS / 200MB/sec 以上の性能を出すことができます。
ディスクを 4 本にした場合は、以下のようになります。
DS14 ディスク 4本 読み取りキャッシュあり
|
シーケンシャルリード |
シーケンシャル ライト |
ランダムリード |
ランダムライト |
4K |
254.98 |
79.69 20,400.64 |
254.98 |
79.48 |
8K |
496.05 |
159.39 20,402.50 |
509.99 |
158.80 |
64K |
498.58 |
498.04 |
509.98 |
498.04 |
256K |
508.55 |
498.12 |
509.86 |
497.89 |
リードに関しては、キャッシュにヒットしている状態だと、1 本の場合と大差ないかと思います。
書き込みについては、ディスク本数の効果が出ているのが確認できますね。
16 本にした場合がこちらになります。
DS14 ディスク 16 本 読み取りキャッシュあり
|
シーケンシャルリード |
シーケンシャル ライト |
ランダムリード |
ランダムライト |
4K |
254.98 65,274.07 |
193.51 |
254.98 |
180.53 |
8K |
496.90 63,603.67 |
397.04 |
509.99 |
368.31 |
64K |
476.98 7,631.73 |
498.00 |
509.99 |
498.04 |
256K |
500.28 2,001.10 |
498.05 1,992.19 |
510.00 |
498.06 |
ライトのスループットが 4 本より上昇していますね。
キャッシュに頻繁にヒットしている状態では、ディスク本数は書き込みの性能にかなり影響してきていますね。
Performance best practices for SQL Server in Azure Virtual Machines には、以下のような記述があります。
For VMs that support Premium storage, we recommend storing TempDB on a disk that supports Premium Storage with read caching enabled.
プレミアムストレージを使用できる VM では、tempdb は D ドライブではなく、プレミアムストレージへの格納が推奨されています。
DS14 の D ドライブの性能ですが、以下のようになっていました。
DS14 D ドライブ
|
シーケンシャルリード |
シーケンシャル ライト |
ランダムリード |
ランダムライト |
4K |
255.77 65,477.04 |
25.90 6,630.01 |
255.77 65,477.91 |
251.87 64,477.98 |
8K |
511.08 65,417.74 |
53.57 6,856.68 |
511.48 65,469.40 |
511.50 65,472.39 |
64K |
511.17 8,178.76 |
347.31 5,556.99 |
511.54 8,184.65 |
511.52 8,184.34 |
256K |
511.17 2,044.70 |
511.45 2,045.82 |
511.51 2,046.04 |
511.59 2,046.38 |
基本的な性能については、プレミアムストレージの 1TB のディスクと似たような感じですね。
それでは、D ドライブとプレミアムストレージの E ドライブ (ディスク 1 本) に対して I/O を発生させてみます。
DS14 D ドライブ + E ドライブ
|
シーケンシャルリード |
シーケンシャル ライト |
ランダムリード |
ランダムライト |
4K |
255.80 65,485.08 |
51.58 13,205.13 |
255.79 65,482.82 |
247.79 63,434.93 |
8K |
511.52 65,474.15 |
90.56 11,591.16 |
511.55 65,478.61 |
489.08 62,601.99 |
64K |
511.49 8,183.79 |
493.78 7.900.44 |
511.56 8,185.01 |
511.51 8,184.16 |
256K |
511.27 2,045.07 |
511.14 2,044.55 |
511.73 2,046.92 |
511.52 2,046.07 |
D ドライブ + E ドライブの性能ですが、仮想マシンから発生さえることができるディスク性能の上限となっていますね。
D ドライブのアクセスに対しても、仮想マシンの I/O の上限となっているようです。
これについては、Azure Premium Storage の一般提供を開始 で書かれている内容になるのかと。
この投稿の中には、以下の図があります。
ローカルディスクも、キャッシュが有効なプレミアムストレージのディスクも「SSD-Level Provisioning」(上記の図の 4,000 IOPS, 32MB/sec) を介してのアクセスとなっています。
DS 1 は 1 コアですので、この図の値となっていますが、DS16 は 16 コアですので、16 場合の値が、キャッシュヒットしている場合の性能となります。
この領域は、プレミアムストレージとローカルディスクに共通となっているため、D と E の両方に負荷をかけた場合は、この領域の性能上限に達してしまったことになるかと。
プレミアムストレージを使用する場合、D ドライブに tempdb をおいても、ディスク I/O への影響はプレミアムストレージに配置する場合と差がないため、永続化領域としてシンプルに運用ができる、プレミアムストレージ上への保存が、推奨されているのでしょうね。