Cloud server illustration explaining AWS EC2 instance families and cost optimization
Technology

How to Choose an AWS EC2 Instance Type: A Practical 2026 Guide

Daylongs ·
#AWS #EC2 #cloud cost #Graviton #Savings Plans #Spot Instances #infrastructure #DevOps

Here’s the short answer: most workloads should start on a t- or m-family instance and move to c, r, or g only when a real bottleneck shows up. AWS EC2 lists hundreds of instance types, but in practice you touch only a handful of families day to day. Don’t agonize over the perfect type up front. Start small, watch your CloudWatch metrics, and shift toward whatever resource you actually run out of. My default: I launch every new service on t4g (Graviton), watch it for a month, then decide.

Having paid a few years’ worth of these bills personally, I’ll tell you the expensive mistakes almost never come from not knowing the families. They come from picking a type once and forgetting it exists. Below I’ll walk through the family letters, how to pick per workload, and the three levers that actually move the bill: Savings Plans, Spot, and Graviton.

What’s the difference between the families? (t, m, c, r, i, g)

An instance type name like m7g.large reads as family (purpose) + generation + g for Graviton (arm) + size. Learn to read the letter and you’re halfway done.

FamilyCharactervCPU:memoryTypical use
tBurstable general purpose1:2–1:4Web servers, APIs, dev/test, small spiky services
mBalanced general purpose1:4Steady-load web apps, mid-size backends
cCompute-optimized1:2Batch compute, game servers, encoding, high-traffic APIs
rMemory-optimized1:8In-memory caches, large databases, Redis/Elasticsearch
xExtra-large memory1:16+SAP HANA, huge in-memory databases
iStorage (NVMe) optimizedIO-heavy databases, log processing
g / pGPUML training/inference, video transcoding

The ratio is the whole game. A c-family gives you relatively more CPU; an r-family gives you more memory. Pick the family that leans toward the resource your app exhausts first. If you already picked your cloud provider and want the bigger AWS-vs-GCP-vs-Azure picture, I covered that in the cloud hosting comparison; here I’m staying inside AWS.

Burstable (t) vs. fixed performance (m): what’s the catch?

The t-family trips people up because of that word, burstable. A t-instance runs at a baseline (say 20-40%) of its vCPUs and banks the rest as CPU credits. When traffic spikes, it burns credits to sprint toward 100%.

The trap is when credits run out. Unless you’re on Unlimited mode, it throttles back to baseline, so you get the bizarre situation where CPU reads 40% but the service crawls. The decision rule is simple:

  • CPU sawtooths up and down → t-family wins.
  • CPU sits above 60% consistently → m-family wins (running t in Unlimited mode all day is more expensive).

Dev environments, internal tools, blogs and landing pages with bursty traffic are textbook t-family. Trying to hold up an always-busy checkout API on a t-instance is the classic mistake.

What should I pick for my workload?

Here’s how I’d map it. Treat this as a starting point, then adjust after two weeks of metrics.

WorkloadFirst pickWhy
New web service / APIt4gCheap, burstable, easy to migrate later
Steady-load backendm7gBalanced, predictable performance
Batch / encoding / game serverc7gCompute-heavy, per-core matters
Cache / search / large DBr7gMemory headroom, avoids OOM
CI runners / renderingc (Spot)Interruption-tolerant, massively parallel
ML inferenceg (Spot/schedule)Needs GPU, wasteful if always on
Log / time-series DBiLocal NVMe throughput

Always run the newest generation. m7 usually beats m6 at the same price; t4g beats t3. Leaving stale launch templates in place is silent leak number one. If you’re building out a team that needs to understand this stuff, it’s worth checking whether the fundamentals are actually there — I got into that skills question in the coding bootcamp ROI piece.

Does moving to Graviton (arm) actually make it cheaper?

Yes, and it’s the surest single win in EC2 cost optimization right now. Graviton is AWS’s own arm-based processor, marked by the g suffix (t4g, m7g, c7g, r7g). Expect roughly 20% better price-performance than the equivalent x86. Changing one letter in your instance type lowers the bill — a rare free lunch.

The one hurdle is architecture compatibility. Most interpreters and runtimes (Node, Python, Go, Java, Ruby) and official Docker images already ship arm64. Check these three:

  • Does your container image build a linux/arm64 multi-arch variant?
  • Do your native extensions (C-extension Python packages and the like) ship arm wheels?
  • Do your commercial monitoring/security agents support arm?

Pass those and most migrations are uneventful. AI coding tools cut the grind of multi-arch Dockerfiles and migration scripts dramatically; which ones are worth using day to day is in my Cursor vs. Copilot comparison.

How much do you save? (Savings Plans, Spot, On-Demand)

The purchase model matters as much as the type. The same c7g can cost 3-4x more or less depending on how you buy it.

Purchase modelDiscountFlexibilityRiskBest for
On-DemandNone (baseline)HighestNoneShort, irregular, testing
Compute Savings PlansLarge (1/3-yr commit)High (change family/region)Under-use penaltyAlways-on baseline
EC2 Instance Savings PlansLargerLower (family locked)Less flexibleFully fixed core
SpotUp to 70-90%Low2-min reclaimInterruption-tolerant work

The real-world strategy is layering. Commit your always-on baseline to a Savings Plan for the discount, ride variable traffic on On-Demand, and fill the interruption-tolerant slack with Spot. An Auto Scaling group’s Mixed Instances Policy lets you set the On-Demand/Spot split as policy. Start conservative — commit to maybe 70% coverage based on Cost Explorer’s Savings Plans recommendation, then tighten. In US terms, remember this is a fixed operating cost that hits the same line as payroll and SaaS, so it belongs in your monthly finance review, not just the engineering channel.

