AWS／Azureのストレージ性能を、ファイル共有も含めてベンチマークで比較する

# はじめに
新しいPCを買ったり、自作PCを組み立てたら、**ベンチマーク**を計測したくなりますよね。（え？自分だけ？）
クラウドでボチッと気軽に作成できるサーバも、性能が気になるところです。そこそこ大きいデータファイルを保存するために、**AWS**や**Azure**の**ストレージ性能**についてスペックなどを調べましたが、目安となる数字はあるものの、実際のところどうなんだ？と思ってしまいました。

そんなわけで、ベンチマークを計測してみました。**ローカルディスク**のほか、**別サーバでWindowsファイル共有**した場合や、**ファイル共有サービス**も計測してみました。

必要なときに取り出せればいいファイルだったらS3などで安価に「保管」しておけばよいですが、オンラインで処理するファイルは**高速にアクセス**したいですし、**複数サーバからアクセスする場合**も気になります。（データサイズが大きいと、**コストも問題**になりますけど・・・**今回は性能にフォーカス**します）

# 計測方法
## CrystalDiskMark
ベンチマークは、「[CrystalDiskMark](https://crystalmark.info/ja/software/crystaldiskmark/)」を使用して計測しました。（今回はWindowsベースで検討していたのでWindows寄りになっていますが、Linux系でも参考になることも多いと思います）
[以前の記事](https://qiita.com/ggaaii/items/21f70555a7fdab64a9fd) で自作した**マイPC**を計測してみると、以下のような結果でした。（うーん、快適）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530064/79fa5622-e9f8-992e-6e32-825973ea7cad.png)
「**SEQ1M**」は**シーケンシャルアクセス**、「**RND4K**」は**ランダムアクセス**で、それぞれ「**Read**」「**Write**」の速度を計測します。Q8T1などは、マルチキューやマルチスレッドの動作を表します。
※CrystalDiskMarkは、5回計測して一番良い値を結果としています。
※CrystalDiskMarkのベンチマークについてもう少し詳しく知りたい方は、[「CrystalDiskMark」でHDDやSSDの速度を測定する方法！速度の目安とは？](https://aprico-media.com/posts/5266) のような解説サイトもご覧ください。

## 補足（注意点）
計測は、2020年9～10月頃に実施したものです。
5回計測を何セットか行い、一番良いものを結果とした場合もあります。
計測する度に結果に変動もあったので、実際の環境によって結果は異なると思います。
今回の計測では、継続的な負荷は考慮していません。計測時間は数分～10分程度なので、バーストが有効な状態と考えられます。（AWSのバーストについては下記参照）
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-volume-types.html
AWSのは東京リージョン、Azureは東日本リージョンを使用しました。

# 計測結果
それでは早速、計測結果です。
計測結果の数値には、比較しやすいように**背景色のバ**ーがつけてあります。
（**SEQ1M**は**500 MB/s**、**RND4K**は**50 MB/s**で**バーがMAX**になりますので、それを超えると違いはわかりませんが、まあMAXならかなり速いということです）
画面の解像度によっては見づらいかもしれませんので、その場合は画像を拡大してご覧ください。

## [AWS] EBS（ローカルHDD）
**スループット最適化HDD (st1)**で計測した結果はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530064/b17c499d-aab8-eab9-4f03-a42012f5dca7.png)
st1は、**ディスク容量が大きいほどスループット性能が高くなる**ので、**シーケンシャルアクセスのSEQ1Mの結果が良い**です。ただし、2000GB程度で頭打ちになるようですが。EBS作成時に表示されるベースラインスループットが「79 MB/s」でも、バーストが効いて500 MB/s以上出ていますね。（EBSは条件を満たすとバーストして性能が上がります）
RND4Kも容量を増やせば少し良くなりますが、HDDなのでランダムアクセス性能はあまり高くないですね。
EC2の**インスタンスタイプをm5.xlargeに上げてみても、特に影響は無い**ようです。

## [AWS] EBS（ローカルSSD）
**汎用SSD (gp2)**、**プロビジョンドIOPS SSD (io2)**で計測した結果はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530064/006c991f-1b69-f23b-ab68-403e67d0b217.png)
SSDの場合は、**HDDに比べて全体的にRND4Kが良くなり、ランダムアクセス性能が高い**ことがわかります。しかし、料金の安いHDD (st1)と比べて、SEQ1Mの結果が良くない場合もあるので注意が必要です。
**汎用SSD (gp2)**では、**ディスク容量によってIOPS性能が決まります**。IOPSは主にランダムアクセスに影響する値ですが、容量を増やせばRND4KだけでなくSEQ1Mの値も良くなります。ですが、1000GBから2000GBに増やしても、RND4KのQ32T16の値が良くなるくらいで、それ以外は頭打ちになってしまうようです。
**プロビジョンドIOPS SSD (io2)**では、**ディスク容量とは別にIOPS値を指定**できます。IOPSを上げればRND4Kも良くなります。（どこが頭打ちまでかは調査していませんけど・・・）　SEQ1Mの値は、2000 IOPSくらいまで上げればHDD (st1)に近い値になり、そこで頭打ちのようです。（SEQ1MのQ1T1の値は、HDD (st1)より若干低いです）
HDDと同様に、EC2の**インスタンスタイプをm5.xlargeに上げてみても、特に影響は無い**ようです。

## [AWS] インスタンスストア（NVMe：ローカル高速SSD）
NVMeは**高速なローカルSSD**で、インスタンスストアはEBSとは違って**一時的なストレージ**です。特定のインスタンスタイプを選ぶとセットで付いてくるもので、容量も決まっています。
計測結果はこちらです。（最後の300GB*2は、用意された2つのディスクをRAIDでストライピングしています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530064/8c68f29d-f16d-4bb8-4fa3-e3aac780ea75.png)
NVMeの**RND4Kは全体的に非常に良い値**で、EBSのSSDよりも高速です。ファイルサイズが小さいデータに頻繁にアクセスする際に有用です。
容量やインスタンスタイプによって差がありますが、**SEQ1Mもかなり高速**なものもあります。全般的にWriteよりもReadの方が2倍近く速いようです。

