こんにちは、cloudpack今岡 です。

EBSにSSDタイプが追加されてしばらく経ちましたが、

「でも、お高いんでしょ?」

「値段調べたけど、そんなに高く無いし、SSDだったら絶対に早いよね!HDDよりは」

という先入観があると思いますが、ちゃんと調べてみました。

素晴らしいドキュメント

それはAWSのドキュメントです。

これを読めば、このエントリはもう用済みです。#説明書読まない病は直さんとイカンです。

EBSのクレジット

General PurposeにはEBS I/O クレジットというものが有ります。他方でも紹介されていますが、ディスクI/Oが少ない時にクレジットがたまり、大規模なディスクI/Oが発生した時にそのクレジット分だけバーストするというものです。同じような考え方が t2系インスタンスのCPUクレジットですが、考え方が少し異なる点があります。

EBSクレジットの目的、CPUクレジットとの違い

使わない時にクレジットがたまる(但し上限あり)という考え方は両方同じです。しかし、EBSクレジットは、最初からかなりクレジットを持った状態から始まりますつまり。

  • CPUクレジット 起動直後はほとんど溜まってない
  • EBSクレジット 起動直後からそこそこある

どんなシステムでも確実にEBSのI/Oがホットになる瞬間があります。それはOSの起動時です。EBSクレジットの目的はここにあります。

General Purpose (gp2) と Provisioned IOPS (io1)

gp2にはEBSクレジットが存在し、これを使うことによって3000IOPSまで、EBSクレジットが続く限りバーストできます。それに対してio1は、予め指定したIOPSを買うイメージです。では、gp2のクレジットが尽きたらどうなるのでしょうか?ここがベースラインです。ベースラインは一律ボリュームサイズ(GB)の3倍です。つまり100GBならば300IOPSがベースラインとなります。io1はこの容量/IOPSのレートを変えたい用途でも使えます。

  • 100GBだけど 1000 IOPSは絶対欲しい

EC2のEBSでは、GB容量の30倍という極端な例(5GB – 150 IPOSとか) が作れますが、Amazon RDSの io1は 100GB – 1000 IOPSが下限となるため、RDS用途の主たる目的はパフォーマンスを保証したいときだと思います。

ベースラインとバースト

gp2のベースラインは GB容量 * 3 となります。バーストして、クレジットを使い切ると、ベースラインとなるのは書きましたが、計算ルールがCPUと異なります。バーストの上限は3000 IOPSで、ベースラインとの差分で計算されます。つまり、1TB の gp2 の場合、ベースラインは 3000 IOPSなので、そもそもバーストの必要がありません。対して100GBの gp2の場合、ベースラインは 300 IOPS 、さらに 200GBの場合は 600 IOPS となり、バーストはこのベースラインとの差分で計算されます。つまり、ベースラインが高い = 容量が大きいほど、クレジット消費は緩やかになります。

ボリュームサイズ(GiB) ベースパフォーマンス(IOPS) 3,000 IOPS での最大のバースト期間(秒数) 空のクレジットバランスを補充する秒数
1 3 1,802 1,800,000
100 300 2,000 18,000
250 750 2,400 7,200
500 1,500 3,600 3,600
750 2,250 7,200 2,400
1,000 3,000 該当しない* 該当しない*

Amazon EBS ボリュームの種類 – Amazon Elastic Compute Cloudより抜粋

ご利用は計画的に

ほとんどのユースケースにおいて、gp2がコストパフォーマンス的には有利でしょう。ただし、ディスクIOがある程度見積もれる状態かつ、gp2のベースラインでは足りない場合、io1という選択を考慮します。magneticについては、極端に少ない容量の場合は有利であると思います。

元記事はこちらです。
RDSをSSD(General Purpose)で運用するときに注意すべきこと