EBSボリュームタイプの選び方—gp3の80,000 IOPSとインスタンス側の上限

gp3のIOPS上限は80,000、スループット上限は2,000 MiB/s。AWSが2025年9月に、16,000 IOPS / 1,000 MiB/s から引き上げた値です。ただ、そこまで引き出せるかどうかはボリューム側だけでは決まりません。

目次

gp3はサイズと性能が切り離されている

公式ドキュメントの “gp3 volume performance” 節は、gp3のベースラインをこう定義しています。

gp3 volumes deliver a consistent baseline IOPS performance of 3,000 IOPS, which is included with the price of storage.

1 GiBのgp3でも3,000 IOPSが出る。ここがgp2との決定的な差です。

ベースラインの3,000 IOPSと125 MiB/sは追加課金なし

gp3はストレージ料金の中に3,000 IOPSと125 MiB/sが含まれています。しかもGiBあたりの単価はgp2より20パーセント安い。同じ節のTipが「gp3はバースト性能を使わない」と言い切っているとおり、プロビジョニングした値を無期限で出し続けられます。3,000 IOPSを24時間流しても落ちない。

追加分は500 IOPS/GiBの比率で決まる

3,000を超える分は追加課金でプロビジョニングします。上限は80,000 IOPSですが、サイズとの比率に 500 IOPS per GiB という制約がかかる。つまり80,000 IOPSを取るには160 GiB以上が要ります(500 × 160 = 80,000)。

gp2の3 IOPS/GiBと比べると比率は約167倍になります。gp2で16,000 IOPSを出すには5,334 GiBが必要でしたが、gp3なら32 GiBで届きます。

スループットは1 IOPSあたり0.25 MiB/s

スループットはサイズではなくプロビジョニングIOPSに紐づきます。比率は 0.25 MiB/s per provisioned IOPS、上限2,000 MiB/s。上限に届く条件は8,000 IOPS以上かつ16 GiB以上です。

2,000 MiB/s ÷ 0.25 MiB/s per IOPS = 8,000 IOPS
8,000 IOPS ÷ 500 IOPS per GiB     = 16 GiB

AWS Outpostsのgp3だけは上限が別で、サイズ16 TiB・16,000 IOPS・1,000 MiB/sに据え置かれています。この条件が載るのはボリュームタイプ一覧の脚注6と、”gp3 volume performance” 節末尾のNoteの2箇所だけ。表を眺めているだけでは拾えません。

gp2はサイズが性能を決める

gp2は3 IOPS/GiBでベースラインが線形に伸びます。33.33 GiB以下は最低値の100 IOPS、5,334 GiBで上限の16,000 IOPSに達します。それを下から支えるのがI/Oクレジットのバケットです。

gp2のI/Oクレジット収支 未使用時にクレジットが蓄積し、上限540万に達する。枯渇するとベースライン性能まで低下する 蓄積 3 IOPS/GiB/秒 I/Oクレジット 上限 540万 3,000 IOPS を約30分 空になるとベースラインへ 3 IOPS/GiB・最低 100 IOPS

540万クレジットは3,000 IOPSを約30分

ボリュームはI/O需要がベースライン以下のとき、1 GiBあたり毎秒3クレジットを貯めます。貯められる上限は540万クレジットです。この量が、公式の “gp2 volume performance” 節にある「最大バースト性能の3,000 IOPSを少なくとも30分維持できる」という表現の根拠です。

消費レートはバーストIOPSからベースラインIOPSを引いた値になります。100 GiB(ベースライン300 IOPS)で3,000 IOPSを出し続けると毎秒2,700クレジット減る計算で、公式の表は持続時間を2,000秒としています。

サイズ(GiB)ベースライン3,000 IOPSの持続空から満タンまで
1〜33.33100 IOPS1,862秒54,000秒(15時間)
100300 IOPS2,000秒18,000秒(5時間)
7502,250 IOPS7,200秒2,400秒(40分)
1,0003,000 IOPS該当なし該当なし

効いてくるのは復帰の遅さ。33 GiBのボリュームでクレジットを使い切ると、満タンに戻るまで15時間かかります。夜間バッチで枯らすと、翌朝の処理は100 IOPSで走る。

1,000 GiBを超えるとバーストは関係なくなる

1,000 GiBでベースラインが3,000 IOPSに達し、バースト上限と並びます。それ以上のサイズではベースラインがバーストを上回るため、クレジットという仕組み自体が効かなくなる。公式の表でも1,000 GiB以降は持続時間が「N/A」です。

ボリュームタイプを数値で並べる

選定で見る数値だけを抜き出します。

タイプ最大IOPS最大スループットサイズ耐久性ブート
gp380,0002,000 MiB/s1 GiB〜64 TiB99.8〜99.9%
gp216,000250 MiB/s1 GiB〜16 TiB99.8〜99.9%
io2 Block Express256,0004,000 MiB/s4 GiB〜64 TiB99.999%
io164,0001,000 MiB/s4 GiB〜16 TiB99.8〜99.9%
st1500500 MiB/s125 GiB〜16 TiB99.8〜99.9%不可
sc1250250 MiB/s125 GiB〜16 TiB99.8〜99.9%不可