## [AWS] Windowsファイル共有（EBS：HDD/SSD / インスタンスストア：NVMe）
続いては、m5.largeのEC2から、**別のEC2のディスクをWindowsファイル共有**して計測してみました。複数のEC2から共有ストレージとして使用するケースを想定しています。
**AZが同一の場合**、**AZが別の場合**の2パターンで計測しています。計測結果はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530064/956c74ea-c29e-672e-0bce-28e2c36e4d25.png)
上にあるローカルでの結果と比較してみると、**別サーバに接続するオーバーヘッド**により、速度が低下するケースが見られます。（もうちょっと比較しやすい表にすればよかった・・・）
SEQ1MもRND4Kも、全般的にQ8T1 / Q32T16ではほとんど変わりませんが、Q1T1では速度低下するケースがあります。特に**別AZになると低下が大きく**、Writeでは同一AZでも低下が見られます。Q1T1の結果が実際にどう影響するかは、アプリケーション等のディスクアクセス方法によると思います。
NVMeの場合は、RND4KのQ32T16でも低下が大きいですが、元が高速なのでそれでも速いですね。


## [AWS] Amazon FSx for Windows File Server（HDD）
次は、自分でサーバを用意するのではなく、**ファイル共有サービスのFSx**に対して、m5.largeのEC2から計測してみました。
FSxは、**シングルAZ**と**マルチAZ**構成のパターンと、先ほどと同様に**AZが同一の場合**、**AZが別の場合**のパターンで計測しました。また、スループットも何パターンか設定してみました。
HDDの場合の計測結果はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530064/d48cdd17-8451-a956-9279-3003cfa48d21.png)
結果としては、**SEQ1MもRND4Kもあまり速くない**ですね。別AZの場合にQ1T1では速度低下するということは先ほどと同様です。（RND4Kは遅いせいか、あまり低下しないですが）　マルチAZ構成にすると、SEQ1M Q1T1のWriteも低下するようです。
HDDの傾向としては、**スループットを32 MB/s以上にしても性能はあまり上がらない**ようです。（ベースラインは確保されると思われますが）

