在项目正式上线之前,我们通常需要通过压测来评估当前系统能够支撑的请求量、排查可能存在的隐藏bug,同时了解了程序的实际处理能力能够帮我们更好的匹配项目的实际需求,节约资源成本。

压测相关术语

  • 响应时间(RT) :指系统对请求作出响应的时间.
  • 吞吐量(Throughput) :指系统在单位时间内处理请求的数量
  • QPS每秒查询率(Query Per Second) :“每秒查询率”,是一台服务器每秒能够响应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
  • TPS(TransactionPerSecond):每秒钟系统能够处理的交易或事务的数量
  • 并发连接数:某个时刻服务器所接受的请求总数

wrk

wrk 是一款开源的HTTP性能测试工具,它和上面提到的ab同属于HTTP性能测试工具,它比ab功能更加强大,可以通过编写lua脚本来支持更加复杂的测试场景。

Mac下安装:brew install wrk

常用命令参数:

1
2
3
4
5
6
7
-c --conections:保持的连接数
-d --duration:压测持续时间(s)
-t --threads:使用的线程总数
-s --script:加载lua脚本
-H --header:在请求头部添加一些参数
--latency 打印详细的延迟统计信息
--timeout 请求的最大超时时间(s)

使用示例:wrk -t1 -c10 -d300s -s test.lua --latency http://127.0.0.1:8080/api/v1/posts?size=10

输出结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Running 30s test @ http://127.0.0.1:8080/api/v1/posts?size=10
8 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 14.55ms 2.02ms 31.59ms 76.70%
Req/Sec 828.16 85.69 0.97k 60.46%
Latency Distribution
50% 14.44ms
75% 15.76ms
90% 16.63ms
99% 21.07ms
198091 requests in 30.05s, 29.66MB read
Requests/sec: 6592.29
Transfer/sec: 0.99MB

test.lua 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
wrk.method = "POST"
wrk.body = '{"a": "1"}'
wrk.headers["Content-Type"] = "application/json"

response = function(status, headers, body)
if(status == 200)
then
--print(status, body)
-- print('zzz') --[ 布尔表达式为 true 时执行该语句块 --] --调试用,正式测试时需要关闭,因为解析response非常消耗资源
else
print(status, body) --[ 布尔表达式为 false 时执行该语句块 --]
end
end