这个月给一个接口做压测,从"完全不知道从哪下手"到交出一份能用的容量结论,AI 帮了大忙——但它也差点把我带进沟里两次。这篇是完整实录。
一、先把口径定死,再动手
压测最容易出的问题是"压了但没人认"。所以我第一件事不是装工具,而是把下面这段发给 AI,让它帮我确认口径:
我要压一个 POST 接口,目标是:8 核机器上单实例在 500 并发下满足 P99 ≤ 200ms、错误率 < 0.1%。请指出我这个目标里有哪些定义不清的地方。
它挑出来四个:并发是指并发连接还是并发请求、P99 是否含超时请求、错误率是否包含限流返回的 429、以及"8 核机器"是压测机还是被压机。
这四个问题我原本一个都没写清楚。先花十分钟对齐口径,比压完发现数据没法用强得多。
二、让它生成脚本,但别信它给的参数
我让它用 wrk 和 k6 各写一版脚本。它给我的第一版里有这么一段:
-- AI 生成的 wrk 脚本(第一版,有幻觉参数)
wrk.method = "POST"
wrk.body = '{"page":1,"size":20}'
wrk.headers["Content-Type"] = "application/json"
wrk.timeout = 2000 -- ⚠️ 这个参数 wrk 根本没有
wrk.rate = 300 -- ⚠️ 也没有
wrk.timeout 和 wrk.rate 是它编的——wrk 的脚本变量只有 method / body / headers / path。我因为不熟这个工具,差点直接用。
后来我改了问法:
只使用 wrk 官方脚本支持的内置变量,不确定的不要写;如果某个能力 wrk 做不到(比如按固定 QPS 发压),直接告诉我换工具。
它这次老实了,并主动建议:「固定速率用 k6 的 constant-arrival-rate 更合适」。
经验:AI 对压测工具的 CLI 参数和脚本变量记忆非常不可靠。凡是参数,一律去官方文档或
--help核一遍(wrk --help只要两秒)。
三、压测机自己先成了瓶颈
第一轮结果很难看:QPS 卡在 1200 上不去,P99 飙到 800ms。我以为是服务端问题,把结果连同 top 输出一起丢给 AI,它先问了一句:
被压机和压测机分别是什么配置?压测机的 CPU steal 和上下文切换是多少?
一查,压测机和被压机在同一台机器上,而且 wrk 已经吃满 4 个核。也就是说,我测的大半是"自己打自己"。
分开机器重压之后,QPS 直接到 4200,P99 掉到 130ms。这是这次最大的一个坑,也是 AI 唯一一次救了我而不是坑我。
四、阶梯加压找拐点
固定并发压一次只能得到一个点。让 AI 生成一条阶梯加压的场景表后,我做成了这样一张表(简化):
| 并发 | QPS | P99 | 错误率 | 被压机 CPU |
|---|---|---|---|---|
| 100 | 1850 | 42ms | 0% | 22% |
| 300 | 4100 | 118ms | 0% | 55% |
| 500 | 4350 | 190ms | 0.02% | 78% |
| 800 | 4380 | 720ms | 1.4% | 96% |
| 1200 | 4400 | 2100ms | 6.8% | 99% |
拐点在 500~800 之间:QPS 不再涨,延迟开始暴涨——典型的排队现象。这个判断我没有让 AI 拍,而是让它解释"为什么 QPS 到 4400 就上不去了",它给的候选是 CPU 饱和、连接池、GC、锁竞争,并列出各自该看什么指标。我按这个清单去查,最后落在数据库连接池(max_open_conns 只有 20)。
五、报告:结论要能被别人拿去用
最后让 AI 帮我起了一版报告初稿,我改了三处:
- 加了"测试环境"整节(机器规格、网络、数据量、是否预热)——它默认不写,但没有这节结论就没有意义;
- 把"平均延迟"全部换成分位——它初稿里写的是 avg,那玩意儿在压测里几乎没有信息量;
- 补了风险与不确定性:"本次未测尖峰场景""数据库为单实例,未验证主从延迟影响"。
最终结论写成了一句可以直接用的话:
单实例(8C16G,连接池 20)在 500 并发下支撑 4300 QPS,P99 190ms;瓶颈为数据库连接池。按峰值 12000 QPS 估算,需 3 个实例并留 30% 冗余(4 台)。
六、这次学到的三条
- 参数不信 AI,口径要先定:工具参数、配置项一律核对官方文档;
- 先排除压测机自身:CPU、网络、端口耗尽、CPU steal,四样先看一遍;
- 结论必须带环境与不确定性:否则数字好看但没人敢用。
小结
AI 在压测这件事上最值钱的三个用法是:帮你把口径问清楚、帮你写脚本骨架、帮你把可疑指标列全。最不值钱的是:让它告诉你"应该是什么结果"——结果只能压出来。至于参数和命令,把它当草稿,自己核一遍再跑。