## [AWS] Amazon FSx for Windows File Server（SSD）
SSDの場合も同様に計測しました。計測結果はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530064/29f3843c-6889-c83e-ec18-aa85ce8d56fb.png)
**SSDの場合は性能はそこそこ良い**ですね。別AZやマルチAZ構成の傾向はHDDの場合と同様ですが、SSDの場合は、**スループットを32 MB/s以上に上げていくと、性能が向上**しました。さらにディスク容量を増やすことで、シングルAZしか試していませんがRND4K1 Q32T16の値も上がりました。
まあ、**FSxのSSDは料金がお高い**ので、コストはよく調べておきましょう。

## [Azure] データディスク（ローカルHDD）
さてここからは**Azureの場合**ですが、AWSに比べて簡易的に計測したので、計測のバリエーションは少ないです。
Azureの仮想マシンは、OS用のディスクに加えてデータディスクを追加することができますが、今回計測したのはデータディスクの方です。
ディスクには、**ホストキャッシュ**というキャッシュの方式を設定することができ、これによってベンチマーク結果も大きく変わりました。ホストキャッシュは、「**なし**」「**読み取り専用**」「**読み取り／書き込み**」の3パターンがあります。
HDDの場合の計測結果はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530064/46de1424-261b-46a1-47d3-ff51afa6802f.png)
ホストキャッシュが「なし」の場合の性能は低いですが、**キャッシュが効くと一気に速くなる**ことがわかります。特にRND4Kは、**HDDなのにNVMeのような速度**が出ています。キャッシュが効いていない時は「なし」の速度になると思われるので、アプリケーション等の特性を考慮して判断する必要があります。
ディスク容量やサーバスペックのバリエーションは試してないのであしからず。。。

## [Azure] データディスク（ローカルSSD）
SSDは、**Standard SSD**と**Premium SSD**があり、HDDと同様にホストキャッシュの設定ができます。
計測結果はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530064/bf2125b2-e96f-118c-9748-07f6e7e3ffaf.png)
SSDも**ホストキャッシュが効けば速い**ですね。
ホストキャッシュが「なし」の場合、**全般的にStandard SSDよりもPremium SSDの方が良い**ケースが多いです。（一部逆転も見られますが）　また、Premium SSDしか試していませんが、ディスク容量が大きい方が結果が良いケースも見られます。
「読み取り専用」では、VMサイズがD2_v4ではキャッシュによる伸びも少ないですが、D4_v4にすることでReadでは2倍近く結果が良くなり、D8s_v4ではさらに結果が良かったです。AWSのインスタンスタイプの違いとは異なり、VMサイズが結果的にディスク性能にも大きく影響する場合があるようです。
「読み取り／書き込み」を見ると、**Premium SSDでキャッシュが効けば、全体的にパフォーマンスが良い**ですね。
**ディスク容量を増やしても、結果が良くはならない**ようですね。

## [Azure] Windowsファイル共有（データディスク：HDD / SSD）
Azureの場合も、別の仮想マシンに対して**Windowsファイル共有**して計測しました。
接続元VMサイズは、2パターン変えてみました。ディスク容量は128GBのみです。可用性オプションは特に設定していません。
計測結果はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530064/c0c8fc13-aa88-d459-4df6-f66ccf0c284d.png)
**ファイル共有でもホストキャッシュが効いて速い**ようですが、SEQ1MのRead以外は、**ローカルに比べて低下が大きい**ようです。
接続元をD2_v4からD4_v4にした方が、RND4K Q32T16やSEQ1MのWriteで結果が良くなりました。