HDD系はブートボリュームに使えない

st1とsc1はブートボリュームに使えません。既存のルートボリュームをこの2つへ変更することもできない。Elastic Volumesの “Limitations” 節は、この禁止に「インスタンスからデタッチしていても」という条件を付け足しています。外してもタイプは変えられない。

io2は2025年4月30日から全てBlock Express

io2とio2 Block Expressは、現在は区別が要りません。公式の “Considerations” 節が、2025年4月30日をもって新規・既存を問わず全てのio2ボリュームがBlock Expressになったと明記しています。耐久性99.999%を年間故障率に直すと、gp3の「1,000ボリュームあたり年2本」に対してio2は「100,000ボリュームあたり年1本」になります。

実効性能はインスタンス側の上限で決まる

gp3に2,000 MiB/sをプロビジョニングしても、m5.largeにアタッチした場合は81.25 MB/sしか出ない時間帯があります。ボリュームの上限とインスタンスのEBS帯域は別物で、AWSは小さい方を適用するためです。

EBSの実効性能を決める2つの上限 アプリのI/O要求は、インスタンスのEBS帯域とEBSボリュームの上限のうち小さい方に制限される アプリのI/O要求 200 MB/s 出したい インスタンスのEBS帯域 m5.large ベースライン 81.25 MB/s gp3ボリューム 3,000 IOPS / 125 MiB/s 実効値は小さい方の 81.25 MB/s

m5.largeのベースラインは650 Mbps

EBS最適化インスタンスの表は、小さいサイズについてベースラインと最大の2段を持ちます。m5.largeの数値を並べます。

帯域スループット(128 KiB I/O)IOPS(16 KiB I/O)
ベースライン650 Mbps81.25 MB/s3,600
最大4,750 Mbps593.75 MB/s18,750

gp3のベースライン125 MiB/sは、MB/sに直すと131.1 MB/s。m5.largeのベースライン81.25 MB/sの方が小さい。一方でIOPSは3,600対3,000とインスタンス側が上回ります。IOPSは足りているのに、スループットが先に頭打ちになる。

30分のバーストを使い切った後

m5.largeは最大4,750 Mbpsを出せますが、無制限ではありません。EBS最適化インスタンスの表の脚注が持続条件を規定しています。

These instances can sustain the maximum performance for 30 minutes at least once every 24 hours, after which they revert to their baseline performance.

24時間に少なくとも1回、30分。使い切ればベースラインへ戻ります。しかもその最大値ですら593.75 MB/sで、gp3の上限2,000 MiB/s(=2,097 MB/s)の28%にしかなりません。m5.4xlarge以上のサイズには別の脚注が付き、こちらは無期限で維持できる。長時間のI/Oを流すなら、インスタンスサイズの選定がストレージ設計の一部になります。この階層のしくみはEC2インスタンスタイプの命名規則と購入オプションで扱った、t3のCPUクレジットと同じ発想です。

ボリュームとインスタンスのどちらが詰まっているか

切り分けにはCloudWatchのメトリクスを使います。ただし平均値のメトリクスは当てになりません。

  • VolumeIOPSExceededCheck / VolumeThroughputExceededCheck は、1分の中の1秒でもプロビジョニング値を超えたら 1 を返す
  • VolumeAvgIOPS / VolumeAvgThroughput は1分平均のため、数秒のマイクロバーストを平準化して見落とす
  • BurstBalance が対象にするのはgp2・st1・sc1の3つ。バーストを使わないgp3とio2にバケットは無い

gp3で「たまに遅い」が起きるとき、VolumeThroughputExceededCheck0 のままならボリュームは上限に触れていない。その場合はインスタンスのEBS帯域か、そもそもI/Oを流し切れていないアプリ側を疑う順番になります。

IOPSの目安はI/Oサイズから逆算する

「3,000 IOPSあれば足りるか」は、I/O 1回のサイズを決めないと答えが出ません。

SSDの1 I/Oは最大256 KiB

公式の “IOPS” 節によると、AWSは1回のI/Oとしてカウントする上限をSSDで256 KiB、HDDで1,024 KiBに定めています。この閾値を境に、小さいI/Oはマージされ、大きいI/Oは分割される。

アプリ側のI/OSSDでのカウント挙動
1,024 KiB × 1回4 IOPS256 KiBずつ4分割
32 KiB × 8回(連続)1 IOPS256 KiBに結合
32 KiB × 8回(ランダム)8 IOPS結合されない

連続かランダムかで8倍違う。ベンチマークツールの数字をそのまま見積もりに使うと、この差で外します。

256 KiBのI/Oは1,000 IOPSでスループット上限に当たる

