plainstackBook a free call
← All guides

Storage — 8 min read

EBS volume types explained: gp2, gp3, io1, io2, st1, sc1

If you're unsure which to pick, you want gp3. Here's why, and when that's wrong.

By Plainstack/

There are six EBS volume types. Most teams only ever need one of them, but the naming gives no clue which, and the AWS documentation explains them in terms of what they do rather than when to pick one.

Here is the short version, and then what each is actually for.

The six, in one table

TypeMediaWhat it's forRough cost position
gp3SSDThe default. Almost everything.Baseline
gp2SSDThe previous default. Nothing new.~20% more than gp3
io2SSDLatency-critical databases needing guaranteed IOPSSeveral times gp3
io1SSDThe older provisioned-IOPS typeSeveral times gp3
st1HDDBig sequential reads — logs, data processingCheaper per GB, slow random
sc1HDDCold, rarely-touched bulk dataCheapest per GB

General-purpose SSD: gp2 and gp3

These are the disks you attach to an EC2 instance without thinking about it. Both are SSD-backed and suit almost every workload — application servers, small and medium databases, container hosts, build agents.

gp2 ties performance to size. You get 3 IOPS per provisioned gigabyte. That means the only way to buy more performance is to buy more storage you don't need. Volumes under 1 TB use a burst-credit system to exceed their baseline temporarily, which works until a sustained workload drains the credits and performance falls off a cliff you didn't know was there.

gp3 separates them. Every volume gets 3,000 IOPS and 125 MB/s included, no matter its size, and you can provision more of either independently. A 100 GB gp3 volume has the same baseline performance as a 1 TB one.

So gp3 is cheaper and faster for most volumes, which is unusual enough to be worth acting on. The migration is online — no snapshot, no detach, no downtime — with two cases worth checking first.

Provisioned IOPS SSD: io1 and io2

These exist for one situation: a database where you need a specific IOPS number guaranteed, with low latency variance, and where the cost of not having it is worse than the cost of having it.

They bill separately for provisioned IOPS on top of storage, and that charge is substantial. io2 supersedes io1 — better durability and higher IOPS-per-GB ratios at similar pricing, so there's rarely a reason to choose io1 today.

The common mistake is choosing them defensively. During a migration, when nobody was certain what the workload needed, provisioned IOPS felt like the safe option. Then it stayed for three years. If you're using 2,000 of 20,000 provisioned IOPS, gp3 will do the job at a fraction of the price — check consumed against provisioned before you assume you need it.

io1 vs io2 vs gp3 goes through the arithmetic with an interactive model, and shows how to pull the consumed figure out of CloudWatch — it's the one number that settles this, and it isn't in the EC2 console.

Throughput HDD: st1 and sc1

Spinning disk. Cheap per gigabyte, good at large sequential reads, and genuinely bad at random access — they are not bootable and will make a database miserable.

st1 suits log processing, data warehouse staging, and streaming workloads that read big contiguous blocks. sc1 is colder and cheaper still, for data you keep but rarely touch.

Both are niche. If your workload isn't obviously sequential, they're a false economy — the price per gigabyte looks attractive right up until something needs a random read.

What actually drives the bill

Choosing the type is the small decision. Three things matter more:

You pay for provisioned size, not used size. A 500 GB volume holding 40 GB costs the same as a full one. Nothing in the console tells you.

Volumes grow but never shrink. You can expand in place; reducing means creating a new volume, copying, and swapping. So provision small and let it grow, rather than sizing for three years out on day one.

Unattached volumes bill at full price forever. Every volume in the available state is costing money and doing nothing, and they accumulate every time an instance terminates with delete-on-termination switched off.

Those three explain far more of a typical EBS bill than the type ever does. The EBS cost guide covers them, along with snapshots, which are more subtle than they look.

Choosing, in one pass

Decide

Which volume type should this be?

Almost anythinggp3. Application servers, container hosts, most databases, build agents. Start here and only move if you can measure a reason to.
Still on gp2Move it to gp3. Cheaper and usually faster, online migration, no downtime. Check baseline IOPS first on volumes above about 1 TB.
Database needing guaranteed low latencyio2 — but confirm consumed IOPS against provisioned first. Most workloads that were put on provisioned IOPS out of caution belong on gp3.
Large sequential reads onlyst1, or sc1 if it's genuinely cold. Never for anything doing random access, and never as a boot volume.

Not sure what your storage is actually costing relative to everything else? The free teardown reads an AWS Cost Explorer export in your browser and splits the bill by service — including the EC2 — Other bucket where EBS hides. No signup, nothing uploaded.

Check your own account

Does this apply to you? Find out in two seconds.

Drop a Cost Explorer export into the free teardown. It reads your service mix and tells you which of these patterns show up in your bill — in your browser, with no upload and no email.