SGLang 源码解读:从一个请求到一次生成

本系列把 SGLang(
sgl-project/sglang)当作一个真实的推理服务系统来解剖:沿「HTTP 请求 → 分词 → 调度 → KV 内存 → 模型执行 → 采样 → 反分词 → 流式响应」这条主执行链,用源码证据解释它为什么这样工作。
版本快照
| 字段 | 内容 |
|---|---|
| 仓库 | https://github.com/sgl-project/sglang |
| 分支 | main |
| 快照 commit | 65824258549671404188450748b90ab7cacab2ae |
| 核对日期 | 2026-09-28 |
| 分析范围 | 以 python/sglang(SRT 运行时)为主线,兼及 Rust 网关 sgl-model-gateway |
正文所有代码引用均锚定在该 commit 上,写作格式为 srt/xxx.py:行号(即 python/sglang/srt/xxx.py)。行号以固定快照为准;上游 main 持续演进,阅读最新代码时请以符号名为锚点重新定位。
这一卷回答什么
- SGLang 服务端一次生成请求,从 socket 到 socket 经过了哪些进程、哪些状态容器、哪些关键分支?
- 调度器如何决定「下一个 batch 是 prefill 还是 decode」,chunked prefill 与 retract 各自解决什么问题?
- RadixCache 前缀缓存如何与 KV 内存池、锁引用、淘汰策略协同?
- 重叠调度(overlap scheduling)用怎样的代价换取 CPU 调度与 GPU 计算的重叠?
- 多进程、多机、PD 分离、Rust 路由网关这些「跑得起来之后」的工程问题如何组织?
目录
第一部分 宏观
第二部分 进程与入口
第三部分 调度与执行
- 第 6 章 Scheduler 主循环与重叠调度
- 第 7 章 PrefillAdder 与 chunked prefill
- 第 8 章 从 Req 到 ForwardBatch:批数据流水线
- 第 9 章 RadixCache 与 KV 内存池
- 第 10 章 ModelRunner 与模型执行
- 第 11 章 采样
- 第 12 章 结果处理与 Detokenizer