Multi-Agent AIOps V3 压测报告#
测试日期:2026-06-08
测试对象:Multi-Agent AIOps Platform V3
测试范围:API 接入、队列削峰、Webhook 洪峰、限流保护、Worker 执行并发
1. 测试结论#
当前配置下,系统可以同时接收较高并发的请求,但会把真正昂贵的诊断执行限制在一个可控范围内。
| 结论项 | 结果 |
|---|---|
| 当前 Worker 数量 | 3 |
| 当前真实诊断执行上限 | 2 |
| 读接口最高测试并发 | 200 |
| 读接口最高测试请求数 | 3000 |
| 后台诊断提交最高测试并发 | 100 |
| Webhook 最高测试并发 | 100 |
| Webhook 最高测试请求数 | 500 |
| 限流是否生效 | 是 |
| Worker 真实执行槽是否被打穿 | 否 |
| 压测后队列是否恢复干净 | 是 |
最重要的结论:
Worker 数量 = 3
真实同时诊断数 = 2text也就是说,3 个 Worker 都可以领取任务,但当前配置只允许 最多 2 个诊断任务真正同时执行 LLM / RAG / MCP 工具链路。第 3 个 Worker 会等待全局执行槽释放。
2. 测试环境#
| 项目 | 配置 |
|---|---|
| 部署方式 | Docker Compose |
| API 服务 | FastAPI + Uvicorn |
| Worker 数量 | 3 |
| 队列 | Redis Streams |
| 事实库 | Postgres |
| 向量库 | Milvus |
| 工具接入 | MCP |
| 模型调用 | DeepSeek / OpenAI-compatible 接口 |
关键并发配置:
| 配置项 | 值 | 说明 |
|---|---|---|
WORKER_DIAGNOSIS_CONCURRENCY | 2 | 所有 Worker 合计最多同时真正执行 2 个诊断 |
MANUAL_DIAGNOSIS_CONCURRENCY | 2 | 同步诊断全局最多 2 个 |
EXECUTOR_MAX_PARALLEL | 6 | 单轮最多并行执行 6 个安全工具 |
RATE_LIMIT_MANUAL_PER_IP_PER_MIN | 20 | 单 IP 每分钟手动诊断提交上限 |
3. 压力模型#
V3 把压力拆成多类分别治理,而不是让所有压力都进入 Agent 执行阶段。
| 压力来源 | 风险 | V3 的处理方式 |
|---|---|---|
| 用户请求压力 | API 被长诊断占住 | 高并发走后台提交,API 快速返回任务 ID |
| 告警洪峰压力 | Webhook 堵塞或重复建任务 | 入口只做归一、去重、落库、入队 |
| 队列堆积压力 | Worker 消费跟不上提交速度 | Redis Streams 保存 backlog,并暴露 depth / pending / lag |
| Worker 执行压力 | 多个 Worker 同时打满 LLM / RAG / MCP | 全局执行槽限制真实诊断并发 |
| LLM 成本压力 | 多任务同时消耗 token | 控制真实执行并发、最大步骤、模型分层和 token 统计 |
| RAG / 数据库压力 | 检索、rerank、落库延迟升高 | 后台执行限额间接保护重资源链路 |
| MCP 工具压力 | 工具服务被频繁调用 | Skill 工具白名单、只读工具并行上限、失败降级 |
核心模式:
请求洪峰
-> API 快速接收
-> Postgres 记录任务事实
-> Redis Streams 排队削峰
-> Worker 按优先级领取
-> 全局执行槽限制真实诊断并发
-> 成功 ACK / 失败重试 / 最终进入 DLQtext4. 测试用例总览#
| 编号 | 测试项 | 请求数 | 并发 | 是否触发 LLM | 目标 |
|---|---|---|---|---|---|
| 1 | API 读压 | 1000 | 100 | 否 | 测队列状态查询读压 |
| 2 | API 读压 | 3000 | 200 | 否 | 测更高读并发下延迟变化 |
| 3 | 后台诊断提交 | 200 | 100 | 否 | 测 API 入队、Postgres、Redis 写入 |
| 4 | Alertmanager Webhook | 500 | 100 | 否 | 测告警洪峰接入 |
| 5 | 接口限流 | 40 | 40 | 否 | 验证单调用方限流 |
| 6 | 真实 Worker 执行 | 8 | 8 | 是 | 验证队列削峰和执行槽 |
| 7 | Worker 专项补测 | 6 | 6 | 是 | 验证最多几个 Worker 真正同时执行 |
说明:写入型高压测试期间临时停止 Worker,只验证接入、落库和入队能力,避免大批任务触发 LLM 消耗。测试结束后清理压测任务并恢复 Worker。
5. API 读压测试#
测试接口:
GET /api/v1/queue/statustext该接口不创建任务、不调用 LLM,用于观察 API + Redis 状态查询链路的读压能力。
| 请求数 | 并发 | 成功率 | 总耗时 | 吞吐 | 平均延迟 | P50 | P95 | P99 | Max |
|---|---|---|---|---|---|---|---|---|---|
| 1000 | 100 | 100% | 2.72s | 367.7 req/s | 265ms | 221ms | 582ms | 645ms | 658ms |
| 3000 | 200 | 100% | 22.03s | 136.2 req/s | 1421ms | 1163ms | 3795ms | 5046ms | 5388ms |
结论:
- 100 并发读压下系统响应较稳,吞吐约 367.7 req/s。
- 200 并发读压下仍 100% 成功,但延迟明显上升。
- 当前瓶颈主要开始出现在队列状态查询、Redis 交互和本机容器资源上。
6. 写入接入压力测试#
测试期间临时停止 Worker,只测试 API 入队、Postgres 落库、Redis 队列写入,不触发大批 LLM 执行。
6.1 后台诊断提交#
测试接口:
POST /api/v1/aiops/diagnose/submittext| 请求数 | 并发 | 成功率 | 状态码 | 总耗时 | 吞吐 | 平均延迟 | P50 | P95 | P99 | Max |
|---|---|---|---|---|---|---|---|---|---|---|
| 200 | 100 | 100% | 200: 200 | 2.03s | 98.3 req/s | 725ms | 980ms | 1068ms | 1094ms | 1099ms |
观察结果:
- 200 个后台诊断任务全部成功入队。
- 压测时 Worker 停止,因此任务只进入队列,不会被执行。
- 系统可以在较短时间内完成任务落库和队列写入。
6.2 Alertmanager Webhook 洪峰#
测试接口:
POST /api/v1/webhook/alertmanagertext| 请求数 | 并发 | 成功率 | 状态码 | 总耗时 | 吞吐 | 平均延迟 | P50 | P95 | P99 | Max |
|---|---|---|---|---|---|---|---|---|---|---|
| 500 | 100 | 100% | 200: 500 | 2.54s | 197.0 req/s | 480ms | 359ms | 1633ms | 1864ms | 2011ms |
观察结果:
- 500 条 Webhook 告警全部成功接收。
- 告警完成归一、落库,并进入优先级队列。
- Webhook 接入吞吐高于后台诊断提交,原因是请求体和业务路径更适合批量入口。
7. 接口限流测试#
测试目标:验证单调用方固定窗口限流是否生效。
测试方式:同一调用方并发提交 40 个后台诊断请求。
| 请求数 | 并发 | 2xx | 429 | 总耗时 | 吞吐 | 平均延迟 | P50 | P95 | P99 | Max |
|---|---|---|---|---|---|---|---|---|---|---|
| 40 | 40 | 20 | 20 | 0.94s | 42.5 req/s | 643ms | 770ms | 928ms | 930ms | 930ms |
结论:
- 前 20 个请求成功进入队列。
- 超过单 IP 窗口上限的请求返回 429。
- 限流触发后 API 保持健康,没有出现异常状态码。
8. 真实 Worker 执行验证#
测试命令:
python scripts/loadtest.py submit --n 8 --concurrency 8 --severity mixbash该测试会让 Worker 真实消费任务并调用诊断链路,用来验证队列削峰和全局执行槽。
| 指标 | 结果 |
|---|---|
| 总请求 | 8 |
| 成功请求 | 8 / 8 |
| 429 限流 | 0 |
| 总耗时 | 0.87s |
| 吞吐 | 9.1 req/s |
| 平均延迟 | 680ms |
| P50 | 747ms |
| P95 | 874ms |
| P99 | 874ms |
队列与 Worker 观察:
| 观察项 | 结果 |
|---|---|
| 压测前队列 | depth=0 pending=0 lag=0 dlq=0 |
| 压测后瞬时队列 | depth=8 pending=3 lag=5 dlq=0 |
| 活跃 Worker | 3 |
| 诊断执行槽 | 最高保持 worker_diagnosis=2/2 |
| 排空结果 | depth=0 pending=0 lag=0 dlq=0 |
| 任务落库结果 | 8 个任务全部 succeeded |
结论:
- API 可以并发接收任务并快速返回。
- 任务会进入队列削峰。
- 即使 3 个 Worker 同时存活,真实诊断执行并发也被限制在 2。
9. Worker 专项补测#
测试目标:确认当前最多有几个 Worker 真正同时执行诊断。
测试方式:提交 6 个真实诊断任务,连续采样队列状态、数据库任务状态和全局执行槽。
| 测试项 | 结果 |
|---|---|
| 提交任务数 | 6 |
| 成功任务数 | 6 |
| 活跃 Worker | 3 |
| 参与执行的 Worker | 3 |
任务状态 running 峰值 | 3 |
| 真实执行槽峰值 | 2/2 |
| 队列最终状态 | depth=0 pending=0 dlq=0 |
| 首个任务创建到最后任务完成 | 约 98s |
关键解释:
Worker 领取任务数 != 真正同时跑诊断数text压测中出现了 running=3,表示 3 个 Worker 都领取了任务并进入执行流程,包含正在等待全局执行槽的任务;但真实执行槽始终不超过 2/2。因此当前配置下:
最多同时真正执行诊断 = 2text第 3 个 Worker 会等待执行槽释放,不会同时打满 LLM / RAG / MCP。
10. 压测后状态#
压测结束后已清理未执行的压力测试任务,并恢复 Worker。
最终队列状态:
| 状态项 | 结果 |
|---|---|
depth | 0 |
pending | 0 |
dlq | 0 |
alive_workers | 3 |
worker_diagnosis | 0/2 |
11. 风险与说明#
- 读压测试不代表真实诊断吞吐,只代表 API + Redis 状态查询链路能力。
- 写入接入测试期间 Worker 被临时停止,因此不消耗大批 LLM,但可以验证削峰入口能力。
- 真实执行测试规模较小,目的是验证执行槽和 Worker 行为,不建议用大批真实 LLM 任务做暴力压测。
- 当前最大真实诊断并发由全局执行槽决定,不由 Worker 容器数量直接决定。
12. 调参建议#
当前推荐配置适合本地演示和中小规模压测:
Worker 数量 = 3
真实诊断执行并发 = 2text如果模型配额和机器资源更充足,可以逐步调整为:
| 场景 | Worker 数量 | 真实诊断执行并发 |
|---|---|---|
| 本地演示 | 3 | 2 |
| 小团队测试 | 4 | 3 |
| 更高吞吐试验 | 6 | 4 |
调大前建议同时观察:
- LLM RPM / TPM
- API P95 / P99
- 队列 depth / lag
- Postgres 连接池
- Milvus 检索延迟
- MCP 工具响应时间
- DLQ 是否增长