Premium Storage を使ってみよう ~IOPS とスループットの関係~

Facebooktwittermail

IOPS の数値は高いのにスループットが低いんですけど?

前回の記事の続きです。

前回の記事では、Premium Storage の IOPS を計測して、ディスク一台あたり最大 5,000 IOPS まで引き出せることを確認しました。 ではスループットの性能はどうなのか実験してみます。前回の記事では Azure VM に DS2 Standard を使用しましたが、今回の記事では DS4 Standard を使用しています。

前回と同じように、Iometer を使って、9 個の Worker で 4 KB 100% Read / 0% Random の負荷を Premium Storage のディスクにかけます。

結果はご覧のとおり、スループットは約 21 MB/s です。低いですね。

ltp20150610

「IO がスタックしてるんじゃないの?ちゃんと高い IOPS 出てる?」という方、IOPS はキッチリ 5,000 以上出ています。

ltp220150610

つまり、「高い IOPS の数値が得られている状態」と「高いスループットが得られている状態」はイコールではないということです。

OS の中は「バケツリレー、水よこせー」な状態

「バケツリレー、水よこせー」を見て、「お、Metallica/Blackened の空耳じゃね?」と思ったあなたはメタル通です。

メタル通なあなたも、そうじゃないあなたも、OS の 中でどのように IO をハンドリングしているのか見てみましょう。IO と一言で言ってもいろいろな IO がありますが、今回のテーマであるディスクの IO がハンドリングされる様子を簡単な図にすると以下のようになります。

irp20150610

アプリケーション、ファイル システム、ディスク ドライバ、ハード ディスクなどの各モジュール間で IO のやり取りが行われていますが、この図の中に書かれている「I/O Request Packet(略して IRP)」と呼ばれるものが IO を受け渡しするためのバケツです。OS の中では IRP のバケツリレーが常に行われており、今回の実験で使っている Iometer からの負荷もバケツリレーで処理されます。

このバケツリレー、今回の記事ではさくっと簡単に書いていますが、もっとディープに仕組みを知りたい方は下の MSDN のページをご覧ください。少し古い記事ですが、基本的な考え方は最近のバージョンの Windows でも同じです。上で書いた図は、下の MSDN のページの「Basic Disk and Volume Input/Output (I/O) Processes」を簡略化したものです。そこそこディープな内容ですので、心してかかってください。

How Basic Disks and Volumes Work
https://technet.microsoft.com/en-us/library/cc739412(v=ws.10).aspx

IO を入れるバケツの大きさは?

最初の実験結果に話を戻します。Iometer で 4 KB 100% Read / 0% Random の負荷を Premium Storage のディスクにかけたら、5,000 IOPS で スループット 21 MB/s という結果が出ました。今度は 64 KB 100% Read / 0% Random の負荷をかけてみます。すると、結果は以下の通り。スループットが 200 MB/s という結果が出ました。速いですね。

tp20150612

ちなみにこの時、IOPS の数値は 3,100 IOPS です。

tp220150612

他のテストケースも実験してみましたが、まとめると以下のようになります。テストケースで設定を変更しているのは読み込みサイズだけですが、読み込みサイズが大きい方がスループットは良好です。64 KB と 256 KB でスループットの結果が同じなのはなぜ?については後述します。

テストケース IOPS スループット
4 KB 100% Read / 0% Random 約 5,000 約 21 MB/s
16 KB 100% Read / 0% Random 約 4,900 約 80 MB/s
32 KB 100% Read / 0% Random 約 4,100 約 135 MB/s
64 KB 100% Read / 0% Random 約 3,100 約 200 MB/s
256 KB 100% Read / 0% Random 約 780 約 200 MB/s

上で書いた通り、OS の中では IO がバケツリレーで渡されます。上の表の結果をバケツリレーで表現すると、こうなります。

  • おちょこ(書き込みサイズ 4KB)でバケツリレーをすると、一度に運ぶ水の量が軽い分だけバケツリレーの受け渡しのスピード(IOPS)は上がるが、運べる水の総量(スループット)は少ない
  • 牛乳びん(書き込みサイズ 16KB/32KB)でバケツリレーすると、バケツリレーの受け渡しのスピードも運べる水の総量も、そこそこの数字が得られる
  • バケツ(書き込みサイズ 64 KB/256 KB)でバケツリレーすると、一度に運ぶ水の量が重いのでバケツリレーの受け渡しのスピードは落ちるが、運べる水の総量は一番多い

 

