SGLang Model Gateway 特性详解(Cache-Aware 之外)

📅 2026/7/20 13:42:04
SGLang Model Gateway 特性详解(Cache-Aware 之外)
一、负载均衡策略除 cache_aware1.1 Power of Twopolicies/power_of_two.rs随机选 2 个健康 Worker比较负载优先 token 级负载降级为请求计数发给负载更轻的那个。O(1) 决策无需全局状态。1.2 Round Robinpolicies/round_robin.rs原子计数器轮转每次递增取模最朴素的均匀分发。1.3 Randompolicies/random.rs纯随机选一个健康 Worker基准策略无状态。1.4 Bucketpolicies/bucket.rs按模型分组每个模型绑定固定 Worker 池适合多模型网关。1.5 Consistent Hashingpolicies/consistent_hashing.rs一致性哈希环请求按 key 映射到环上顺时针找 Worker。Worker 增减时只影响相邻节点适合会话保持。1.6 Prefix Hashpolicies/prefix_hash.rs按请求文本前缀做哈希确定性路由到固定 Worker。同类请求永远落在同一 Worker。1.7 Manualpolicies/manual.rs手动指定 Worker用于调试、灰度、A/B 测试。策略注册表policies/registry.rspolicies/factory.rs// 每个模型可以绑定独立策略pubstructPolicyRegistry{// default_policy: 全局默认// model_policies: HashMapmodel_id, Boxdyn LoadBalancingPolicy// PD 模式下 prefill/decode 各有独立策略}二、gRPC Routerrouters/grpc/2.1 管道化架构请求 - Preparation - WorkerSelection - ClientAcquisition - RequestBuilding - DispatchMetadata - RequestExecution - ResponseProcessing - ResponseFormatting - 返回每阶段可插拔、可组合支持 Chat / Generate / Embedding / Classify / Responses 五种端点。2.2 全 Rust Tokenizerllm-tokenizercrate不依赖 Python支持 DeepSeek、Llama、Kimi K2、Qwen、GPT-OSS、Mistral、GLM4/4.7、Step-3。避免 Python tokenizer 的序列化往返和 GIL 瓶颈。2.3 Rust Reasoning Parser Tool ParserReasoning Parser从模型输出分离response和responseTool Parser提取 Function Call JSON不经过 Python均以 crate 形式编译进 SMG零外部依赖2.4 Harmony Router组合式推理引擎自动检测请求是否需要多模型编排Harmony选择对应的 pipeline 执行。2.5 gRPC PD RoutergRPC 协议下的 PD 分离路由prefill/decode 各走独立 gRPC stream。三、可靠性机制4 层防御3.1 断路器core/circuit_breaker.rs三态状态机Closed --连续失败 N 次-- Open --超时后-- HalfOpen ^ | ------ 连续成功 M 次 ------------------------默认配置failure_threshold5, success_threshold2, timeout30s。状态用AtomicU8无锁存储CLOSED0, OPEN1, HALF_OPEN2每次请求只做一次原子读纳秒级开销。连续失败计数中间成功一次就清零。3.2 令牌桶core/token_bucket.rspubstructTokenBucket{inner:ArcMutexTokenBucketInner,// parking_lot::Mutexnotify:ArcNotify,// 公平排队capacity:f64,// 最大令牌数突发容量refill_rate:f64,// 每秒补充令牌数}refill_rate 0限速模式QPS 限制refill_rate 0并发限制模式信号量用parking_lot::Mutex而非tokio::sync::Mutex操作极短异步锁开销更大Notify实现 FIFO 公平排队3.3 重试core/retry.rs可重试的 6 种状态码408/429/500/502/503/504。指数退避公式delay min(initial_backoff_ms * multiplier^attempt, max_backoff_ms) /- jitter_factor 随机抖动jitter 防止惊群效应——多请求同时失败同时重试同时打爆同一个 Worker。3.4 健康检查core/worker_manager.rs后台 task 定期GET /health探活不健康的set_healthy(false)自动摘除。配合断路器形成两层保护健康检查摘死节点断路器保护抖节点。四、PD 分离路由routers/http/pd_router.rs4.1 请求生命周期Client - SMG - select_prefill_worker() - Prefill Worker生成完整 KV Cache KV Cache 通过 Mooncake RDMA 传给 Decode - select_decode_worker() - Decode Worker逐 token 生成4.2 DP-Aware 绑定prefill 和 decode 必须在同一 DP replica 上KV Cache 物理可达。通过data_parallel_rank字段传递 rank 信息。4.3 双策略prefill 和 decode 可配置独立路由策略smg launch --pd-disaggregation\--prefill-policy cache_aware\--decode-policy power_of_two五、IGW 多模型网关routers/router_manager.rs5.1 核心概念RouterManager维护HashMapmodel_id, Router根据请求的model字段自动分发到对应 Router。5.2 每个模型独立配置{deepseek-v3:{policy:cache_aware,rate_limit:1000,circuit_breaker:{failure_threshold:5}},qwen3.5-32b:{policy:power_of_two,rate_limit:500},gpt-4o:{policy:round_robin,api_key:sk-...,backend:openai}}5.3 统一 API 入口POST /v1/chat/completions {model: deepseek-v3, ...} POST /v1/chat/completions {model: qwen3.5-32b, ...} POST /v1/chat/completions {model: gpt-4o, ...} - 全走同一个 SMG 地址六、可观测性observability/6.1 Prometheus 指标40 指标分类类别指标HTTPhttp_requests_total,http_request_duration_secondsRouterrouter_requests_total,router_selections_totalWorkerworker_requests_active,worker_is_healthyCircuit Breakercircuit_breaker_state,circuit_breaker_failures_totalRetryretry_attempts_total,retry_successes_totalMCPmcp_tool_calls_total,mcp_tool_duration_seconds6.2 字符串 Interning 优化metrics.rs内置全局STRING_INTERNER: DashMapString, Arcstr所有动态 labelmodel_id、worker_url只分配一次后续零拷贝复用。6.3 OpenTelemetry自动注入 trace context 到下游 Worker HTTP header支持 OTLP gRPC 导出。七、认证与安全API KeyBearer token 验证JWT支持 JWKS 公钥验证RBAC角色权限控制TLS/mTLSaxum-server rustls支持双向 TLS八、MCP 集成routers/openai/responses/mcp.rs原生 MCP Client支持四种传输协议STDIO / HTTP / SSE / Streamable工具调用循环模型输出 Function Call - SMG 执行 MCP 工具 - 结果回填 - 模型继续九、WASM 中间件wasm/请求/响应处理链中插入自定义 WASM 模块热加载动态注册/移除 WASM 模块不重启 SMGwasm/route.rsWASM 模块的注册和路由 API适合自定义预处理、后处理、内容过滤十、Mesh 集群管理routers/mesh/多 SMG 实例通过 CRDT 同步状态全局限流跨实例令牌桶Worker 状态共享各实例知道彼此的健康 Worker策略状态同步cache_aware 树在实例间同步优雅关停trigger_graceful_shutdown协调关停顺序十一、K8s 服务发现service_discovery.rs自动发现 K8s Pod 作为 Worker通过kubecrate 连接 K8s APILabel selector 过滤Pod 上线自动注册 Worker下线自动摘除十二、Worker 生命周期管理12.1 Worker Trait 多态pubtraitWorker:SendSync{fnurl(self)-str;fnworker_type(self)-WorkerType;// Regular | Prefill | Decodefnis_healthy(self)-bool;// AtomicBoolfnis_dp_aware(self)-bool;fncircuit_breaker(self)-CircuitBreaker;}12.2 WorkerRegistryDashMapString, Arcdyn Workerkey 为 URL无锁并发读写。12.3 步骤化工作流core/steps/Worker 注册/更新/移除走步骤化编排DiscoverMetadata - DiscoverDP - CreateWorker - Register - Activate每步可独立重试、可独立失败处理。12.4 WorkerRoutingKeyLoad维护每个 Worker 的活跃路由 key 计数用DashMapString, usize做增量/减量操作实时反映负载。十三、DP-Aware 路由13.1 含义后端 SGLang 实例开了--enable-dp-attention一个 URL 背后有多个内部 DP rank。13.2 工作机制1. SMG 调用 /server_info获取 dp_size 2. 创建 dp_size 个虚拟 Workerurl0, url1, ..., url(dp_size-1) 3. 路由时从 URL 提取 dp_rank注入到请求 JSON 的 data_parallel_rank 字段 4. 发请求时用 base URL去掉 N 后缀13.3 PD 分离中的 DP-Awareprefill 和 decode 必须在同一 DP replica 上通过data_parallel_rank绑定。十四、对话历史与持久化routers/conversations/ 多种后端In-Memory默认重启丢失Disabled不存历史PostgreSQL连接池 凭据支持Oracle ATP企业级持久化十五、其他 RouterTokenize Routerrouters/tokenize/POST /v1/tokenize - 文本 - tokens POST /v1/detokenize - tokens - 文本 支持批量支持动态注册 tokenizerParse Routerrouters/parse/POST /parse/reasoning - 分离 reasoning content POST /parse/function_call - 提取 function callOpenAI Routerrouters/openai/转发到 OpenAI、xAI、Gemini 等外部厂商保持流式 SSE 语义。Responses APIrouters/openai/responses/OpenAI 兼容的/v1/responses端点支持流式/非流式、MCP 工具调用、后台执行。