IOPS とスループットの関係を解説します ~Premium SSD を使ってみよう~
前回の記事では Premium SSD の性能と利用時の注意点について説明しました。本記事では、IOPS とスループットの関係性について触れます。
目次
- Premium SSD を使ってみよう ~性能と注意点をチェック~
- IOPS とスループットの関係を解説します ~Premium SSD を使ってみよう~(本記事)
- システムが必要とする IOPS の計測方法 ~Premium SSD を使ってみよう~
- ディスクの適切な応答時間の目安を解説 ~Premium SSD を使ってみよう~
「高い IOPS が得られている状態 = 高いスループットが得られている状態」とは限らない
前回の記事では、サイズが 1TB の Premium SSD の IOPS を計測して、ディスク一台あたり 5,000 IOPS の性能を引き出せることを確認しました。本記事では、スループットの性能を計測します。
前回と同じように Iometer を利用し、1TB の Premium SSD のディスクに 16 個の Worker を使って 4 KB 100% Read / 0% Random の負荷をかけます。また、Azure VM のサイズも前回と同様に Standard_D16s_v3 を利用してスループットを測定します。
得られたスループットは以下の通り、約 21 MB/秒 です。
Azure のドキュメントには、1TB の Premium SSD のディスク一台あたりのスループットの期待値は 200 MB/秒 と説明されています。従って、上記した負荷検証の条件で得られたスループットの結果は、ドキュメントに記載の 200 MB/秒には遠く及ばない結果と言えます。
一方で、4 KB 100% Read / 0% Random の負荷をかけている間に得られた IOPS 性能を測定すると、以下のように 5,000 IOPS が得られていることが分かります。また、5,000 IOPS が得られている状態において、スループットは上記した約 21 MB/秒という結果が記録されています。
Azure のドキュメントによると、サイズが 1TB の Premium SSD のディスク一台あたりの IOPS の期待値は 5,000 ですので、IOPS はドキュメントに記載通りの結果が得られていることが分かります。
以上の測定結果から、「高い IOPS が得られている状態」と「高いスループットが得られている状態」はイコールではないということが分かります。
OS の中で、IO はバケツリレーのように処理される
スループット性能を引き出す方法を理解するためには、OS の中で IO がどのように処理されているのかを理解する必要があります。OS の中でディスクの IO が処理される様子を簡単な図にすると、以下のようになります。
アプリケーション、ファイル システム、ディスク ドライバ、ハード ディスクなどの各モジュール間で IO の受け渡しが行われ、図の中の「I/O Request Packet(略して IRP)」と呼ばれるものが IO を受け渡すためのバケツです。OS の中では IRP のバケツリレーが常に行われており、今回の検証で利用している Iometer が生成した IO 負荷もバケツリレーで処理されます。
IO のバケツリレーに関しては、詳細な解説が以下のドキュメントとして公開されています。より詳細にディスク IO の仕組みを知りたい方は、下記のドキュメントをご覧ください。
How Basic Disks and Volumes Work
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc739412(v=ws.10)
Windows Server 2003 時代の記事ですので情報は古いですが、ディスクの IO に関する処理の考え方は最近のバージョンの Windows でも同様です。上記したバケツリレーの図は、公開ドキュメントに掲載の「Basic Disk and Volume Input/Output (I/O) Processes」の図を簡略化したものです。
IO を運ぶバケツの大きさによってスループットは変化する
Iometer で 1TB の Premium SSD のディスクに 4 KB 100% Read / 0% Random の負荷をかけたところ、5,000 IOPS が得られ、スループットは約 21 MB/秒という計測結果が得られました。今度は、1TB の Premium SSD のディスクに 64 KB 100% Read / 0% Random の負荷をかけて IOPS/スループットを測定します。
得られたスループットは以下の通り、約 200 MB/秒です。
Azure のドキュメントに記載されている 1TB の Premium SSD のディスク一台あたりのスループットの期待値は 200 MB/秒です。従って、64 KB 100% Read / 0% Random の負荷をかけた場合には期待通りのスループットが得られるということが分かります。
一方で、200 MB/秒のスループットが得られている状態で IOPS を計測すると、約 3,100 IOPS が得られていることが記録されています。
いくつかのパターンで同様の計測を行った結果をまとめたものが以下になります。
テストケース | IOPS | スループット |
---|---|---|
4 KB 100% Read / 0% Random | 約 5,000 | 約 21 MB/秒 |
16 KB 100% Read / 0% Random | 約 4,800 | 約 78 MB/秒 |
32 KB 100% Read / 0% Random | 約 4,580 | 約 150 MB/秒 |
64 KB 100% Read / 0% Random | 約 3,100 | 約 200 MB/秒 |
256 KB 100% Read / 0% Random | 約 780 | 約 200 MB/秒 |
テストケースで設定を変更しているのは、ディスクからデータを読み込む際のサイズのみです。読み込みサイズが大きいほどスループットの数字は上がります。上述した通り、OS の中では IO はバケツリレーで処理されます。上の表の結果をバケツリレーで表現すると、以下のようになります。
- おちょこ(読み込みサイズ 4KB)でバケツリレーをすると、一度に運ぶ水の量が軽いためバケツリレーの往復回数(IOPS)は多くなるが、運べる水の総量(スループット)は少ない
- 牛乳びん(読み込みサイズ 16KB/32KB)でバケツリレーをすると、バケツリレーの往復回数も運べる水の総量も、それなりの数値が得られる
- バケツ(読み込みサイズ 64 KB/256 KB)でバケツリレーすると、一度に運ぶ水の量が重いのでバケツリレーの往復回数は少なくなるが、運べる水の総量は多い
つまり、IOPS やスループットの性能を引き出すためには、ディスク自体の性能に加えて、データの読み込み・書き込みサイズが影響しているということが分かります。Premium SSD を利用すれば、無条件に常に高い IOPS やスループットが得られるということではありません。IOPS やスループットの性能とデータ サイズの間には依存関係があるということにご注意ください。
また、お気づきになった方もいらっしゃると思いますが、上記の表の中で読み込みサイズが 64 KB の場合と 256 KB の場合とでスループットの数値は両方とも 200 MB/秒となっています。読み込みサイズが異なるにもかかわらず、スループットの計測結果が同じ数値である理由については後述します。
アプリケーションが扱うデータの特性を把握する
データベースのように高いディスク パフォーマンスを必要とするソフトウェアは、大抵の場合、ディスクの読み込み・書き込みに関するチューニング ガイドが提供されています。例えば、以下は SQL Server が利用するディスクのパフォーマンス ガイドになります。古い情報になりますが、ディスクのチューニングに関する知識としては現在でも通用する内容ですので、ご参考ください。
SQL Server 2008 のためのディスク パーティション アライメント ベスト プラクティス
https://docs.microsoft.com/ja-jp/previous-versions/sql/sql-server-2008/dd758814(v=sql.100)
ディスクのスループットが高ければシステム全体のパフォーマンスが必ず上がるというわけでもありません。例えば、サイズが 4KB 以下のファイルを大量に読み込み・書き込みするようなアプリケーションでは、スループットよりも IOPS(データの読み込み・書き込み回数)の数値を重視してパフォーマンスをチューニングすることで、システム全体のパフォーマンスが改善されることが考えられます。
クラウドの利点として、検証のための環境を素早く簡単に低コストで構築できるという点が挙げられます。読み込み・書き込みサイズの理論的な数字を机上で計算する作業に工数を使うより、クラウドでテスト環境を構築し、実際に負荷テストを実施することでパフォーマンス データを測定することをお勧めします。
64 KB と 256 KB の検証結果に差異がない理由
最後に、上述したテスト ケースの中で、読み込みサイズが 64 KB と 256 KB のケースで得られたスループットの結果が両ケースとも約 200 MB/秒になった原因について説明します。
このようなテスト パターンで計測を行った場合、一般的には読み込みサイズが 256 KB の方が高いスループットが得られます。今回の検証で 64 KB と 256 KB のケースで得られたスループットが同じ値になった原因は、1TB の Premium SSD では、ディスク一台あたりの最大 IOPS に 5,000、最大スループットに 200 MB/秒という上限が設定されているためです。
5,000 を超えた IOPS、200 MB/秒を超えたスループットが必要になった場合には、複数台のディスクを Azure VM に接続し、記憶域プールなどを用いて 1 つの論理ディスクとして束ねることにより、IOPS/スループット性能を確保します。
加えて、前回の記事でも説明した通り、Azure VM のサイズに対しても IOPS とスループットの上限が設定されています。本記事での検証では、Azure VM のサイズに Standard_D16s_v3 を指定しています。適切なサイズの Premium SSD を使用しているにもかかわらず、思うようなパフォーマンスが得られない場合には、Azure VM のサイズを確認してみてください。
参考情報:
Azure の Windows 仮想マシンのサイズ
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/sizes
汎用仮想マシンのサイズ
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/sizes-general
まとめ
- 「高い IOPS が得られている状態 = 高いスループットが得られている状態」とは限りません
- OS の内部では IO はバケツリレーのように処理されており、読み書きするデータのサイズに応じてスループットが変化します
- バケツリレーの往復回数(IOPS)を重視するのか、運ぶ水の総量(スループット)を重視するのかを意識してパフォーマンス チューニングを行います
- Premium SSD、Azure VM のスペックに応じて IOPS/スループットの上限が設定されているので、適切なサイズのリソースを選択します