提交 82d38613 authored 作者: 陈泽健's avatar 陈泽健

docs(performance): 更新混合场景执行异常排查修复到 HANDOFF_性能测试.md

- 补充容器重启中断 result 兜底 + TPS 0 分析 + 前端图表 UI 双修复部署验证
- 新增 force push 事故记录与恢复措施
- 日期更新至 2026-09-09
Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
上级 407a99fc
# HANDOFF — 性能测试模块会话交接文档 # HANDOFF — 性能测试模块会话交接文档
> **生成时间**: 2026-09-08 > **生成时间**: 2026-09-09
> **当前分支**: `platform-auto-test` > **当前分支**: `platform-auto-test`
> **最近提交**: `ea2a90cb` perf(performance): 大JSON列垂直拆表闭环 MySQL 1038 + 登录汇总透出(已推送 origin/platform-auto-test) > **最近提交**: `407a99fc` Merge commit '29f3612d' into platform-auto-test(性能 `fbc79ee1` + UI 自动化 `29f3612d` 恢复合并,已推送 origin/platform-auto-test)
> **会话窗口**: 性能测试 — 2026-09-08 P3 待办闭环:performance 大 JSON/TEXT 列垂直拆表(7 个从表 + 双写 + 读优先从表 + 启动回填 + 零回归)+ **部署 5.60 验证闭环** > **会话窗口**: 性能测试 — 2026-09-09 混合场景执行异常排查修复:容器重启中断 result 兜底 + TPS 0 分析 + 前端图表 UI 双缺陷修复 + **部署 5.60 验证闭环**
> **状态**: ✅ 已提交推送 `ea2a90cb` + 已部署 5.60(12 张从表建成 + 存量回填 101 行 + 修复启动回填 ResourceClosedError,本地全量 437 passed) > **状态**: ✅ 已提交推送(`fbc79ee1` 4 文件 + 恢复合并 `407a99fc`)+ 已部署 5.60(引擎取消路径修复 + 前端 computed/resize)+ 卡死任务复位 failed
---
## ⚡ 最新会话更新(2026-09-09)— 混合场景执行异常排查修复:容器重启中断 result 兜底 + TPS 0 分析 + 前端图表 UI 双修复 ✅
### A. 背景:5.60 混合场景执行反馈 4 个问题
用户在 5.60 运行混合场景性能测试(任务 `perf_1c72c087ba4f4854b5f9a8c9a348f565`,100 VU / 30min),反馈 4 个问题:
1. 任务执行状态异常:后端报 `local variable 'result' referenced before assignment`,任务直接失败且请求数为 0;
2. TPS 约 90% 点位为 0;
3. 目标机卡片标题渲染混淆后 JS 函数源码(`function wl(){return Ge.value>0?`...`}`);
4. 执行机资源图表展开后仍呈窄条。
### B. 问题一根因:容器重启中途杀掉压测 + 取消路径未初始化 result ✅ 已修复
| 项 | 说明 |
|----|------|
| 现场证据 | 09:02:24 任务启动,09:02:27 预热完成 100 协程;09:05:15 容器 `Shutting down`(非任务自然结束),WebSocket 断开;09:05:26 容器重新 StartedAt(**人为 restart/重建,疑为其他窗口部署**) |
| 失败记录 | `exec_733d6baf`:failed、reqs=0、snapshotCount=0 —— 快照缓冲随进程退出丢失,未落库 |
| 引擎缺陷 | `result` 仅在 `try` 内分支赋值;`asyncio.CancelledError`(Python 3.8+ 为 BaseException)不被 `except Exception` 捕获,在 `await self._run_mix(task)` 抛出后跳过全部赋值 → `finally``isinstance(result, dict)``UnboundLocalError`,把「容器重启」误报为「引擎代码错误」,任务卡 running |
| 修复 | `performance_executor.py` `execute()` 入口预初始化 `result = {"error": True, "error_message": "任务执行被中断,未产生完整结果"}` + 新增 `except asyncio.CancelledError` 显式捕获(warning 日志 + 标准结构返回) |
| 佐证 | 混合场景引擎本身正常:09-07 完整跑完 12615 请求 / 09-08 9419 请求;本次 failed 直接原因是容器重启 |
### C. 问题二:TPS 90% 为 0 —— 正常逐秒波动,非 bug(无需代码修复)
5.60 各次执行快照实测:
| 执行 | 状态 | 快照数 | TPS=0 占比 | 平均 TPS | 请求数 | 错误率 |
|------|------|--------|-----------|----------|--------|--------|
| 09-02 | completed | 1804 | 1% | 17.3 | 31355 | 0% |
| 09-07 | completed | 1804 | 23% | 6.3 | 12615 | 9.25% |
| 09-08 | completed | 1804 | 34% | 3.8 | 9419 | 27.89% |
机制:`MetricsCollector.snapshot()` 以 1 秒为窗口统计**完成**数。混合场景被测业务接口(会议预定/模板操作)单请求耗时数百 ms 至数秒,大量请求处于排队/往返中时该 1 秒窗口内无请求完成 → 瞬时 TPS=0,仅请求集中返回的秒数出现尖峰;思考时间(Think Time 默认 1~3s)进一步放大空窗。**这是业务重接口下的正常表现**(09-02 轻接口执行零占比仅 1% 佐证)。若需平滑可后续支持滑动平均,暂无代码改动。
### D. 问题三:目标机 Memory Usage 渲染函数源码 ✅ 已修复
`MonitorPanel.vue` 模板 `{{ targetMemBar }}` 引用的是**普通函数** `function targetMemBar() {...}`(非 computed),Vue 渲染其 `toString()`,生产混淆后即 `function wl(){return Ge.value>0?...}`。已改为:
```typescript
const targetMemBar = computed(() =>
targetMemTotalMb.value > 0
? `(${targetMemUsedMb.value.toFixed(0)} / ${targetMemTotalMb.value.toFixed(0)} MB)`
: ''
)
```
模板插值自动解包,不再输出函数体。
### E. 问题四:执行机资源图表窄条 ✅ 已修复
- 根因:`updateResourceChart()``getWidth() === 0` 才 resize,但 el-collapse 折叠动画中间态/padding 隐蔽节点可能返回极小非零宽度(如 100px),绕过兜底;
- 修复:两个 `el-collapse` 绑定 `@change="handleCollapseChange"`,展开瞬间 `nextTick` 后统一对 `resourceChart/networkChart/targetResourceChart``resize()`
### F. 验证与部署 5.60
| 项 | 结果 |
|----|------|
| 本地 py_compile | ✅ performance_executor.py 0 警告 |
| 前端构建 | ✅ `npm run build` 通过,新产物 `MonitorPanel-CmXqeSsr.js` |
| 后端测试 | ✅ 性能套件 129 passed(test_performance_executor 25 + mix/target/ai 66 + mix/satellite 38),零回归 |
| 部署 5.60 | ✅ 远端 .bak 备份 → sftp.put → `docker compose restart app``/health` healthy |
| 容器内代码标记 | ✅ CancelledError 捕获 1 处 + result 兜底 1 处命中;新 MonitorPanel JS HTTP 200 |
| 卡死任务复位 | ✅ `perf_1c72c087...` running → failed,errorMessage「执行被容器重启中断(2026-09-09 17:05),已由运维脚本复位」 |
### G. ⚠️ force push 事故记录与恢复(多窗口协作教训)
- **事故**:提交 `fbc79ee1` push 被拒(远程含其他窗口新推的 `29f3612d`)。执行 `git fetch``git rebase origin/platform-auto-test` **无操作**(误报 "up to date"),随后 `git push -f` **覆盖了远程 29f3612d**(UI 自动化窗口:15 条用例同步 + 钉钉形态4停止通知 + noVNC 修复,26 文件 +3384/-200)。
- **根因**:本地存在**同名本地分支** `refs/heads/origin/platform-auto-test`(指向旧 `75870a5e`,疑为历史误建),导致 `origin/platform-auto-test` 解析到该本地分支而非 `refs/remotes/...`(git 报 `refname ambiguous` 但未阻止)。
- **恢复**`29f3612d` 对象仍在本地(未被 gc),`git merge --no-edit 29f3612d` 生成 `407a99fc` 合并提交,已推送 `origin/platform-auto-test`,两条线均完整保留。
- **教训**:① push 被拒后先 `git log HEAD..origin/<branch>` / `git log origin/<branch>..HEAD` 查分叉再决定策略;② **禁止盲目 `push -f`**,必须逐项确认覆盖目标;③ 遇到 `refname ambiguous` 警告必须停下来,用完整 `refs/remotes/origin/<branch>` 显式引用;④ 建议后续删除多余本地分支 `refs/heads/origin/platform-auto-test`(删除前确认无窗口依赖)。
### H. 剩余待办
| # | 任务 | 优先级 | 说明 |
|---|------|--------|------|
| 1 | 5.60 复跑混合场景验证 | P1 | 用户需在 5.60 重新执行混合场景任务,确认修复后:任务正常 completed、TPS 曲线合理、图表充满宽度 |
| 2 | ~~提交推送~~ | — | ✅ `fbc79ee1`(4 文件)+ 恢复合并 `407a99fc` 已推送 |
| 3 | HANDOFF 更新提交 | P2 | 本节更新后建议随文档一并提交推送 |
| 4 | 跟踪其他窗口 | — | UI 自动化窗口仍在并行开发;合并时注意 `execution_service.py` / `playwright_executor.py` 等共享文件冲突 |
--- ---
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论