🐕

Azure VMのディスク性能についてテストしてみる

2022/05/19に公開

はじめに

最近周辺から、クラウドってディスク遅いよね?スペック通りの性能出ないよね?っていう話を受けました。うーんカタログスペック上は結構なIO性能があるんだよな、何をもって遅いと感じるんだろう?と思い、ちょっと性能テストをしてみました。
(といっても、網羅的なテストではありません。苦手なパターンを見極めておこう!ということです)

カタログスペック

今回はAzure VMをManaged Diskで使うとして、性能を求めるときにごく一般的に選択する「Premium SSD」を対象に確認することとします。
Premium SSDのカタログスペックは以下の通りです。(価格ページより抜粋)

今回は値段も手頃なP10ストレージを対象にテストすることとします。
P10はクレジットバースト機能が効いて、最大IOPS3,500、最大スループット170MB/sを出すことができるManaged Diskです。
クレジットバースト機能は、先日別の記事で説明書きましたので、よくわからんという方はこちらもどうぞ。
https://zenn.dev/tomot/articles/358180e6714600

テスト内容

テスト環境

  • 場所:Azure 東日本リージョン
  • VM:Standard D4s v3
  • OS: Windows Server 2016
  • Disk構成:OS Disk、P10ディスクを選択
  • ホストキャッシュ:なし

※ディスクの性能を引き出しきれるVMタイプを選択します。ただしバースト機能込みで。
※ホストキャッシュは無しにし、純粋なディスクの速さを見ましょう。

テスト内容

CrystalDiskMarkを使用してベンチマークテストを行います。簡易的に取ろうと思ったらよく使いますよね。
デフォルト設定のまま動かします。(テスト回数だけ、減らしました)

結果

ディスクの性能を見る場合は下記のように考えることが一般的です。
→スループット性能:ブロックサイズが大きく(1回の処理で読み書きするデータサイズが大きい)、シーケンシャル(ディスク上、順番にデータを読み書き)でIOを行ったときの、性能
→IOPS性能:ブロックサイズが小さく、ランダム(ディスク上のいろんな場所から読み書き)IOを行ったときの、性能

実際には、そのマシン上で動かすアプリケーションなどの使い方によって、どのような性能が求められるか変わってきます。ランダムIO重視だったら、スループット重視だったら、書き込み重視だったり、読み込み重視だったり、それらのMIXだったりします。
何を重視するかによって、チューニングも変わってきますので、最終的にはアプリケーションの特性次第である点には注意しましょう。

なお、Crystal Disk Markの場合、Queue(ディスクへのIO命令をどれだけ溜め込むか)/Thread(同IO命令をどれだけ並列で動かすか)も良しなにテストしてくれます。

スループットについて


1MBブロックサイズで、シーケンシャルIOでテストします。
1行目、queue 8の場合、概ねカタログスペック通りのスループットが出ています。
特に遅いという感じはしませんが、2行目(Queue 1/Thread 1)の場合は81MB/sとカタログ値の半分くらいです。

IOPSについて


4KBブロックサイズで、ランダムIOでテストします。
3行目(Queue 32/ Thread 1)の場合3568IOPSでほぼカタログスペック通りです。
ただ4行目(Queue1 / Thread 1)の場合は約1000IOPSとカタログスペックの1/3程度しか出ていません。

これらの結果から分かることは「Azureのディスクはサーバー⇔ストレージ間の通信に時間がかかっていそう」ということです。IOのQueueやThreadを増やさないと、ストレージとのやりとりの時間待ちでそのストレージの性能を使いきれていません。

実際、一番1IOの処理が速いはずの4行目のパターンですら、約1msecのレイテンシ(サーバーから命令を送ってからディスクからの読み込みが返って来るまで)かかっており、最大で1000IOPS程度しか出ないのにも頷けます。

Azureではストレージ⇔サーバー間がSANで構築されている…と各所で情報が書かれており、つまりネットワークで接続されています。この物理的な距離に対して必ず処理時間が必要ですので、どんなに頑張ってもある程度以上の速度向上はなかなか見込めないだろうと推測できます。

すなわち、ディスクの性能を引き出すためには、QueueやThreadなどをチューニングし、ちゃんとAzureでのディスクにあったIO要求を出せるアプリケーションである必要がある、ということです。

ちなみに、Read性能って…

IOPS、スループット、レイテンシのどの指標を見ても、ディスクのカタログスペックを軽く超える値が出ていました。普通はキャッシュの影響を疑うのですが、今回はホストキャッシュを確実に無効にしているのにVM(DS4v3)の最大IOPS/スループットまで出てるんですよね。ちょっと、この謎の説明ができませんでした…。

おわりに

「AzureVMのディスクが遅い」という意見に関しては、クラウドのディスクの特性と処理が合ってないのではないか?という推測結果となりました。これが原因だとすると、Azure以外のクラウドでも同じようなアプリケーションだったら同じように性能問題にあたりそうですね。
(コスト)パフォーマンスを引き出すためには使い手側が合わせる必要もあると思います。注意して使いましょう!

Discussion