AWSストレージ概観

AWS で使えるローカルストレージと NFS ストレージを一通り試してみました。
GCP 編はこちら

About

ベンチマークは fio コマンドで取得した。
機械学習のワークロードで扱う機会が多い、CSV のような小さめのテキストファイルとマルチメディアファイルを想定して 4k と 32m のデータで測定した。

なお、ストレージタイプごとの傾向をざっくりと知りたかったので性能を引き出すような設定や調整は行なっていない。
また以下の理由で IaaS のストレージを厳密に測定してもあまり意味はないと考えている。

  • IaaS のリソースはシェアされているので他のユーザー(テナント)の影響を受ける
  • 非公開な仕様が特に告知なく更新される(バス幅や各種ストレージの物理仕様など)

試したストレージは以下。

  • Amazon EBS Volume(ローカルブロックデバイス)
    • gp2 : 汎用, SSD
    • io1 : Highest-performance SSD
    • HDD(st1, sc1)は試さなかった
  • Amazon EFS Performance(マネージド NFS サービス)

Results

以下の通り Terraform による IaC で provisioning した。
https://github.com/mazgi/terraform-aws-simple-vpc/tree/v2019.06.2/examples/multiple-volumes

またi3enインスタンスを使って測定したのでNitroアーキテクチャでの結果となる。

結果はこちら。
https://gist.github.com/mazgi/fa855f576aca50ff0f204f6386c275dc

結果をテーブルにまとめた。

EBS

io1 はたしかに、

more than 16,000 IOPS or 250 MiB/s of throughput per volume

書いてある通りの性能が出ている。

i3en についてくる NVMe SSD も速い。
ボリュームサイズが 1,250 GB の倍数で自動的に決まってしまう制約はあるが使えるシチュエーションはそれなりにありそう。
4k randread が妙に遅いのでこれは実行タイミングで何かあったのかもしれない。

type r/w rand/seq IOPS 4k ,32m BW/s 4k ,32m
gp2 r rand 3100 4 12.1MiB 129MiB
gp2 w rand 1791 4 7165KiB 134MiB
gp2 r seq 3100 4 12.1MiB 129MiB
gp2 w seq 1863 4 7453KiB 134MiB
io1 r rand 17.2k 13 67.2MiB 429MiB
io1 w rand 2253 15 9014KiB 484MiB
io1 r seq 17.3k 13 67.6MiB 428MiB
io1 w seq 2422 15 9690KiB 483MiB
NVMe (i3en) r rand 20.8k 10 81.1MiB 350MiB
NVMe (i3en) w rand 33.2k 5 130MiB 165MiB
NVMe (i3en) r seq 45.1k 10 176MiB 346MiB
NVMe (i3en) w seq 33.0k 5 133MiB 165MiB

EFS

AWS のマネージド NFS サービスである EFS は案外選択肢が豊富で、2 つの Performance Mode と 2 つの Throughput Mode を選べるため、 2 * 2 = 4 通りのボリュームを設定できる。

  • Performance Mode: General Purpose or Max I/O
  • Throughput Modes: Bursting or Provisioned
    • Bursting => 使用容量が増えるとスループットが引き上げられるモード、今回は空の状態でベンチマークを実行したので最低ラインのスループットなはず
    • Provisioned => 使用容量に関わらず課金でスループットを買えるモード、今回のベンチマークは最大値である 1024 で測定

Performance Mode の違いはよくわからなかった。
ほとんどのシチュエーションでは General Purpose を使っておけば良さそう。
(Performance Mode は EFS ボリューム作成後に変更できない)

Throughput Mode は EFS ボリュームを作った後でも変更できるので、お金に余裕があるときは Provisioned で始めて容量が増えたら Bursting に変える方法が使えそう。

type r/w rand/seq IOPS 4k ,32m BW/s 4k ,32m
GP (bursting) r rand 894 3 3580KiB 101MiB
GP (bursting) w rand 250 3 1003KiB 104MiB
GP (bursting) r seq 900 3 3604KiB 101MiB
GP (bursting) w seq 258 2 1034KiB 95.4MiB
GP (provisioned) r rand 919 8 3680KiB 258MiB
GP (provisioned) w rand 253 6 1014KiB 204MiB
GP (provisioned) r seq 1021 8 4085KiB 258MiB
GP (provisioned) w seq 276 6 1105KiB 202MiB
Max I/O (bursting) r rand 665 3 2662KiB 104MiB
Max I/O (bursting) w rand 187 3 748KiB 102MiB
Max I/O (bursting) r seq 775 3 3103KiB 104MiB
Max I/O (bursting) w seq 263 3 1054KiB 103MiB
Max I/O (provisioned) r rand 762 8 3052KiB 257MiB
Max I/O (provisioned) w rand 265 4 1061KiB 153MiB
Max I/O (provisioned) r seq 734 8 2940KiB 258MiB
Max I/O (provisioned) w seq 261 5 1048KiB 161MiB

That’s all

AWS のストレージは本当に種類が多くて選択に迷っていたので一度全部試してみたかった。

今回、「インターネットや AI を活用し、世の中にデライトを届けていく」dena.aiの提供でベンチマーク実行させていただきスッキリしました。感謝 🙏