Phase 17 · Lesson 11 of 29

Multi-Region LLM Serving and KV Cache Locality

Round-robin load balancing is actively harmful for cached LLM inference. A request that does not land on the node holding its prefix pays full prefill cost — roughly 800 ms at P50 on a long prompt versus ~80 ms with a cache hit. In 2026 the production pattern is a cache-aware router (vLLM Router in Rust, llm-d router) that consumes KV-cache events and routes on prefix-hash match. Recent research (GORGO) makes cross-region network latency an explicit term in the routing objective. Commercial "cross-region inference" offerings (Bedrock cross-region inference, GKE multi-cluster gateways) treat inference as opaque — they handle availability, not TTFT. JPMorgan and Mayo Clinic ran us-east-1 failover in Nov 2024 at ~22 minutes. The DR reality: 32% of LLM DR failures are because teams backed up weights but forgot tokenizer files or quantization configs.

Lesson 11 of 29Learn~60 minutesPython (stdlib, toy prefix-cache-aware router simulator)

Before this: Lesson 4 of Phase 17 (vLLM Serving), lesson 6 of Phase 17 (SGLang RadixAttention)

On this page

Learning Objectives

  • Explain why round-robin load balancing breaks cached inference and quantify the TTFT penalty.
  • Diagram a cache-aware router: inputs (KV-cache events), algorithm (prefix-hash match), tie-breaker (GPU utilization).
  • Name the 32% DR failure driver for LLMs (missing tokenizer files / quantization configs) and state a three-file DR checklist.
  • Distinguish commercial cross-region offerings (Bedrock CRI, GKE Multi-Cluster Gateway) from KV-aware routing.

The Problem

Your service runs in us-east-1, us-west-2, and eu-west-1. You put an ALB in front with round-robin. Prefix cache hit rate in production drops to 8%. TTFT P50 triples. Your vLLM logs show every request is paying full prefill cost.

Round-robin is optimal for stateless services. LLM inference is stateful by design — the KV cache encodes everything the model has seen. Routing blind is routing into the wrong cache.

Separately, your team has a DR plan. You back up model weights to S3 cross-region. A regional outage hits; you attempt failover; the replica refuses to start. You forgot tokenizer.json, the quantization config, and the RoPE scaling config were in a separate bucket you didn't sync.

Multi-region LLM serving is a cache problem, a routing problem, and a DR-hygiene problem — not a load-balancer problem.

The Concept

Cache-aware routing

Request arrives with a prompt. Router hashes the prefix (say, first 512 tokens); it asks each replica "do you have this prefix cached?". Replicas publish KV-cache events on a pub/sub channel as they allocate and evict blocks. Router picks the replica with the match, falls through to GPU-util-based tie-breaker if no one does.

vLLM Router (Rust, 2026 production-stack): subscribes to kv.cache.block_added events, maintains a prefix-hash → replica index, routes with $O(1)$ lookup. Falls through to least-queue-depth when no match.

llm-d router: same pattern, Kubernetes-native. Publishes events via the ControlPlane API.

SGLang RadixAttention (Phase 17 · 06) is the intra-replica equivalent. Cross-replica routing is strictly upstream.

Numbers

TTFT P50 on a 2K-token prompt, Llama 3.3 70B FP8, H100:

  • Cache hit (same replica, prefix resident): ~80 ms.
  • Cache miss (cold prefill): ~800 ms.

10x gap. If your router hits 60-80% of prefix cache across replicas, you approximate single-replica performance at N-replica capacity. If it hits 10%, you approximate naive scaling.

Cross-region has a new constraint — network latency

Inter-region RTT:

  • us-east-1 ↔ us-west-2: ~65 ms.
  • us-east-1 ↔ eu-west-1: ~75 ms.
  • us-east-1 ↔ ap-southeast-1: ~220 ms.

If routing takes a request from us-east-1 to a hot prefix in ap-southeast-1, the saved prefill (800 → 80 ms, so 720 ms) shrinks to about 500 ms once the ~220 ms RTT is paid, and the margin disappears if the remote region queues the request or has already evicted the prefix. GORGO (2026 research) makes this explicit — minimize prefill_time + network_latency jointly, not prefill alone. Often the answer is to keep routing regional except on massive multi-MB prefixes where prefill dominates.

Commercial "cross-region inference" does not help here

AWS Bedrock cross-region inference automatically routes requests to other regions during capacity pressure. It optimizes availability, not TTFT, and treats inference as opaque. GKE Multi-Cluster Gateway is the same — service-level failover, no awareness of KV cache.

You still need an app-layer cache-aware router even when using these. They handle the "us-east-1 is on fire" case. Cache-aware routing handles the TTFT case.

DR hygiene — the 32% missing-files problem

Widely cited 2026 stat: 32% of LLM DR failures happen because teams backed up weights but forgot:

  • tokenizer.json or tokenizer.model
  • Quantization configs (quantize_config.json, AWQ scales, GPTQ zero-points)
  • Model-specific configs (RoPE scaling, attention masks, chat templates)
  • Engine config (vllm_config.yaml, sampling defaults, LoRA adapter manifests)

The fix is a three-file minimum DR manifest:

  1. All files under the HF model repo (weights + configs + tokenizer).
  2. Engine-specific serving config.
  3. Deployment manifest (K8s YAML, Dockerfile, dependency lock).

Plus: run a DR drill quarterly. The JPMorgan us-east-1 drill hit 22 minutes recovery in Nov 2024 only because the playbook was rehearsed.

Data residency is orthogonal

