Capacity Planning Scenarios
vllm-sr-sim answers fleet-planning questions that cannot be resolved
from first principles alone: where to set a split threshold, whether a fleet
will actually meet SLO under real queue dynamics, which GPU type is cheapest
for a given workload, and when to pre-provision the next tier.
GPU unit costs used throughout:
| GPU | $/hr | $/yr |
|---|---|---|
| A10G 24 GB | $1.01 | $8.85 K |
| A100 80 GB | $2.21 | $19.4 K |
| H100 80 GB | $4.02 | $35.2 K |
P99 TTFT = P99(KV-slot queue wait) + mean prefill time. Each KV-cache slot is modelled as a server in an M/G/c queue.
When to split pools — the short version
Before reaching for the simulator, apply this filter:
Heavy-tail service times (agent / long-context)?
→ Split required. Homo cannot meet SLO regardless of GPU count.
ctx ratio R = long_max_ctx / B_short and long-request fraction f:
R ≤ 2× or f > 30% → homo usually cheaper; split for latency isolation only
R ≥ 4× and f < 10% → split cheaper at high traffic (λ > ~100 req/s)
R ≥ 16× and f < 5% → split cheaper at any meaningful traffic level
Everything below is a puzzle the rule of thumb cannot solve on its own.
Puzzle 1 — Where exactly should I split?
Question: the rule says "split" — but at which token threshold?
The optimal threshold depends entirely on the shape of your CDF. Too low and
the long pool handles too much traffic; too high and the short pool's slot
advantage evaporates. The pareto command sweeps every CDF breakpoint and
finds the cost–latency frontier.
vllm-sr-sim pareto \
--cdf data/lmsys_cdf.json --lam 100 --slo 500 --long-max-ctx 65536
LMSYS result (λ=100, A100, homo baseline = $271K / 14 GPUs):
B_short α-short n_s n_l GPUs $/yr saving P99-s P99-l SLO Pareto
---------------------------------------------------------------------------------------
512 63.8% 2 13 15 $ 290K -7.1% 9ms 25ms ✓ ★
1,024 83.1% 2 10 12 $ 232K +14.3% 10ms 36ms ✓ ★
2,048 94.8% 2 7 9 $ 174K +35.7% 12ms 63ms ✓ ★
4,096 98.4% 3 5 8 $ 155K +42.9% 13ms 108ms ✓ ★ ← optimal
8,192 99.7% 4 4 8 $ 155K +42.9% 14ms 212ms ✓ ★
12,288 99.9% 5 3 8 $ 155K +42.9% 14ms 319ms ✓ ★
Insight: B_short=4096 is optimal — 98% of LMSYS traffic fits below it, so the short pool (256 KV slots at max_ctx=4096) is 16× more slot-efficient than the homo pool (16 slots at max_ctx=65536). Result: 14 GPUs → 8 GPUs,