Agent 性能测试实战(二):状态层的三类问题,是怎么被压出来的
前言:
根据上一篇性能测试分层理论,梳理一下L2 状态层的压测。
在 Agent 系统里,真正危险的不是慢,而是乱。
这一篇只讲 L2:状态层压测,我是如何一步步定位出三个问题的。
1、为什么单独测 L2
项目的核心链路:
自然语言 → 路由 → tool → JSONL 落盘
只要落盘层出问题:
-
L3 summary 会被污染
-
查询会读到脏数据
-
后续分析全部失真
所以顺序是:
先压 L2,再谈生成层。
2、第一轮压测:单线程对照组
场景 S1:单线程 200 次写入(JMeter)
配置:
-
线程数:1
-
循环:200
-
输入:record 类自然语言
结果:
-
错误率:0%
-
JSONL 校验:全部合法
校验脚本:
import json
with open('fragments.jsonl','r',encoding='utf-8') as f:
for i,line in enumerate(f,1):
json.loads(line)
无异常。
结论:
在无并发条件下,系统稳定。
这一步比较重要,因为它为后续问题提供了对照组。
3、第二轮压测:幂等缺失问题出现
重复运行同一个压测脚本两次。
发现:
-
同样的输入
-
生成两条完全相同的记录
让Claude code检查代码:
item = {
"id": uuid.uuid4().hex,
"content": content
}
_append_jsonl(...)
每次都会生成新的 UUID,没有查重逻辑。
这说明:
系统没有幂等保障。
这不是并发问题。
是状态一致性设计问题。
4、第三轮压测:并发异常(KeyError)
场景 S2:10线程 × 100循环
结果:
-
总样本:1000
-
异常率:42.40%
失败响应:
{
"error_type": "KeyError",
"error": "'tools'"
}
说明:
并发下有部分请求在决策阶段直接崩溃。
这已经不是“慢”,而是“不可用”。
5、第四轮验证:文件真的被写坏了吗?
并发压测结束后,我没有直接看 TPS。
而是:
对 JSONL 做逐行校验。
结果:
总记录数: 574
第 390 行 JSON 解析失败
0389: {...正常JSON...}
0390: '\n'
0391: {...正常JSON...}
第 390 行是空行。
6、为什么空行意味着并发写失败
JSONL 格式要求:
每一行必须是完整 JSON。
出现空行说明:
-
多线程写入没有互斥
-
写操作不是原子
-
文件结构已被污染
这是:
存储层并发安全缺陷。
7、用对照组确认原因
再次运行:
-
单线程 200 次
-
校验 JSONL
结果:
-
无异常
可以确定:
文件损坏是并发竞态导致,而非业务逻辑错误。
8、L2 当前问题
| 编号 | 问题 | 类型 |
|---|---|---|
| L2-01 | 幂等缺失(重复写入) | 状态一致性 |
| L2-02 | 并发请求 KeyError | 上下文竞态 |
| L2-03 | 并发写入 JSONL 损坏 | 存储安全 |
9、本轮压测的价值
这轮压测不是在找 TPS 上限。
而是:
-
系统是否具备基本幂等能力?
-
并发下是否稳定?
-
数据是否会被破坏?
答案是:
-
幂等:否
-
并发稳定:否
-
存储安全:否
但这些问题都有对照组和证据链支持。
10、下一步计划
-
为 JSONL 写入增加互斥保护
-
排查并发上下文问题
-
复跑 L2 并发压测
-
在稳定状态下再做 L3 并发生成压测
小结
Agent 的性能测试,核心不是“压到多少 TPS”。
而是:
用并发测试,把隐藏在本地文件、上下文共享、幂等设计里的问题压出来。
更多推荐


所有评论(0)