## [Azure] Azure Files（HDD / SSD）
**ファイル共有サービスのAzure Files**も計測しました。
ストレージオプションとして、HDDの「**クール**」「**ホット**」「**トランザクション最適化**」、SSDの「**Premium**」があります。（HDDの違いは、主に冗長性オプションの違いです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530064/5060ee1b-9cdf-3d12-2fc8-9fe4195c2ba6.png)
**全体的にそこそこのパフォーマンス**ですね。
HDDの場合、**どのオプションでも計測結果はほぼ同じ**です。ディスク容量によっても違いは無いようです。
SSDの場合は、**ディスク容量を増やすことにより、主にRND4Kなどで結果が良く**なりました。また、VMサイズをD4_v4に上げることで、主にSEQ1M Q8T1で結果が良くなりました。（Q1T1は逆に下がってしまいましたが）

# まとめ
## AWSの場合
- ローカルストレージ
    - シーケンシャルアクセスを重視する場合は「スループット最適化HDD (st1)」
    - ランダムアクセスを重視する場合は「汎用SSD (gp2)」「プロビジョンドIOPS SSD (io2)」
        - gp2はディスク容量を増やすことで、シーケンシャル／ランダムアクセスの性能が上がる
        - io2はIOPSの設定値を上げることで、シーケンシャル／ランダムアクセスの性能が上がる
            - st1と同等のシーケンシャルアクセスに上げることも可能
    - 高速な一時ストレージは「インスタンスストア（NVMe）」
        - インスタンスタイプを選ぶとセットで付いてきて、容量も決まっている
        - 適切なストレージ性能のインスタンスタイプ（およびディスク容量）を選ぶ必要がある
- Windowsファイル共有（別サーバへ接続）
    - 別サーバに接続するオーバーヘッドにより速度低下するため注意する
        - 特に別AZの場合はローカルに比べて速度低下が大きく、Writeでは同一AZでも低下する
    - 高速なストレージを使用すれば、ファイル共有でもそこそこ速い
- ファイル共有サービス
    - FSxのHDDはあまり速くない（コストメリットはありそう）
    - FSxのSSDはスループットの設定値を上げることで速度が出る（コストは要注意）

## Azureの場合
- ローカルストレージ
    - ホストキャッシュの設定を有効にすることによって、計測結果は格段に良くなる場合がある
        - キャッシュが効かないとPremium SSDでもそれほど速くない
        - キャッシュが効く場合、計測する度に測定結果の変動が結構大きかったので注意
    - VMサイズがディスク性能に大きく影響する場合がある
- Windowsファイル共有（別サーバへ接続）
    - ホストキャッシュが効けば、ファイル共有でもそこそこ速い
- ファイル共有サービス
    - あまり高速な性能は期待できないが、データディスクのホストキャッシュ「なし」よりは速い
    - HDDは冗長オプションを変えても計測結果は変わらない
    - SSDの方がシーケンシャル／ランダムアクセスの性能がよい

# おわりに
ベンチマークって性能を数値にしたものなので、**戦闘力みたいでワクワク**しますよね。
キャッシュとかバーストとか、その時々で性能が変わる要素もありますが、どのようなストレージを選択するかによって性能は全然違います。
今回はコストについてはほとんど触れていませんが、コストと相談しつつ、**最適なストレージ**を選びましょう！

# 参考
[CrystalDiskMark](https://crystalmark.info/ja/software/crystaldiskmark/)
[「CrystalDiskMark」でHDDやSSDの速度を測定する方法！速度の目安とは？](https://aprico-media.com/posts/5266)
[Amazon EBS ボリュームの種類](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-volume-types.html)
[Azure の仮想マシンのサイズ](https://docs.microsoft.com/ja-jp/azure/virtual-machines/sizes)
[【Azureディスク】VMのホストキャッシュ設定「読み取り専用」「読み取り/書き込み」の違い](https://soypocket.com/it/azure-virtual-machines-disk-hostcache/)