What are the common mistakes? (a failure case)

Let me bundle the usual landmines into one story.

The case: a startup that got surprised by its bill. A team ran production on four m5.2xlarge On-Demand instances. Traffic only spiked during business hours, but all four ran overnight at 15% average CPU. On top of that, their CI runners were separate always-on On-Demand boxes. Break it down:

  1. Over-provisioned — 15% CPU means they could drop two sizes. Compute Optimizer was already recommending m7g.large.
  2. No Spot — CI runners can just restart if interrupted, yet they burned On-Demand money on them.
  3. Old-gen, x86 by inertia — moving m5 (x86) to m7g (Graviton) alone saved nearly 20%.
  4. No commitment — a year-round baseline with no Savings Plan attached.

Fixing those four cut the monthly bill by more than half. No magic — just the fundamentals: latest generation, Graviton, right size, commit the baseline, Spot the variable slack. If your team runs infrastructure remotely, bake this cost review into a recurring rhythm; the operating cadence I described in the remote work jobs guide applies directly.

What to watch every month

Instance type isn’t a set-and-forget decision. Here’s what I review monthly:

  • Compute Optimizer recommendations — the over/under-provisioned list.
  • Savings Plans coverage and utilization — is any commitment sitting idle?
  • Spot interruption rate — if one type gets reclaimed often, widen your candidate types.
  • Generation refresh — when a new gen lands, benchmark and consider swapping.
  • Region placement — is any latency-insensitive workload stuck in an expensive region?

Cloud infrastructure spend ends up looking a lot like portfolio management. You lock in the baseline with a commitment the way you’d hold a long-term position, and you take the variable exposure flexibly with Spot. That allocation mindset rhymes surprisingly well with the portfolio logic I laid out in the AI stocks investing guide.

Bottom line: start small, watch the metrics, and pull the three levers — Graviton, Savings Plans, Spot — in that order. That single habit changes your EC2 bill more than anything else.

This article is for informational purposes only and does not recommend any specific architecture or purchase model. AWS pricing and instance specs change frequently, so always confirm real costs on the official AWS pricing page and in your own account’s Cost Explorer.

Which EC2 instance type should I start with?

If you're unsure, start with a t-family instance (t3 or t4g). Most web servers, APIs, and dev environments run fine on burstable instances. If your CPU sits consistently high, move to m; if it's compute-heavy, go c; if you're running out of memory, go r. Grabbing a big instance on day one is the most common waste.

What does 'burstable' actually mean on t-family instances?

A t-instance runs at a baseline fraction of its vCPUs most of the time and banks the unused capacity as CPU credits. When load spikes, it burns credits to hit up to 100%. Once credits run dry, it throttles back to baseline. For always-busy workloads that's a bad deal, and m-family is the better fit.

Does switching to Graviton (arm) really save money?

Yes. Graviton instances (t4g, m7g, c7g, r7g) typically deliver around 20% better price-performance than the equivalent x86 instance. Most language runtimes (Node, Python, Go, Java) and official container images already support arm64. Just confirm your native libraries and any commercial agents run on arm.

Savings Plans or Reserved Instances — which is better?

For most teams, Compute Savings Plans win on flexibility. You commit to a dollar-per-hour amount for one or three years, and the discount follows you even if you change instance family, region, or OS. Unless your footprint is completely locked in, look at Savings Plans before RIs.

When is it safe to use Spot Instances?

Only for interruption-tolerant work: batch jobs, CI runners, rendering, stateless workers, part of a Kubernetes node pool. Spot can be 70-90% cheaper than On-Demand, but AWS can reclaim the capacity with a two-minute warning, so keep it away from stateful databases and payment services.

How do I read the vCPU-to-memory ratio?

Each family has a fixed ratio: c is roughly 1:2, m is 1:4, r is 1:8. Watch whether your app runs out of CPU or memory first in CloudWatch. If you're on a family with a lot of the resource you never touch, you're paying for headroom you don't use.

How much does the instance generation matter (t3 vs t4g, m6 vs m7)?

Newer generations usually give more performance at the same price. Unless you have a specific reason, always run the latest generation. Leaving old generations frozen in an Auto Scaling group or launch template is a classic silent cost leak.

Is us-east-1 really the cheapest region?

us-east-1 (N. Virginia) is typically the lowest-priced US region and often gets new instance types first. But latency to your users matters. If you serve the West Coast, us-west-2 may be worth the small premium. Move only latency-insensitive batch or dev workloads to the cheapest region.

If I use Auto Scaling, do I still need to think about instance type?

Yes. Auto Scaling automates how many, not which. Put the wrong type behind Auto Scaling and you just multiply the waste. Fix the type first, then add scaling. A Mixed Instances Policy lets you blend Spot into the group for big savings.

When do I actually need GPU instances (g/p family)?

Only when parallel compute is the point: model training, large-scale inference, video transcoding. They're expensive, so leaving them running around the clock will blow up your bill. If you only need inference, look at running g-family on Spot or a schedule that spins them up and down.

How do I know if I sized an instance wrong?

Turn on AWS Compute Optimizer and the Rightsizing recommendations in Cost Explorer. Watch CPU, memory, and network utilization for at least two weeks, then step down the instances flagged as over-provisioned one size at a time. Most first-round savings come straight from here.

공유하기

관련 글