llm-d-router v0.10.0 flow control · one H200 · 2026-09-30

Priority holdback alongside eviction

Flow control can protect interactive requests from batch work by evicting in-flight batch requests, or by holding back part of the pool so batch never fills it. Is it worth running both?

It depends on how the EPP measures saturation, and neither setting protects against bursts larger than the reserve.

Request counts
Optional. Holdback removes evictions under steady load, but eviction alone already keeps TTFT near the floor.
Token counts
Required. Without it, TTFT p50 is 2.6 s under steady load; with it, 0.03 s.
Hybrid
Mixed. Fixes steady load, makes bursts worse (p95 1.5 s → 5.3 s).
Bursts, any mode
No help. Bursts larger than the reserve still evict or queue.
Resume off
No help. Bursts then redo about as much decode as the batch needs (+74% batch time), with or without holdback.

1Setup

2Request-count saturation

With eviction alone, batch refills every freed slot, so about 9 in 10 interactive requests evict a batch request. A 20% reserve absorbs steady arrivals (0 evictions at 1 and 2 req/s, 18 vs 219 at 4 req/s). Bursts of 32 overwhelm any reserve.

Qwen2.5-1.5B, short prompts. Holdback lowers TTFT p95 to the 0.13 s floor at 1 req/s, where waiting on an eviction showed up, and costs up to ~3 s of batch time. Holdback without eviction never gets TTFT near the floor (40% reserve: p50 1.05 s vs 0.22 s under bursts).

All numbers

Steady load: one interactive request every 1/rate seconds for 60 s. Bursts: 15 bursts of 32 requests, 6 s apart; this table includes the arms without eviction. Batch deadlines were 45, 75 and 100 s (jobs a, b, c).

steady 1 req/s

armevictionsTTFT p50TTFT p95batch donejob a metjob b metjob c met
eviction540.12 s0.57 s62.4 s87%100%100%
eviction + 10% holdback110.12 s0.13 s64.6 s96%100%100%
eviction + 20% holdback00.12 s0.13 s64.8 s100%100%100%

steady 2 req/s

armevictionsTTFT p50TTFT p95batch donejob a metjob b metjob c met
eviction1080.12 s0.18 s65.0 s86%100%100%
eviction + 10% holdback340.12 s0.13 s64.3 s88%100%100%
eviction + 20% holdback10.12 s0.13 s65.1 s98%100%100%

steady 4 req/s

armevictionsTTFT p50TTFT p95batch donejob a metjob b metjob c met
eviction2190.12 s0.18 s70.1 s80%100%100%
eviction + 10% holdback680.11 s0.12 s65.9 s78%100%100%
eviction + 20% holdback180.12 s0.13 s72.9 s89%100%100%

bursts of 32 every 6 s

armevictionsTTFT p50TTFT p95batch donejob a metjob b metjob c met
no eviction01.80 s6.72 s75.6 s100%100%100%
10% holdback01.46 s6.29 s75.1 s100%100%100%
40% holdback01.05 s4.93 s80.5 s100%100%100%
eviction3500.22 s0.43 s69.1 s16%100%100%
eviction + 10% holdback3290.22 s0.41 s69.9 s0%100%100%
eviction + 20% holdback3240.21 s0.39 s69.7 s0%100%100%

3Token and hybrid saturation

Counting tokens, an interactive request weighs about a ninth of a batch request, so one eviction lets ~8 interactive requests in while vLLM has one free sequence. The rest queue inside vLLM, out of flow control's reach. Holdback keeps real slots free and fixes steady load; under bursts it does not help, and with hybrid counting it hurts.

concurrency-detector can count requests, estimated tokens, or both (hybrid: per endpoint, the larger ratio). Output tokens are estimated as min(1.5 × prompt, max_tokens), so these runs use long prompts: ~4.9k-token batch prompts and 500-token interactive prompts × 128 tokens on Qwen2.5-1.5B, with maxTokenConcurrency set to 32 batch requests' worth (204,800). Load is driven in-cluster with a per-run cache_salt, so TTFT is lower here than in section 2; compare only within this section.

All numbers

requests · steady 2/s

armevictionsTTFT p50TTFT p95batch done
eviction1250.03 s0.16 s85.5 s
eviction + 20% holdback00.03 s0.16 s87.3 s

tokens · steady 2/s

armevictionsTTFT p50TTFT p95batch done
eviction1592.64 s4.53 s90.7 s
eviction + 20% holdback00.03 s0.31 s85.4 s

hybrid · steady 2/s

armevictionsTTFT p50TTFT p95batch done
eviction1320.27 s0.53 s84.2 s
eviction + 20% holdback00.03 s0.13 s86.0 s

requests · bursts

armevictionsTTFT p50TTFT p95batch done
eviction4510.18 s0.34 s90.5 s
eviction + 20% holdback4280.16 s0.30 s95.6 s

tokens · bursts

armevictionsTTFT p50TTFT p95batch done
eviction444.70 s9.73 s96.1 s
eviction + 20% holdback43.60 s9.38 s93.1 s

hybrid · bursts

armevictionsTTFT p50TTFT p95batch done
eviction4420.15 s1.52 s96.2 s
eviction + 20% holdback2310.64 s5.33 s95.7 s

4Without resume

Turning resume off (evicted requests restart from scratch after backoff) barely matters under steady load but nearly doubles batch work under bursts: ~288k tokens redone against 288k needed, and the batch takes 74% longer. Interactive TTFT does not change. Holdback does not rescue it: under bursts it trims redone work ~8% and still finishes later.

Request-count saturation, same long-prompt mix and in-cluster driver as section 3. Without a render_url the processor cannot resume, so an evicted request is retried from the start with exponential backoff; resume and immediate requeue cannot be switched off separately.

All numbers

steady 2/s · resume

armevictionsdecode redoneTTFT p95batch done
eviction1250k0.16 s85.5 s
eviction + 20% holdback00k0.16 s87.3 s

steady 2/s · restart

armevictionsdecode redoneTTFT p95batch done
eviction, restart1347k0.12 s87.9 s
eviction + 20% holdback, restart11k0.19 s87.7 s

bursts · resume

armevictionsdecode redoneTTFT p95batch done
eviction4510k0.34 s90.5 s
eviction + 20% holdback4280k0.30 s95.6 s

bursts · restart

armevictionsdecode redoneTTFT p95batch done
eviction, restart483288k0.34 s157.7 s
eviction + 20% holdback, restart437264k0.31 s168.9 s

5A larger model: Qwen2.5-14B

Holdback removes evictions here too (166 → 11 → 2) but TTFT p95 stays at ~0.92 s in every arm, and batch takes 4–5% longer. Interactive latency comes from sharing the GPU with long-context batch work, not from waiting on evictions.

Request-count saturation, steady 1 req/s, ~4.8k-token batch prompts (96 requests) and 500-token interactive prompts × 128 tokens.

All numbers

steady 1 req/s

armrunsevictionsTTFT p50TTFT p95batch done
eviction31660.23 s0.92 s228.0 s
eviction + 10% holdback3110.22 s0.92 s236.8 s
eviction + 20% holdback220.22 s0.92 s239.2 s

6Recommendations

7Caveats and open questions

Deadline chart