做后端开发的朋友应该都遇到过这样的场景:新服务上线前,老板问"这服务能抗住多少流量?",你心里没底;大促活动时,担心系统扛不住突发流量;性能优化后,想知道到底提升了多少。这时候就需要一个靠谱的压测工具来给出准确答案。
传统压测工具比如ab、jmeter有个通病:它们像"打机关枪",只管疯狂发送请求,根本不考虑服务器实际处理能力。这样测出来的结果往往失真——可能前几秒QPS很高,后面就断崖式下跌。这就像让一个人用百米冲刺的速度跑马拉松,根本反映不出真实服务水平。
wrk2的出现完美解决了这个问题。它最厉害的地方在于能精确控制吞吐量,就像给汽车装上定速巡航,说跑2000QPS就绝不会是1999。更关键的是它能给出毫秒级的延迟分布,让你一眼看清P90、P99这些关键指标。我去年优化一个API网关,就是靠wrk2发现的性能瓶颈——当QPS达到5000时,P99延迟突然从50ms飙升到800ms,这个细节用其他工具根本看不出来。
普通wrk就像个莽夫,只会用-c参数拼命创建连接。而wrk2的-R参数才是真正的智能调控器。举个例子:
bash复制wrk2 -t4 -c100 -d60s -R5000 https://api.example.com
这个命令会严格保持每秒5000请求的速率,4个线程共同维持这个吞吐量。我实测对比过:用ab压测时QPS波动能达到±15%,而wrk2的波动不到±0.5%。
实现原理:wrk2内部有个精密的调度器,会根据设置的速率动态调整每个线程的请求间隔。比如设置-R5000用4个线程,那么每个线程每毫秒就要处理5000/(4*1000)=1.25个请求。这种时间片轮转的方式保证了流量均匀分布。
延迟指标如果只看平均值就是耍流氓。用户感知的往往是那1%的慢请求,这就是P99的意义。wrk2的-L/--u_latency参数会输出完整的延迟分布直方图:
code复制Latency Distribution (HdrHistogram)
50.000% 8.12ms
75.000% 12.33ms
90.000% 16.45ms
99.000% 30.67ms
99.900% 98.23ms
这个输出我每次看都觉得惊艳。它用的是HdrHistogram算法,能在内存占用极小的情况下,实现纳秒级精度的统计。对比用Prometheus收集的指标,误差不超过0.1%。
最近给某电商做618大促前的压测,环境配置如下:
先安装wrk2:
bash复制# 解决依赖
sudo yum install -y git make gcc openssl-devel
# 编译安装
git clone https://github.com/giltene/wrk2.git
cd wrk2
make
sudo cp wrk /usr/local/bin/
第一轮:摸底测试
bash复制wrk2 -t8 -c200 -d300s -R1000 -L \
-H "Authorization: Bearer xxxx" \
https://product.internal/api/v1/detail/123
这个测试发现了两个问题:
第二轮:极限测试
bash复制for rate in 2000 3000 5000 8000; do
wrk2 -t8 -c500 -d180s -R$rate -L \
--timeout 2s \
https://product.internal/api/v1/detail/123
done
通过这个循环测试,我们绘制出了系统的性能曲线:
| QPS | CPU利用率 | P99延迟 | 错误率 |
|---|---|---|---|
| 2000 | 45% | 68ms | 0% |
| 3000 | 62% | 89ms | 0% |
| 5000 | 88% | 210ms | 0.3% |
| 8000 | 98% | 650ms | 5.7% |
最终确定安全水位在QPS 3000,这时候各项指标都在可控范围内。
wrk2支持用Lua脚本实现复杂逻辑。比如模拟用户登录后查询订单:
lua复制-- auth.lua
token = ""
request = function()
if token == "" then
return wrk.format("POST", "/login",
{["Content-Type"]="application/json"},
'{"user":"test","pass":"123"}')
else
return wrk.format("GET", "/orders?token="..token)
end
end
response = function(status, headers, body)
if not token and status == 200 then
token = json.decode(body).token
end
end
使用时:
bash复制wrk2 -t4 -c100 -d60s -R500 -s auth.lua https://api.example.com
问题1:测试结果出现大量超时
--timeout参数是否设置过小netstat -ant|grep TIME_WAIT|wc -l查看连接状态问题2:实际QPS达不到设定值
top确认测试机CPU是否跑满问题3:延迟结果异常波动
-B参数开启批量统计模式压测产生的数据需要专业分析。我习惯用如下流程:
bash复制wrk2 -t8 -c500 -d300s -R3000 -L \
--timeout 5s \
https://api.example.com > result.log
python复制# 提取P99延迟
cat result.log | grep "99.000%" | awk '{print $2}'
# 提取吞吐量
cat result.log | grep "Requests/sec" | awk '{print $2}'
最后生成的报告应该包含这些核心要素:
记得去年有个经典案例:通过对比优化前后的延迟分布图,我们发现P99.9从1200ms降到了230ms,这个可视化结果比任何文字说明都有说服力。