Navigation
⚡ Inference Systems· 10 min read

Benchmarking Methodology

Open-loop vs closed-loop, realistic distributions, warmup, steady-state measurement, and percentile reporting.

benchmarkingmethodologyopen-loopclosed-loopsharegptwarmup

A benchmark is only as good as its methodology. The difference between a misleading and a useful benchmark comes down to load generation, input distribution, measurement period, and reporting.


1. Open-Loop vs Closed-Loop

ModeHow it worksWhat it measuresPitfall
Open-loopSend requests at fixed rate regardless of responsesTrue system capacity under loadMay overwhelm system (queue growth)
Closed-loopSend next request only after previous completesMax throughput at specific concurrencyHides queuing latency, overly optimistic

Open-loop is more realistic — production traffic doesn’t slow down because your server is busy. Always report which mode you used.

# Open-loop benchmark (vLLM)
python benchmark_serving.py \
    --request-rate 10 \          # fixed 10 req/s regardless of completion
    --num-prompts 500

# Closed-loop benchmark
python benchmark_serving.py \
    --request-rate inf \          # send as fast as possible
    --max-concurrency 32          # but limit to 32 concurrent

2. Input Distribution

DistributionSourceRealistic?
Fixed 128/128Synthetic (128 input, 128 output)❌ Unrealistic — real inputs vary wildly
ShareGPTReal conversations from ShareGPT.com✅ Good for chat workloads
LMSYS-Chat-1MReal API logs✅ Good for API workloads
Synthetic power-lawGenerated with realistic length distribution⚠️ OK if distribution matches production
Production replayRecorded from your actual traffic✅ Best (if available)

Always use a realistic distribution. Fixed-length benchmarks hide prefill/decode interference, KV cache pressure, and scheduling effects.


3. Measurement Protocol

1. WARMUP (30-60 seconds)
   - JIT compilation, CUDA graph capture, cache warming
   - DO NOT include in measurements

2. RAMP-UP (optional, 10-30 seconds)
   - Gradually increase to target request rate
   - Stabilize queues and batches

3. STEADY-STATE MEASUREMENT (120+ seconds)
   - Fixed request rate, stable system
   - Collect ALL metrics during this window

4. COOLDOWN
   - Drain remaining requests
   - Include in measurement only if relevant

4. Reporting

Minimum reporting requirements:

What to reportWhy
Hardware (GPU model, count, TP degree)Reproducibility
Model (name, size, quantization)Comparability
Load (request rate, concurrency, distribution)Context
P50, P90, P95, P99 for TTFT and TPOTTails matter more than averages
Throughput (output tok/s)System capacity
Goodput at target SLABusiness relevance

Never report only averages. P99 TPOT can be 5× the average — the average hides real user experience.


For metric definitions, see Metrics Definition. For common mistakes, see Common Pitfalls.


Self-Check

  • Compare open-loop vs closed-loop benchmarking
  • Choose an input distribution for a chat vs API workload
  • Design a measurement protocol with proper warmup
  • List minimum reporting requirements for a reproducible benchmark