Switchyard长上下文压测指南:8K/32K输入下TTFT与内存表现怎么测?完整教程
【免费下载链接】SwitchyardSwitchyard lets LLM applications route traffic across models and providers while preserving native OpenAI and Anthropic API compatibility - enabling flexible model selection, benchmarking, and cost/performance optimization.项目地址: https://gitcode.com/GitHub_Trending/switch/Switchyard
Switchyard(README.md)是一个 LLM 流量路由器,它能在不改一行业务代码的前提下,把每次 LLM 调用路由到"刚好能完成任务的最便宜模型",同时保持原生 OpenAI 与 Anthropic API 兼容。对于长上下文场景,Switchyard 内置了专用压测工具 switchyard-soak,可对 8K、32K 乃至逼近模型上下文窗口的请求做持续施压,帮你提前看清TTFT(首 token 延迟)和内存(RSS)的真实表现。下面这篇教程带你从零跑通长上下文压测,并学会看懂结果。
为什么长上下文压测很重要 📏
长 prompt 是 LLM 网关最容易"翻车"的场景:
- TTFT 随输入长度上升:8K → 32K → 接近窗口上限,首 token 延迟会逐级抬升,必须确认抬升幅度在业务可接受范围内;
- 内存持续增长:长请求会放大请求内存和路由状态占用,泄漏或无界增长往往只在长时间压测中暴露;
- 上下文溢出回退:当上游因超过窗口拒绝请求时,Switchyard 会按配置顺序尝试同一路由上的其余目标(详见 docs/operations/context_window.md),这条链路是否可靠需要在压测中验证。
Switchyard 的官方操作手册把长上下文压测定位为"TTFT、内存、以及上下文相关路由故障"的核心检查项:docs/operations/soak_test.md。
内置的 long-context 压测场景 🔍
压测场景的源码在 crates/switchyard-soak/src/scenarios/long_context.rs 中,逻辑非常直白:
| 输入档位 | 生成规则 | 作用 |
|---|---|---|
| 8K | 固定 8,192 token | 中长输入基线 |
| 32K | 固定 32,000 token | 长输入主压力点 |
| 90% 窗口 | 配置上下文窗口 × 9/10 | 逼近溢出边界的压力点 |
每个会话末尾都会追加一句"用一句话总结最后的标记",把输出限制在 64 token 以内,确保测量焦点集中在输入侧(TTFT 与内存),而不是解码吞吐。场景通过--context-window-tokens(默认 32,768)控制窗口上限,超出窗口的档位会被自动剔除,避免无效请求污染数据。
该场景的通过标准写在源码注释里:"TTFT 随输入长度上升,但没有路由错误、没有内存增长"——这正是我们压测时要核对的两件事。
一键启动本地压测:最快配置方法 🚀
本地压测不需要任何厂商 API Key、不产生推理费用,推荐新手从这条路径开始。
第 1 步:构建服务端与压测器
cargo build --release -p switchyard-server -p switchyard-soak \ --bins --example switchyard-soak-mock第 2 步:运行本地压测脚本
python3.12 scripts/run_local_soak_test.py \ --duration 10s \ --concurrency 4 \ --request-count 100这个脚本(scripts/run_local_soak_test.py)会自动拉起一个"请求感知"的本地 mock 后端和 Switchyard 服务器,先对每条路由发一条常规请求做连通性检查,再依次让 oha 和 NVIDIA AIPerf 回放压测会话。本地后端的时序是确定性的:首个 token 前固定延迟 40 ms,token 间隔 1 ms,因此TTFT、ITL(token 间隔延迟)、吞吐都可复现对比。
本地测试使用的路由配置见 scripts/local_soak_test.toml,其中同时配置了noop、random、passthrough、llm_classifier、stage_router五种路由算法——同一个 8K/32K 负载会分别穿过每条路由,方便你横向对比不同路由策略下的 TTFT 差异。
💡 提示:
--prompt-bytes可调大短请求与共享前缀场景的输入体积,给请求内存和 prefix 缓存施加更大压力;--concurrency控制同时在途请求数,建议先用 4 起步。
对比各路由算法的 TTFT 开销 📊
如果想知道"经过 Switchyard 路由比直连后端多花了多少时间",用基准脚本 scripts/benchmark_routing_algorithms.py:
python3.12 scripts/benchmark_routing_algorithms.py \ --base-url http://127.0.0.1:4000 \ --direct-base-url http://127.0.0.1:8100 \ --direct-model mock/weak \ --model noop=switchyard/noop \ --model random=switchyard/random \ --model llm_classifier=switchyard/classifier \ --concurrency 100 \ --request-count 1000 \ --scenario-set standard报告会产出report.md、report.csv、report.json和一张routing-overhead.svg热力图:每个"路由 × 工作负载"单元格的TTFT 变化(毫秒)和输出 token 吞吐变化一目了然,红色表示比直连慢,蓝色表示更快。由于 8K/32K 场景就在standard场景集里,长上下文的路由开销会直接出现在对比表中。
48 小时发布级压测:内存表现怎么卡? 🧠
短跑用于发现配置问题,长跑才暴露内存问题。发布前的标准动作是 48 小时浸泡测试(完整流程见 docs/operations/soak_test.md):
./target/release/switchyard-soak \ --base-url http://127.0.0.1:4000 \ --model RELEASE_MODEL_ID \ --duration 48h \ --concurrency 16 \ --server-pid "$SOAK_SERVER_PID" \ --max-rss-growth-mib 512关键参数解释:
| 参数 | 含义 |
|---|---|
--server-pid | 采样本地switchyard-server进程的 RSS 与 CPU |
--max-rss-growth-mib 512 | 末次 RSS 比首次增长超过 512 MiB 即判失败 |
--max-error-rate | 允许的最大推理错误率,默认 0(一个都不能挂) |
--report-interval | 每间隔采样一次健康、/metrics、RSS、CPU 与延迟分位 |
压测器自身也做了有界设计,长时间跑不会撑爆本机:延迟采样用 10 万容量的蓄水池抽样(crates/switchyard-soak/src/stats.rs),错误明细最多记录 1 万条,所以测试进程自身的内存和磁盘占用是有界的,观测到的内存增长来自被测服务端而非压测器。
如何读懂结果:intervals.csv 是你的核心仪表盘 📈
每次运行都会在soak-results/<时间戳>/下生成四个文件(写盘逻辑见 crates/switchyard-soak/src/report.rs):
intervals.csv:每个采样间隔一行,15 个字段,含latency_p50/p95/p99_ms、rss_mib、cpu_percent、健康检查与服务端计数器;errors.jsonl:最多 1 万条失败明细;config.json/summary.json:测试输入与最终通过/失败结论。
验收时重点核对(对照 docs/operations/soak_test.md 的 Review the results 一节):
- TTFT 曲线:p95/p99 随时间是否稳定,8K/32K 档位抬升是否符合预期;
- RSS 曲线:是否持续爬升。要对比"前几小时"和"最后几小时",而不是只看全程均值;
- 错误率:8K/32K 请求不应出现路由错误,出现
context_length_exceeded时检查回退目标是否生效; - 通过门槛:只有时长跑满、错误率在预算内、每次健康检查通过、RSS 增长不超限,命令才返回 0。
常见问题速查 ✅
- 想测接近真实窗口溢出?把
--context-window-tokens设为模型真实窗口,90% 档会贴边施压;溢出后的回退行为说明在 docs/operations/context_window.md。 - 只想跑长上下文场景?用
--scenario long-context单独选中,避免其他场景干扰。 - 需要真实模型数据?本地 mock 保证确定性,但容量结论要对真实模型部署复跑一遍——真实 token 化与提供方排队会带来差异。
- 结果里的 cpu_percent 是瞬时值吗?不是,它是进程的生命周期平均 CPU,应理解为长跑均值而非尖峰探测。
总结
Switchyard 把"8K/32K 长上下文压测"做成了开箱即用的场景与门禁:long-context场景固定三档输入长度,本地 mock 后端让 TTFT 测量零成本且可复现,48 小时浸泡测试用--max-rss-growth-mib硬性卡住内存增长。按本文的三步走——本地短跑 → 路由开销对比 → 发布级长跑——你就能在上线前自信地回答:这个路由网关在长输入下 TTFT 是否达标、内存是否稳定。🚀
【免费下载链接】SwitchyardSwitchyard lets LLM applications route traffic across models and providers while preserving native OpenAI and Anthropic API compatibility - enabling flexible model selection, benchmarking, and cost/performance optimization.项目地址: https://gitcode.com/GitHub_Trending/switch/Switchyard
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考