Agentic LLM serving shifts the goal to cluster TPS and makes KV$ reuse dominate (>80% vs 54–62% chat). Cache-aware schedulers overload a few instances by pinning whole sessions. SMetric balances only each session's first request and routes follow-ups cache-aware, gaining 10–16% TPS (colocation) and 2–34% prefill TPS (disaggregation).
request i extends request i−1), which produces heavy intra-session KV$ reuse.Two insights turn the diagnosis into a fix:
SMetric policy: differential routing by turn. First request of a session (turn==0) → pure load-balance (spread sessions). Follow-up → cache-aware stick to argmax(KV$ hit), unless one of two retrofit guards fires (fall back to load balance):
not_overloaded: $l[s] \le \text{OVERLOAD}\cdot\text{mean}(l)$ — migrate a session off an instance that grew hot.session_not_evicted: $c[s] > \text{HIT\_RATIO}\cdot\text{est\_hit}(req)$ — if local cache was evicted, treat as a fresh session.核心技术壁垒 (the single hardest-to-replicate insight): the stateless derivation of session-turn from the request itself. The router keeps no session-to-instance table; it infers turn purely from the count of historical messages carried in the request (the OpenAI-style API is stateless, so each request re-sends its history). This makes the router a pure function of the request — no per-session state to track, update, or garbage-collect as sessions silently go idle. The signal degrades gracefully: if an agent drops history, SMetric just treats it as a first request, which is correct because such a request hits little KV$ anyway.

Paper's Figure 1 (caption: "The KV$ store hierarchy for serving agents"). The local tier is GPU HBM; when full, KV$ cascades to the global CPU-memory tier (and beyond to cloud storage). This hierarchy is what lets a load-balanced instance still recover reuse — the missing KV$ is fetched from the global tier rather than recomputed. It is the mechanism behind Insight 1.

Paper's Figure 4. Panel (a) shows how a 3-token request with two KV$ hits computes only one token's KV$. Panels (b)/(c) contrast the two serving paradigms SMetric is evaluated under: colocation runs prefill+decode on the same instance (all instances touch the global tier), disaggregation splits them (only prefill instances touch the global tier). This split is why the disaggregation gains are larger — prefill is where reuse and imbalance matter most.
The per-turn agent loop and where the router acts:
rr_argmin(load)), and the global tier makes even a re-routed session recover its KV$ via remote fetch (➂ in Fig 2). So the "error state" is always a safe, reuse-preserving load-balance.not_overloaded fallback), and the global tier re-supplies its KV$.无形式化作者证明 — 仅实证. The paper offers no convergence or success guarantee; it is a systems/empirical work. What could have been bounded: the max/mean load-imbalance ratio (a competitive-ratio-style bound against the offline optimal dispatch), or a bound on global-tier fetch demand as a function of the first-request fraction. Neither is proven; both are shown empirically. Below are the load-bearing scoring/guard equations and the 6 minimum checks.
Notation table
| Symbol | Meaning |
|---|---|
| $c_i$ | reusable (KV$ hit) length on instance $i$ (prefix hit) |
| $l_i$ | load of instance $i$ (batch size / inflight or unprefilled tokens) |
| $\hat{c}_i,\hat{l}_i$ | normalized hit ratio / load |
| $\lambda$ | Bailian's weight trading reuse vs balance |
| $L$ | request prompt length |
| $s$ | instance with highest KV$ hit, $\arg\max_i c_i$ |
| OVERLOAD | threshold multiple over cluster mean load (>1) |
| HIT_RATIO | fraction (<1) tolerating hit-estimate drift |
| est_hit | expected hit from carried history (excludes new turn) |
方程物理意义 — baseline scoring functions ($f$, lower is better):
SMetric guards (stick only if both hold): $l[s] \le \text{OVERLOAD}\cdot\text{mean}(l)$ and $c[s] > \text{HIT\_RATIO}\cdot\text{est\_hit}(req)$.
6 minimum checks
not_overloaded (never migrates) → reduces to SMetric(basic); §5.5 sweep confirms ≤6% TPS change (broad plateau). ✓session_not_evicted (never treats as fresh); →1 sticks only on near-perfect hit. §5.5: 0–0.75 within 4%. ✓ (default sits on plateau, not a knife-edge)Success-rate / sweep matrix (empirical, agent-specific ask): the paper sweeps (model size {30B, 235B}) × (paradigm {colocation, disaggregation}) × (global-tier provisioning) × (offered load rate). Monotonicity: gain rises toward the saturation knee (0% at 1.0× load → 15% at 1.5× → shrinks at 1.75×/2.0×), and rises as the global tier shrinks (up to 34% disagg). Latency budget: TTFT dominated by KV$ hits at median, by queueing at tail; SMetric wins both because it keeps hits high and load balanced. Failure-mode classes the paper targets: (a) tail overload from co-growing long sessions → not_overloaded; (b) silently evicted session cache → session_not_evicted. The dominant everyday case (well-balanced) needs neither guard — they only trim the tail (§5.4).

