作业13:虚拟模型主备 + 压测到 429 + 值班 Runbook(动手 + Cursor)
作业目标:在测试环境起 LiteLLM(或等价网关)并接模拟 upstream;配置虚拟模型
primary/backup;用 Cursor 生成「逐步加压直到 429」的压测脚本并输出安全并发建议;写一页值班 Runbook(429 / 5xx / 超时)。验收标准:
1. 两个模拟上游可探活;经 LiteLLM(推荐
:4010)或直连可分别调用primary/backup2. 压测脚本跑出 CSV/JSON,并打印
safe_concurrency=…3. Runbook 一页可读、可照着值班处理
环境:本机或
192.168.110.207;勿压生产 vLLM,本作业默认打模拟上游。HTML:
docs/html_cursor/作业13_虚拟模型主备与压测Runbook_cursor.htmlRunbook 单页:
docs/md_cursor/作业13_值班Runbook_上游429_5xx_超时_cursor.md
路径:
scripts_cursor/作业13_虚拟模型主备与压测Runbook/配置:
patches_cursor/作业13_虚拟模型主备/config.yaml结果:
data/homework13/
目录
做完长什么样
| 项 | 值 |
|---|---|
| 模拟 primary | http://127.0.0.1:18101/v1(默认 max_concurrent=4,易出 429) |
| 模拟 backup | http://127.0.0.1:18102/v1(默认 max_concurrent=20) |
| 测试 LiteLLM | http://127.0.0.1:4010(Master Key sk-hw13-test-4010) |
| 虚拟模型 | primary / backup |
| 压测产物 | data/homework13/ramp_*.csv + ramp_*.json(含安全并发建议) |
| Runbook | 一页:429 / 5xx / 超时 |
学习路线
A 启动双模拟上游(primary/backup)
B (推荐)启动测试 LiteLLM :4010,加载主备虚拟模型
C curl 分别打 primary / backup
D 用 Cursor 生成或直接跑「加压到 429」脚本 → 得到安全并发
E 对照 Runbook 演示:X-Mock-Fail / X-Mock-Sleep
F 勾验收清单与作业12区别:12 打真实推理看延迟;13 用模拟上游专门练主备、429 与值班,不伤 GPU。
原理
客户端
│ model=primary / backup
▼
测试 LiteLLM :4010(虚拟模型名)
├─ primary → mock:18101(低并发上限 → 易 429)
└─ backup → mock:18102(较高上限)
可选:fallbacks: primary → backup- 虚拟模型:客户端只认逻辑名;真实 upstream 可换。
- 主备:primary 过载/故障时切 backup。
- 安全并发:压测找到「开始出现 429」的前一档,再乘余量(默认 0.7)。
详细步骤
A. 启动双模拟上游
开一个终端:
cd D:\workbuddy\192.168.110.207
python scripts_cursor/作业13_虚拟模型主备与压测Runbook/hw13_02_启动双上游.py或分两个终端手动:
python scripts_cursor/作业13_虚拟模型主备与压测Runbook/hw13_01_模拟上游.py --port 18101 --name primary --max-concurrent 4
python scripts_cursor/作业13_虚拟模型主备与压测Runbook/hw13_01_模拟上游.py --port 18102 --name backup --max-concurrent 20探活:
curl -sS http://127.0.0.1:18101/health
curl -sS http://127.0.0.1:18102/healthB. 启动测试 LiteLLM(推荐,独立 :4010)
不要改生产
:4000的 systemd,除非你明确要合并配置。
已安装 litellm 时:
# 207 示例(按实际 venv 调整)
litellm --config /opt/workbuddy/patches_cursor/作业13_虚拟模型主备/config.yaml --port 4010Windows 本机若已 pip install litellm:
python -m litellm --config patches_cursor/作业13_虚拟模型主备/config.yaml --port 4010配置要点(完整见 patches_cursor/作业13_虚拟模型主备/config.yaml):
model_name: primary→api_base: http://127.0.0.1:18101/v1model_name: backup→api_base: http://127.0.0.1:18102/v1fallbacks: - primary: [backup]master_key: sk-hw13-test-4010
若暂时起不了 LiteLLM:步骤 C/D 可先直连模拟上游,仍能完成压测与 Runbook;虚拟模型概念对照配置文件学习即可。
C. 验收主备可调用
经 LiteLLM:
curl -sS http://127.0.0.1:4010/v1/chat/completions \
-H "Authorization: Bearer sk-hw13-test-4010" \
-H "Content-Type: application/json" \
-d '{"model":"primary","messages":[{"role":"user","content":"hi"}],"max_tokens":8}'
curl -sS http://127.0.0.1:4010/v1/chat/completions \
-H "Authorization: Bearer sk-hw13-test-4010" \
-H "Content-Type: application/json" \
-d '{"model":"backup","messages":[{"role":"user","content":"hi"}],"max_tokens":8}'直连模拟:
curl -sS http://127.0.0.1:18101/v1/chat/completions \
-H "Authorization: Bearer sk-mock" \
-H "Content-Type: application/json" \
-d '{"model":"mock-primary","messages":[{"role":"user","content":"hi"}],"max_tokens":8}'D. 压测:逐步加压直到 429
# 直打 primary 模拟上游(最稳妥完成作业)
python scripts_cursor/作业13_虚拟模型主备与压测Runbook/hw13_03_压测到429.py \
--url http://127.0.0.1:18101/v1/chat/completions \
--model mock-primary \
--key sk-mock
# 若 LiteLLM :4010 已起
python scripts_cursor/作业13_虚拟模型主备与压测Runbook/hw13_03_压测到429.py \
--url http://127.0.0.1:4010/v1/chat/completions \
--model primary \
--key sk-hw13-test-4010期望输出含:
========== 安全并发建议 ==========
safe_concurrency = N
说明:最大稳定并发=…;安全建议= floor(…*0.7)=N …并生成 data/homework13/ramp_*.csv / ramp_*.json。
E. Runbook 演示(可选)
# 5xx
curl -sS -o - -w "\nhttp=%{http_code}\n" http://127.0.0.1:18101/v1/chat/completions \
-H "Authorization: Bearer sk-mock" \
-H "Content-Type: application/json" \
-H "X-Mock-Fail: 500" \
-d '{"model":"x","messages":[{"role":"user","content":"x"}],"max_tokens":8}'
# 超时(客户端 --max-time 3)
curl -sS --max-time 3 http://127.0.0.1:18101/v1/chat/completions \
-H "Authorization: Bearer sk-mock" \
-H "Content-Type: application/json" \
-H "X-Mock-Sleep: 10" \
-d '{"model":"x","messages":[{"role":"user","content":"x"}],"max_tokens":8}'对照 Runbook 单页 走一遍处理顺序。
Cursor 提示词(可复制)
把下面整段发给 Cursor,用于「自己生成压测脚本」练习(仓库已有参考实现 hw13_03):
请写一个 Python3 压测脚本(仅用标准库):
1) POST OpenAI 兼容 /v1/chat/completions
2) 并发阶梯 1,2,4,6,8,12,16,每档固定 N 个请求
3) 统计每档 http 200/429/5xx 比例与平均延迟
4) 出现 429 可停止继续加压
5) 计算安全并发:取「429=0 且成功率>=95%」的最大并发,再乘 0.7 向下取整
6) 打印 safe_concurrency,并写出 CSV + JSON 到 data/homework13/
参数:--url --model --key --levels --requests-per-level完整程序
| 文件 | 作用 |
|---|---|
scripts_cursor/作业13_虚拟模型主备与压测Runbook/hw13_01_模拟上游.py | 模拟上游(429/5xx/超时) |
scripts_cursor/作业13_虚拟模型主备与压测Runbook/hw13_02_启动双上游.py | 一键 primary+backup |
scripts_cursor/作业13_虚拟模型主备与压测Runbook/hw13_03_压测到429.py | 加压到 429 + 安全并发 |
patches_cursor/作业13_虚拟模型主备/config.yaml | 测试 LiteLLM 主备配置 |
(源码以仓库文件为准;下文不重复全文以免漂移。)
Runbook
完整一页见:
- Markdown:
docs/md_cursor/作业13_值班Runbook_上游429_5xx_超时_cursor.md - HTML:生成后为
docs/html_cursor/作业13_值班Runbook_上游429_5xx_超时_cursor.html
摘要:
| 故障 | 立刻做 | 根因方向 |
|---|---|---|
| 429 | 降并发、切 backup、停批跑 | 过载/限流;下调常态并发 |
| 5xx | 切 backup、查进程/变更 | 崩溃、错误发布 |
| 超时 | 降并发/降 max_tokens、核对超时链 | 排队、网络、阈值过短 |
验收清单
- [ ] primary / backup 模拟上游
/health正常 - [ ] (推荐)LiteLLM
:4010能分别调用primary、backup - [ ] 压测脚本出现 429,并输出
safe_concurrency - [ ] 存在
data/homework13/ramp_*.csv与ramp_*.json - [ ] 能按 Runbook 口述:429 / 5xx / 超时各自前三步
- [ ] (加分)用 Cursor 独立生成一版压测脚本,与
hw13_03对照差异
与其它作业关系
| 作业 | 关系 |
|---|---|
| 作业12 | 真实推理延迟与健康检查 |
| 作业13 | 测试环境主备、429 压测、值班 Runbook |
| LiteLLM 部署 | 生产网关;本作业用独立 :4010 配置,避免误伤 |