Identifying Scaling Bottlenecks
Amdahl's Law, the NALSD method, and how Google does back-of-envelope on a whiteboard.
Overview
Bottlenecks come from growth patterns
Scaling problems rarely look like "we need bigger machines." They look like "this design works at 10K QPS but breaks at 100K." The bottleneck is a component whose growth pattern the original design didn't anticipate.
NALSD: Non-Abstract Large System Design
SRE Workbook Ch 12 defines NALSD as "the ability to assess, design, and evaluate large systems." Its thesis: "all systems will eventually have to run on real computers in real datacenters using real networks." You can't hand-wave the math.
The worked example: AdWords CTR dashboard at 500K search QPS
- 1 — Single machine — Fails: at 2KB per query event, 86.4 TB/day before indexes; 1,563 machines with 64GB RAM just for storage, and 2,500 disks for I/O
- 2 — MapReduce — Breaks the 5-minute freshness SLO
- 3 — Sharded LogJoiner — Survives at single-DC scale
- 4 — Multi-DC with Paxos — Handles regional failure
> [!IMPORTANT] Separate components by growth pattern. Storage, compute, join state and replication bandwidth each scale independently if you let them; merged together, the slowest caps the whole system.
Amdahl's Law: the serial fraction
If 5% of your work is serial, you can't parallelize past a 20× speedup no matter how many cores you add.
> [!TIP] Find the serial fraction, eliminate it, repeat.
Key concepts
- NALSD (Non-Abstract Large System Design)
- Workbook Ch 12 method: "the ability to assess, design, and evaluate large systems" using actual numbers — KB per event, RTT per RPC, ops/sec per host.
- Four-question loop
- Possible? Better? Feasible (at scale)? Resilient (under failure)? — the scaffolding for any system-design conversation.
- Amdahl's Law
- Speedup limit = 1 / (serial_fraction + parallel_fraction/N). With 5% serial, max speedup is 20× regardless of N. The serial fraction is the real bottleneck.
- Separate components by growth pattern
- Storage / compute / join-state / replication-BW each have their own scaling curve. Merging them creates a single slowest-growing component that caps the system.
- Hot shards
- Power-law distributions are everywhere — 80% of traffic to 20% of keys. Hash partitioning alone doesn't solve hot shards; you need consistent hashing + bounded-load or virtual nodes.
When to use it
- System-design interviews — NALSD's four-question loop is the canonical interview answer scaffold
- Capacity planning — when does the current architecture stop working?
- Pre-launch reviews — has the design been stress-tested past expected load?
- Performance investigations — what's the actual bottleneck under load?
Interview questions
- How do you approach a scaling-bottleneck question on a whiteboard?
- How does Amdahl's Law apply to scaling bottlenecks?
- I've scaled my service horizontally and one shard is overloaded. Why?
Sign up free to read the full topic
More SRE topics
Start free on Cariara · Coding problems · System design studio