“I/O size and volume throughput limits” 節に、この計算の例が載っています。1,000 GiB未満でクレジットが残っているgp2は3,000 IOPS・250 MiB/sが上限ですが、I/Oサイズが256 KiBの場合、1,000 IOPS(1,000 × 256 KiB = 250 MiB)でスループット側に先に当たります。IOPSは2,000残っているのに使えない。

逆にI/Oサイズが16 KiBなら、3,000 IOPSでもスループットは46.9 MiB/sで余裕があります。

キューの深さは1,000 IOPSにつき1

プロビジョニングした性能を出し切るには、アプリ側が十分なI/Oを投げ続ける必要があります。公式は目安をこう書いています。

For maximum consistency, a volume must maintain an average queue depth (rounded to the nearest whole number) of one for every 1,000 provisioned IOPS in a minute.

3,000 IOPSのボリュームなら平均キュー深度3。シングルスレッドで同期I/Oを回している構成では、キューが1のままでプロビジョニング分を使い切れません。IOPSを上げる前に、アプリの並列度を確認する。

ボリュームタイプ変更にダウンタイムは要らない

Elastic Volumesを使えば、アタッチしたままタイプ・サイズ・IOPS・スループットを変えられます。インスタンスの停止もデタッチも不要。

1
変更前にスナップショットを取る。公式の Process overview でも1番目に置かれている(任意扱い)
2
aws ec2 modify-volume で変更を要求し、describe-volumes-modificationscompleted まで追う
3
サイズを増やした場合のみ、OS側でファイルシステムを拡張する。AWSはここまでやらない

modify-volumeと状態遷移

公式ドキュメントは、100 GiBのgp2を200 GiB・10,000 IOPSのio1へ変える例を載せています。

aws ec2 modify-volume \
    --volume-id vol-01234567890abcdef \
    --volume-type io1 \
    --iops 10000 \
    --size 200

ドキュメントに載っている応答がこれです。

{
    "VolumeModification": {
        "TargetSize": 200,
        "TargetVolumeType": "io1",
        "ModificationState": "modifying",
        "VolumeId": "vol-01234567890abcdef",
        "TargetIops": 10000,
        "StartTime": "2022-01-19T22:21:02.959Z",
        "Progress": 0,
        "OriginalVolumeType": "gp2",
        "OriginalIops": 300,
        "OriginalSize": 100
    }
}

ModificationStatemodifyingoptimizingcompleted と遷移します。サイズ増加が効くのは optimizing に入った時点で、ここは数秒で済みます。対して性能変更は数分から数時間かかり、1 TiBのフル使用ボリュームで約6時間が目安と書かれています。optimizing の間、性能は変更前を下回りません。

24時間に4回、サイズは縮小できない

“Considerations” 節と “Limitations” 節に制約がまとまっています。運用で引っかかるのはこのあたり。

  • 直前の変更が completed になるまで次の変更を出せない。加えてローリング24時間で4回まで
  • サイズは増加のみ。縮小したい場合は小さいボリュームを作って rsyncrobocopy でデータを移す
  • 変更要求は送信後にキャンセルできない

変更間隔にクールダウン時間の規定はありません。条件は completed 待ちと回数制限で、時間は出てこない。1 TiBで約6時間というのは変更処理そのものにかかる所要時間で、次の変更までの待ち時間ではありません。

gp2からgp3へIOPS未指定で変えたとき

タイプだけ指定してIOPSやスループットを省略すると、AWSが自動で値を決めます。判定は「元のgp2相当」と「gp3のベースライン」の高い方を取ります。

公式の例では、250 MiB/s・1,500 IOPSの500 GiB gp2を変換すると、gp3側は3,000 IOPS・250 MiB/sになります。IOPSは元の1,500ではなくベースラインの3,000が採用され、スループットは元の250 MiB/sがgp3ベースライン125 MiB/sを上回るのでそのまま引き継がれる。移行して性能が下がることはない代わりに、スループット125 MiB/s超の分は追加課金の対象になります。

まとめ

  • gp3は3,000 IOPS・125 MiB/sがサイズ非依存で付く。追加分は500 IOPS/GiB、0.25 MiB/s per IOPSの比率で、上限は80,000 IOPS・2,000 MiB/s
  • gp2はサイズがそのまま性能。33 GiBのボリュームはクレジットを使い切ると回復に15時間かかる
  • 実効性能はボリューム上限とインスタンスのEBS帯域の小さい方。m5.largeのベースラインは81.25 MB/sで、gp3の125 MiB/sに届かない
  • IOPSの見積もりはI/Oサイズ次第。SSDは256 KiBを1 I/Oとしてカウントし、連続I/Oは結合される

タイプ変更はダウンタイムなしで通りますが、24時間4回の上限とサイズ縮小不可という制約が残ります。移行の前にスナップショットを取っておけば、判断を間違えても戻せる。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次