Switchyard浸泡测试13大场景全解:从长上下文到失败压力测试
【免费下载链接】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 是一款 LLM 模型路由网关,让应用无需改动代码就能在 OpenAI、Anthropic 等多家模型提供商之间灵活切换、做基准测试与成本优化。它内置的浸泡测试工具 switchyard-soak内置 13 大压力场景,通过长时间(标准 48 小时)持续加压,暴露短期测试发现不了的内存泄漏、延迟漂移与故障恢复问题。本文将带你完整看懂每一个场景。
一、什么是 Switchyard 浸泡测试?
浸泡测试(Soak Test)的思路很简单:用接近真实的流量持续压测服务器足够久。短时压测只能回答"快不快",而 48 小时的浸泡测试回答的是"能不能一直稳"——比如内存是否缓慢增长、p99 延迟是否随时间爬升、失败后能否自我恢复。
一次标准浸泡测试会:
- 🔄 同时走三种原生 API:OpenAI Chat Completions(
/v1/chat/completions)、Anthropic Messages(/v1/messages)、OpenAI Responses(/v1/responses),且流式与非流式都覆盖 - 📡 每分钟采样一次
/health与/metrics - 🐤 每 5 分钟发送一个故意错误的请求,预期返回 HTTP 400,并确认服务器随后依然存活
- ⏱ 结束时根据通过标准输出退出码,可直接接入门禁流水线
完整的发布准备与结果审查指南见 docs/operations/soak_test.md,工具本身的命令行参考在 crates/switchyard-soak/README.md。
二、13大浸泡测试场景速览
13 个场景按压力角度分为三组(core/agentic/resilience),默认运行的standard集 = 核心 + Agentic 两组,韧性组因预期会失败而单独运行:
| 分组 | 场景 | 压力角度 |
|---|---|---|
| 核心 | short-interactive | 短提示词 + 并发拐点 + 10 倍突发 |
| 核心 | long-context | 8K / 32K / 接近上下文窗口上限 |
| 核心 | decode-heavy | 512 与 1024 token 长输出 |
| 核心 | prefix-reuse | 共享前缀 vs 独立前缀 |
| 核心 | mixed-traffic | 短/中/长请求 70/20/10 混合 |
| Agentic | growing-conversation | 8 轮不断变长的对话 |
| Agentic | large-tool-catalog | 16 与 64 个工具的 JSON Schema 目录 |
| Agentic | tool-call-burst | 8 轮连续的工具调用/结果 |
| Agentic | stage-transitions | 探索→关键失败→高产工作 |
| Agentic | classifier-mix | 80/20 与 50/50 难易混合 |
| 韧性 | context-overflow | 近窗口请求被目标拒绝 |
| 韧性 | failure-pressure | 429 / 500 / 截断流注入 |
| 韧性 | client-cancellation | 客户端超时取消 |
场景目录定义在 crates/switchyard-soak/src/scenarios/mod.rs,每个场景一个源文件、一套纯函数构建器。
三、核心场景详解:长上下文、前缀复用与混合流量
1. short-interactive:短对话基线与并发拐点
发送"Reply with exactly OK."这类极简请求,并附带两种压力曲线:并发从 1 → 4 → 16 → 64 → 128 阶梯加压,以及把请求速率瞬间拉到10 倍、持续 5 秒的突发。用来找 HTTP 吞吐上限、TTFT(首 token 时间)与路由开销的饱和点。
2. long-context:长上下文压力测试
生成 8K、32K 以及达到配置上下文窗口 90%的输入,要求模型只总结最后一个标记词。健康表现是:TTFT 随输入变长而上升,但不出现路由错误或内存增长。
3. decode-heavy:长输出解码测试
短输入 + 512 与 1,024 token 的输出上限,专门压解码阶段。关注 ITL(token 间隔)、输出 token 吞吐是否稳定,长流式响应是否始终合法。
4. prefix-reuse:前缀复用与缓存敏感
成对发送"共享长前缀"与"独立长前缀"的请求。用于验证前缀缓存生效时的 TTFT 改善,以及缓存命中的 token 计费是否准确。
5. mixed-traffic:70/20/10 混合流量
按 70% 短、20% 中、10% 长的真实业务比例混流。重点观察 p99 延迟与"队头阻塞"效应——长请求是否会拖住后面的短请求。
四、Agentic 场景详解:多轮对话、工具目录与阶段切换
6. growing-conversation:不断变长的多轮对话
同一个会话连续 8 轮,每轮携带完整历史。验证会话亲和性(affinity)是否保持、延迟是否随历史增长而平滑上升,而不是跳变。
7. large-tool-catalog:16/64 工具大目录
分别携带 16 个和 64 个工具的 JSON Schema 目录。大目录会放大序列化与路由开销,此场景验证工具定义转发后依然完整无损。
8. tool-call-burst:工具调用突发
一个会话内连续 8 组"助手发起工具调用 → 工具返回结果"的联动轮次(共 9 个请求),考验会话状态连续性与突发处理能力。
9. stage-transitions:阶段路由切换
一个不断增长的会话依次经历"探索期 → 关键失败 → 高产工作"。预期 stage_router 算法在配置的证据边界处正确切换模型档位,而非误升降级。
10. classifier-mix:难易请求混合
先 80/20 再 50/50 两组确定性的"简单/困难"请求混合。验证 LLM 分类器的目标分配比例与输入比例一致,并让分类器自身的调用次数与延迟可被观测。
五、韧性场景详解:失败压力测试与客户端取消
韧性场景预期会产生错误,因此单独运行、不与吞吐样本混比。
11. context-overflow:上下文溢出回退
发送一个接近窗口上限、会被某个目标"拒收"的请求。健康的多目标路由应自动重试到其他合格目标并返回有效响应,整体错误率仍为 0。
12. failure-pressure:失败压力测试
按序注入四类有界故障:限流 429、服务器 500、分类器返回畸形判决、流式响应中途截断。验证重试恢复路径与"终止性错误"的显式上报,错误率落在预期的 1%–75% 区间即合格。
13. client-cancellation:客户端取消
在缓慢的流式响应上进行客户端超时取消。验证连接被正确释放,且取消不会把后续正常流量拖垮(此场景预期错误率 80%–100%,属"故意失败")。
六、浸泡测试上手步骤:从5分钟冒烟到48小时门禁
本地免费验证(无需任何模型密钥、零推理成本):
python3.12 scripts/run_local_soak_test.py --duration 10s --concurrency 4 --request-count 100它会自动拉起一个请求感知的模拟后端,先对每条路由发一次真实请求,再对每个路由算法依次跑 oha 与 AIPerf。配置示例见 scripts/local_soak_test.toml,对比脚本见 scripts/benchmark_routing_algorithms.py。
正式跑则需要从与发布完全相同的提交构建:
# 1. 先跑5分钟冒烟,确认路由与结果文件正常 cargo build --release -p switchyard-server -p switchyard-soak target/release/switchyard-soak \ --base-url http://127.0.0.1:4000 \ --model switchyard/general \ --duration 5m --concurrency 4 --report-interval 10 # 2. 发布门禁:48小时 + 内存增长上限 target/release/switchyard-soak \ --model switchyard/general \ --duration 48h --concurrency 16 \ --server-pid "$SWITCHYARD_SERVER_PID" \ --max-rss-growth-mib 512💡 小贴士:并发数请从短测试中找到的"最高稳态负载"确定,而不是一上来就压满——长时间被限流的测试测不出稳定性。完整参数表(如--scenario-set、--max-error-rate)见 crates/switchyard-soak/README.md。
七、浸泡测试通过标准:8项发布门禁清单
只有全部满足,命令才会以退出码 0 结束:
- 请求的完整时长跑完
- 至少完成一个推理请求
- 推理错误率 ≤
--max-error-rate(默认为 0,即零失败) - 所有周期性存活检查通过
- 每次
/metrics读取都能拿到两个请求计数器 - 所有进程采样都能取到 RSS 与 CPU 数据
- 所有"坏请求后恢复"检查通过
- 服务器请求计数器从未回零,且 RSS 增长未超上限
八、浸泡测试结果解读:四个输出文件
每次运行会在soak-results/<UTC时间戳>/下生成:
| 文件 | 看什么 |
|---|---|
config.json | 本次运行的非机密输入快照 |
intervals.csv | 每区间的错误率、延迟分位数、RSS、CPU |
errors.jsonl | 最多 10,000 条错误明细 |
summary.json | 最终通过结论与未过的门禁项 |
审批发布前,重点对比首尾各几小时而非全程平均:晚出现的失败、吞吐下滑、p95/p99 爬升、RSS 持续增长,都是典型隐患。把summary.json、区间图表、服务器日志与被测提交一起归档到发布记录。
九、开始你的第一次浸泡测试
现在你已经掌握了 Switchyard 浸泡测试的全部 13 个场景:先本地零成本跑通,再用 5 分钟冒烟确认路由,最后执行 48 小时门禁。当你的版本改动了 libsy、路由、流式翻译或服务生命周期行为时,一次完整的浸泡测试就是发布前最便宜的质量保险。
- 📖 操作指南:docs/operations/soak_test.md
- 🧪 场景源码:crates/switchyard-soak/src/scenarios/
- ⚖️ 路由算法说明:docs/routing_algorithms/overview.md
【免费下载链接】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),仅供参考