控制面、数据面与跨层耦合点#

这章解决什么问题#

分层讲到一定程度之后,读者通常会再问一个问题:哪些部分更像控制面,哪些部分更像数据面?如果不回答这件事,运行时架构虽然看起来分得很清楚,但在实际排障和改造时仍然容易把“控制逻辑问题”和“数据路径问题”混在一起。

这一章的目标,不是引入全新抽象,而是把前面已经出现的 TokenizerManagerSchedulerModelRunnermem_cacheobservability 重新放到“控制面 / 数据面”这张图里。这样做的好处是,读者不只知道边界,还知道不同边界上的变化为什么会产生不同类型的后果。

什么更接近控制面#

从当前主线看,控制面更接近“决定事情如何发生”的部分,而不是“承载事情真正发生”的部分。launch_server.py 的 mode 选择、http_server.py 的路由折叠、TokenizerManager 对请求和 ReqState 的维护、Scheduler 对 batch 的推进,以及 session_controller.py 里的 session / abort / timeout 约束,都更偏控制面。

这些逻辑的共同点,是它们主要在做决策、编排、状态维护和流程约束。它们当然也会操作数据,但它们的第一职责不是算出 token,而是决定 token 生成过程能不能、该不该、按什么条件继续推进。

什么更接近数据面#

数据面更接近“真正承载运行状态和执行负载”的部分。ForwardBatchModelRunner.forward(...)、不同 attention backend、ReqToTokenPoolTokenToKVPoolAllocatorKVCache 以及 detokenizer 回包中携带的 token / text 结果,都更像数据面上的对象与路径。

这些路径不是不需要决策,而是它们的重心放在“真正处理这轮数据”。一旦你用这种方式看 execution model 和 mem_cache,很多“为什么这里更容易出性能问题、那里更容易出协议问题”的判断就会自然成立。

为什么这两层很难完全切开#

优秀技术书不会把“控制面 / 数据面”讲成一个绝对静态的二分法,因为真实系统里总有跨层耦合点。比如 Scheduler 明明是控制面,但它必须了解当前 cache 和 batch 的现实状态;ModelRunner 明明更像数据面,但它也会受到 ForwardMode、graph runner 和 backend 选择的影响。

换句话说,这一章最想提醒读者的是:分层是为了帮助判断,不是为了否认耦合。只有同时看到层次和耦合点,技术书里的架构图才不会变成“看上去很整齐,但一碰实现就失效”的示意图。

一个更适合维护者的图#

flowchart LR
    subgraph Control["控制面"]
        A["launch_server / entrypoints"]
        B["TokenizerManager / ReqState"]
        C["Scheduler / session_controller"]
    end

    subgraph Data["数据面"]
        D["ScheduleBatch / ForwardBatch"]
        E["ModelRunner / attention backend"]
        F["ReqToTokenPool / KVCache"]
        G["Detokenized output"]
    end

    A --> B --> C --> D --> E --> G
    C --> F
    F --> E
    B -. trace / request stage .-> G

这张图的重点不是给每个对象贴标签,而是告诉读者:当你在排障时看到“行为不对”,优先先判断自己碰到的是控制面问题,还是数据面问题。前者更可能在入口、状态、约束和 batch 策略;后者更可能在执行、cache、backend 或结果组装。

本章对应哪些代码路径#

这一章最重要的锚点包括 python/sglang/launch_server.pypython/sglang/srt/entrypoints/http_server.pypython/sglang/srt/managers/tokenizer_manager.pypython/sglang/srt/managers/scheduler.pypython/sglang/srt/managers/session_controller.pypython/sglang/srt/model_executor/forward_batch_info.pypython/sglang/srt/model_executor/model_runner.pypython/sglang/srt/mem_cache/*

小结#

控制面和数据面的划分,不是为了把系统切成两半,而是为了让读者在面对复杂行为时先找到更合适的观察角度。只要这个角度建立起来,后面的调试、扩展和维护章节都会更容易落地。