つまり、ディスクのスループットを出すには、ディスクのスピードも重要ですが、書き込みや読み込みを行う際のサイズも重要だということです。Premium Storage を使えば無条件にスループットが上がる!という認識で使うと、実際に試した結果、あれっ?ということになる可能性もあるので要注意です。

アプリが使っているバケツのサイズを確認してください

データベースのように高いディスク パフォーマンスを必要とするアプリは、大抵の場合はディスクの書き込み・読み込みに関するチューニング ガイドが提供されています。例えば、SQL Server の場合は以下のような情報が公開されています。

SQL Server 2008 のためのディスク パーティション アライメント ベスト プラクティス
https://technet.microsoft.com/ja-jp/library/dd758814(v=sql.100).aspx

この部分のチューニングはなかなか奥が深いです。ディスクのスループットが大きければアプリのパフォーマンスが必ず上がるというわけでもありません。例えば、サイズが 4KB 以下のファイルを大量に書き込みするようなアプリを使う場合には、スループットよりも書き込み回数(IOPS の数値)を重視した方がパフォーマンスが上がるでしょうし、逆に一度の書き込みが GB 単位のようなアプリではスループットを重視した方がパフォーマンスが上がるでしょう。今回の記事では触れていませんが、ファイル システムのチューニングが必要になる場合もあります。

クラウドの良いところの一つに、実験のための環境を簡単に作ることができるという点があります。書き込み・読み込みサイズの理論的な数字を机上で計算するのも良いのですが、クラウドでテスト環境を構築し、実際に試してデータを得ることで時間もコストも工数もおさえてしまいましょう。

※2015 年 6 月 18 日追記
この記事を公開した後、同僚の Azure スペシャリストが作成した性能計算アプリを紹介してもらいました。

最大性能机上計算アプリ
http://premiumstorage.hamboxes.com

64 KB と 256 KB の実験結果について

上の方で書いた実験結果ですが、64 KB と 256 KB のテストケースでスループットが両方とも約 200 MB/s になっています。こういう実験をした場合、一般的には 256 KB の方が高いスループットが得られます。今回、64 KB と 256 KB でスループットが同じになった原因は、Premium Storage で、ディスク一台あたりの最大スループットに 200 MB/s という上限を設けているためです。Premium Storage の挙動の詳細については下記をご覧ください。

Premium ストレージ:Azure 仮想マシン ワークロード向けの高パフォーマンス ストレージ
https://azure.microsoft.com/ja-jp/documentation/articles/storage-premium-storage-preview-portal/

加えて、Azure VM のスペックに対しても IOPS とスループットの上限が設けられています。今回の実験では DS4 Standard の VM を使っています。前回の記事でも紹介した、下の MSDN の Azure VM に関するページで DS4 Standard の部分を見てみましょう。

Azure の仮想マシンおよびクラウド サービスのサイズ
https://msdn.microsoft.com/ja-jp/library/azure/dn197896.aspx

DS4 Standard の「最大ディスク IOPS および帯域幅 」を見ると、最大 IOPS は 25,600、スループットは 256 MB/s と書かれています。「前回の記事では DS2 Standard を使っているのに、今回の記事で DS4 Standard を使っているのはなんでだろう?」と思われた方、理由は Azure VM のスペックのためです。DS2 Standard は最大スループットが 64 MB/s なので、今回の実験をしても、64 KB 100% Read / 0% Random の負荷をかけた時に 200 MB/s というスループットは得られないのです。

オンプレミス環境の感覚で IOPS の設定を行うと、あれっ?となることがあるかもしれません。Premium Storage および Azure VM のスペックに注意しながら、ご自身の環境に合うベストな組み合わせを探してみてください。

まとめ

  • 「高い IOPS の数値が得られている状態」と「高いスループットが得られている状態」はイコールではない
  • OS の中では、バケツリレーで IO を受け渡ししている
  • アプリのパフォーマンスを考慮する時、バケツリレーの受け渡しのスピード(IOPS)を重視するのか、運ぶ水の総量(スループット)を重視するのかを検討する
  • Premium Storage、Azure VM はスペックに応じて IOPS/スループットの上限が決まっているので、必要とするパフォーマンスが引き出せるスペックを選ぶ必要がある

 

次回はアプリの視点からの IO について書いてみようと思います。

Facebooktwittermail