Paper's Figure 5. Reuse exceeds 80% in both traces; ~67% is intra-session (follow-ups reusing earlier turns), 18–20% is the shared system prompt (helping even first requests). This breakdown is load-bearing: it justifies both insights — session locality (route follow-ups locally) and first-request global-tier reuse (system prompt fetched from global tier wherever the request lands).

Paper's Figure 11. Panel (a): the fully KV$-agnostic load-balance-only method comes within 7% of the strongest baseline once the global tier is fully provisioned. Panel (b): with a full global tier all methods reach ~73–75% reuse (they differ only in local vs global source). Panel (c): KV$-aware methods are more imbalanced (LMetric 3.0×, Bailian 2.7×) than load-balance-only (2.1×). Together these show reuse ≠ placement — the core evidence for Insight 1.

Paper's Figure 12. Under load-balanced routing only 4.0% of follow-ups return to the first-turn instance; under Bailian's cache-aware policy 96.6% do. This ~24× gap is the empirical foundation of "balance only the first request": once first requests are spread, cache-awareness naturally keeps each session pinned, so the whole cluster balances.

Paper's Figure 16. SMetric is highest at every provisioning: +10–16% TPS with a global store, ~tied Bailian without one. Panel (b) shows SMetric retains Bailian-level local hits (64% vs 65%) while staying more balanced — the "have both" result.

Paper's Figure 22. Under PD disaggregation SMetric gains 2–34% prefill TPS — larger than colocation because prefill is compute-bound and cannot hide imbalance the way decode (larger batch still emits tokens) can. At full provisioning it matches the 76% overall reuse of the strongest baseline while cutting imbalance (3.3× vs LMetric 4.2×, LB 4.6×).
Ablation (§5.4/§5.5): removing the two guards (SMetric-basic) worsens tail TTFT (P90/P99 16.1/51.2 s vs 12.1/45.3 s) — guards mainly trim tail queueing. Sensitivity: OVERLOAD 1.0–∞ within 6% TPS; HIT_RATIO 0–0.75 within 4% — a broad plateau, so the hyperparameters are not fragile.
| # | Step (paper-internal) | Support |
|---|---|---|
| 1 | Agentic workload differs: goal = cluster TPS (agents act on complete responses), and KV$ reuse >80% (vs 54–62% chat). | Findings 1 (Fig 5), §1 |
| 2 | Existing cache-aware schedulers over-prioritize reuse: they route shared-system-prompt first requests to few instances, and session stickiness pins follow-ups there → overload few, idle rest → TPS capped. | §1, §4.1; Fig 11(c) |
| 3 | This trade is unnecessary: (a) a two-tier store decouples reuse from placement (LB-only within 7%, reuse 73–75% via global fetch), and (b) the workload is balanceable at scale (median imbalance 1.7/1.5). | Fig 11(a,b), Finding 6 (Fig 9) |
| 4 | Intra-session locality means first-request placement determines the whole session (4.0% vs 96.6% return rate), so balancing only first requests balances the cluster; first requests are few, so the global tier suffices for their reuse. | Finding 2 (Fig 5), Fig 12 |
| 5 | Therefore: load-balance first requests, cache-stick follow-ups, with two guards for tail overload and cache eviction — and infer turn statelessly from message count. | §4.2 (Fig 13 pseudocode) |
| 6 | Result: +10–16% TPS colocation, +2–34% prefill TPS disagg, lower TTFT/TPOT, with local hits comparable to the most cache-biased baseline. | Fig 16, 22, 17, 23 |
[实现未公开] at the time of L1 ingestion — the paper states "We will open-source SMetric as well as traces upon publication," but no repository is cited in the source. Implementation targets are named for future cross-reference:
核心技术壁垒 (dedicated paragraph): the hardest-to-replicate piece is not the two-branch routing (trivial once known) but keeping the router fully stateless while still knowing each request's session turn. Naively one records a session→instance table, but sessions never signal their end, so the table grows unbounded and needs garbage collection. SMetric sidesteps this entirely by inferring turn from the number of historical messages in the request payload (viable only because agents use the stateless OpenAI-style API that re-sends full history). Replicating SMetric's scalability claim requires reproducing this inference plus its benign-failure argument (dropped history → treat as first request, which loses little because it has little reuse anyway) — not just the pseudocode.
关键实现细节 (easy-to-miss tricks):
load_balance() is parameterized by paradigm: request-count under PD-colocation, but unprefilled tokens under PD-disaggregation — because prefill is compute-bound and token count, not request count, tracks its imbalance (§4.2 pseudocode; §5.3 rationale).est_hit deliberately excludes the freshly appended turn (which is never cached yet), so the eviction check compares against only the carried history — otherwise a healthy stick would look like a cache miss and needlessly rebalance.$...$/$$...$$; only mermaid in fences. ✓[实现未公开] + named targets. Figures embedded: 7 ![ references. ✓