Prhub

#33257 Revert "[rust-server] fix TCP-layer TTFT stalls"

原始 PR 作者 sherlockwu 合并时间 2026-08-02 16:20 文件变更 2 提交数 2 评论 2 代码增减 +11 / -29

执行摘要

回滚 #33026 TCP 层 TTFT 修复,恢复旧 socket 绑定

PR body 仅说明 Reverts #33026,未给出具体原因。结合上下文可推断:33026 的 SO_RCVBUF 提升与 set_nodelay 改动可能带来内存占用上升或兼容性问题,团队选择整体回滚以恢复稳定基线。

值得快速了解回滚背景,若依赖 rust-server 性能,请关注后续重新修复的 PR。不必精读源码。

讨论亮点

无实质 review 讨论,仅 gemini-code-assist 的退役声明和 sherlockwu 触发的 CI 重跑命令,未提及回滚原因。

实现拆解

  1. runtime.rsRuntime::start 改回用 std::net::TcpListener::bind 同步绑定并 set_nonblocking(true),移除 IPv4/IPv6 分支的 tokio::net::TcpSocket 创建、set_reuseaddrset_recv_buffer_size(16 MiB) 调用。
  2. api_server.rsserve 签名从 tokio::net::TcpSocket 改回 std::net::TcpListener,在函数内通过 tokio::net::TcpListener::from_std 注册到 tokio reactor;删除 ListenerExt::tap_ioset_nodelay(true) 逻辑。
  3. 无测试、配置或部署配套改动。
文件 模块 状态 重要度
rust/sglang-server/src/runtime.rs 服务入口 modified 5.77
rust/sglang-server/src/api_server.rs HTTP 服务 modified 6.02

关键符号

start serve

关键源码片段

rust/sglang-server/src/runtime.rs core-logic

回滚核心逻辑:恢复 std TcpListener 同步绑定,移除 SO_RCVBUF 设置,这是原修复的主要改动之一。

// 绑定 API 服务端口:必须在任何线程派生前完成,使端口占用(EADDRINUSE)成为启动期的硬错误。
let listener = std::net::TcpListener::bind(cfg.rust_server_args.http_addr)
    .map_err(|e| format!("bind {} failed: {e}", cfg.rust_server_args.http_addr))?;
// 必须设置非阻塞,才能交由 tokio 的 reactor 驱动。
listener
    .set_nonblocking(true)
    .map_err(|e| format!("listener set_nonblocking failed: {e}"))?;
// ... 后续线程派生与 runtime 构建 ...
rt.block_on(api_server::serve(
    listener,
    senders,
    cfg.rust_server_args.channel_cap,
    cfg.server_args.clone(),
    api_activity,
    shutdown_rx,
))
rust/sglang-server/src/api_server.rs entrypoint

回滚入口改动:serve 函数改回接受 std TcpListener,并移除 tap_io set_nodelay 优化。

pub async fn serve(
    listener: std::net::TcpListener, // 由 runtime::start 同步绑定后传入
    senders: Senders,
    egress_buf: usize,
    server_args: Arc<ServerArgs>,
    egress_activity: ActivityCounter,
    shutdown: flume::Receiver<()>,
) {
    // ... AppState 构建与路由注册 ...    // listener 已在 runtime::start 中同步绑定(端口冲突直接启动失败),
    // 这里通过 from_std 把它接入 tokio 的 reactor 开始监听。
    let listener = match tokio::net::TcpListener::from_std(listener) {
        Ok(l) => l,
        Err(e) => {
            tracing::error!(error = %e, "failed to adopt pre-bound listener");
            return;
        }
    };
    // 回滚后不再设置 TCP_NODELAY,恢复默认 Nagle 行为(原 #33026 曾用
    // tap_io(set_nodelay) 消除 keep-alive 连接上的 ~13 ms 延迟)。
    let serve = axum::serve(
        listener,
        app.into_make_service_with_connect_info::<std::net::SocketAddr>(),
    );
    // ...
}

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

回滚后 #33026 声称修复的 TTFT 卡顿将回归:大请求体首包 ~200 ms 延迟(受内核 rcvbuf 限制)和 keep-alive 连接约 13 ms 的 Nagle/delayed-ACK 延迟会重现。但恢复的是之前经过验证的稳定绑定流程,无新增风险。

影响 rust-server 前端的所有 HTTP 连接路径,恢复旧行为。对已部署使用 rust-server 的用户,TTFT 可能回退到 33026 之前的水平;对 Python server 无影响。团队后续需重新评估是否以更安全的方式重做该优化。

TTFT 优化回退 回滚原因未说明

关联 Issue

#33026 [rust-server] fix TCP-layer TTFT stalls

完整报告

参与讨论