EU customer PHI cannot leave EU. If your cache-aware router sends a Paris-originated request to us-east-1 for a prefix match, you have violated GDPR regardless of TTFT gain. Partition routers by residency boundary before optimizing for cache.

Numbers you should remember

  • Cache hit vs miss TTFT gap: ~10x (80 ms vs 800 ms on 2K prompt).
  • Inter-region RTT US-EU: ~75 ms.
  • DR failure: 32% miss tokenizer/quant configs.
  • JPMorgan us-east-1 failover Nov 2024: 22 minutes (30-min SLA).
cache-aware-router

Use It

code/main.py simulates three routing strategies (round-robin, cache-aware regional, cache-aware global) on a multi-region workload. Reports cache hit rate, TTFT P50/P99, and cross-region bill.

Ship It

This lesson produces outputs/skill-multi-region-router.md. Given regions, residency constraints, and SLA, designs a routing plan.

Exercises

  1. Run code/main.py. At what prompt length does cross-region routing beat local-only routing, given 75 ms RTT?
  2. Your cache hit rate drops from 70% to 12%. Diagnose three possible causes and the observables that would confirm each.
  3. Design a DR manifest for a 70B AWQ-quantized model served in vLLM with 5 LoRA adapters. List every file and config.
  4. Argue whether Bedrock cross-region inference is "enough" for a fintech with strict TTFT SLOs. Cite specific behaviors.
  5. A Paris-origin request matches a prefix in us-east-1. Do you route it? Write the policy.

Key Terms

Term What people say What it actually means
Cache-aware routing "smart LB" Route on prefix-hash match to KV-cache-holding replica
KV-cache events "cache pub-sub" Replicas publish block add/evict; router indexes
Prefix hash "cache key" Hash of first N tokens used as router lookup
GORGO "cross-region routing research" arXiv 2602.11688; network latency as explicit term
Cross-region inference "Bedrock CRI" AWS product; availability failover, not TTFT awareness
DR manifest "the backup list" Every file needed to restore — not just weights
Data residency "GDPR boundary" Legal constraint on which region sees user data
RTT "round-trip time" Network latency; 75 ms US-EU, 220 ms US-APAC
LLM-aware LB "cache-hit LB" Cache-aware router as a product category

Further Reading

Check yourself

Quick quiz

  1. Why is round-robin load balancing actively harmful for cached LLM inference?

    1. Round-robin breaks TLS
    2. Round-robin is only valid for stateful databases
    3. Round-robin requires sticky sessions
    4. A request that does not land on the node holding its prefix pays full prefill cost instead of a cache hit
    Show the answer

    D. A request that does not land on the node holding its prefix pays full prefill cost instead of a cache hit

  2. What two inputs does a cache-aware router consume?

    1. Only the user_id and tenant_id
    2. Round-robin counters and TLS keys
    3. KV-cache events from replicas and a prefix hash on the incoming request
    4. Random shuffles and request size
    Show the answer

    C. KV-cache events from replicas and a prefix hash on the incoming request

  3. Roughly what is the TTFT gap between a cache hit and a cold prefill on a 2K-token prompt for Llama 3.3 70B FP8?

    1. About 1000x
    2. About 10x (~80 ms vs ~800 ms)
    3. About 1.1x
    4. Identical
    Show the answer

    B. About 10x (~80 ms vs ~800 ms)

  4. Why does cross-region routing not always beat regional routing for cache hits?

    1. Cache-aware routing is impossible across regions
    2. Inter-region routing is forbidden by all hyperscalers
    3. GORGO research found cache hits do not help latency
    4. Network RTT eats much of the saved prefill, e.g. a 220 ms US-APAC RTT cuts a 720 ms saving to ~500 ms
    Show the answer

    D. Network RTT eats much of the saved prefill, e.g. a 220 ms US-APAC RTT cuts a 720 ms saving to ~500 ms

  5. What does the lesson cite as the 32% LLM DR failure driver?

    1. Backups that include weights but miss tokenizer files or quantization configs
    2. Region quota exhaustion
    3. Misconfigured load balancers
    4. Unencrypted backups
    Show the answer

    A. Backups that include weights but miss tokenizer files or quantization configs

  6. What does the lesson say about commercial cross-region inference offerings such as Bedrock CRI?

    1. They optimize availability, not TTFT, and treat inference as opaque — you still need an app-layer cache-aware router
    2. They are forbidden under GDPR
    3. They are KV-cache-aware and replace app-layer routing
    4. They only work in us-east-1
    Show the answer

    A. They optimize availability, not TTFT, and treat inference as opaque — you still need an app-layer cache-aware router

Questions people ask

Why is round-robin load balancing bad for LLM inference?

Round-robin sends each request to the next server in turn, ignoring which server already has that conversation's prompt work saved. The chosen server then has to redo the whole prompt, which adds delay and cost. Cache-aware routers send requests to the server most likely to have a match.

What is a KV cache in simple terms?

The KV cache is the model's short-term working memory for a conversation. After the model reads the prompt once, it stores intermediate results so it does not have to reread everything for each new word. Reusing it saves time and GPU work.

Next lessonEdge Inference — Apple Neural Engine, Qualcomm Hexagon, WebGPU/WebLLM, JetsonPrevious: Cold Start Mitigation for Serverless LLMs

Lessons from AI Engineering from Scratch by Rohit Ghumare and contributors, MIT license. Notes for owners by Lozo. License

Next step

Rather have it built for you?

Reading is optional. Tell me what's stuck and I'll build it into the business you already run.

  • A real conversation, not a pitch
  • You keep your accounts
  • Nothing sends without your yes