常用基础 - ab性能测试 ¶
作者:KK
发表日期:2017.10.22
更新记录:
2019.1.10 增加测试失败的分析指引
2022.02.09 增加附带 header 的示例以及官方文档链接
介绍 ¶
无论是哪个平台,bin目录下都有一个ab命令程序,你可以在此执行测试ab -n 10 -c 10 http://127.0.0.1/
,这个命令的意思是发送10个请求,这些请求通过模拟10个用户来发送(就是10个并发),运行后会输出一些测试报告信息(下面进行解读),而且你也会在服务器日志上看到10条请求记录。顺带提一下其实它还能对其它任何网络地址的服务器发起测试,比如nginx服务器
好了你也清楚了,其实它就是用来向指定的目标产生请求的,这样的意图主要是用来进行性能压力测试,看看目标服务器是否有顶住
主要参数说明 ¶
测试地址:被发起请求的测试地址参数是放在所有参数的最后的,其中如果这个地址就是host的话那要带上/号结尾,除非是/path或/path/file.html这样就不用/号结尾
-n
:一共发起多少次请求-c
:每次请求的并发量是多少,如-n 30 -c 10
的话,就是将30个请求以每次10并发的方式发送,就会一共发送3波请求过去-t
:最大执行时长(秒),比如-n 10000000 -c 1000 -t 10
就是100万个请求每次1000并发的量发出去,要求最多10秒。如果服务器在10秒内都收到了100万条请求并产生了日志,说明服务器在10秒内能承受100万;如果10秒内只产生了50万条日志,说明还有50秒条请求未收到(ab根据参数最多请求10秒,不管剩下多少次未发送,而且ab发起下一波请求的条件是上一波请求被响应回来了才行)
输出报告解读 ¶
报告样本:
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient).....done
Server Software: Apache/2.4.23
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /
Document Length: 11 bytes
Concurrency Level: 10
Time taken for tests: 1.042 seconds
Complete requests: 10
Failed requests: 0
Total transferred: 2140 bytes
HTML transferred: 110 bytes
Requests per second: 9.60 [#/sec] (mean)
Time per request: 1041.822 [ms] (mean)
Time per request: 104.182 [ms] (mean, across all concurrent requests)
Transfer rate: 2.01 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 2.1 1 7
Processing: 176 441 399.5 201 1031
Waiting: 176 441 399.4 201 1031
Total: 176 442 399.3 208 1032
Percentage of the requests served within a certain time (ms)
50% 208
66% 238
75% 1012
80% 1016
90% 1032
95% 1032
98% 1032
99% 1032
100% 1032 (longest request)
图解:
而最下面那些百分比的意思是这样的:
-c
不是指定了模拟的并发用户量嘛,那这些用户的情况就是50%的用户响应时间小于208毫秒,60%的用户响应时间小于238毫秒……%99的用户响应时间小于1032毫秒
分析测试失败的原因 ¶
有时候有许多测试失败的数量,如下图这样:
如果你不方便查看日志分析的话(一般是对非本机测试,比如测试环境或准线上环境),可以打开 Fiddler,设置只抓取指定host的数据包 后,在ab
测试器的命令里加入-X 127.0.0.1:8888
会在测试时使用代理(比如ab -n 10 -c 10 -X 127.0.0.1:8888 http://www-test.shop.com
),这样就可以用 Fiddler 记下所有请求了,并看到失败状态码的请求返回了什么内容,就能进一步准确地分析测试失败的原因了。
再来一个附加 header 请求的例子 ¶
ab -c 1000 -n 10000 -q -H "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9uOG44LmNuIiwiYXVkIjoiaHR0cDpcL1wvbjhuOC5jbiIsImp0aSI6ImVkNWQ2OWE1MDNmOGQxOGUyMDQyNGNlZWM4ZDliYzU1IiwiaWF0IjoxNjQ0MjEabcdefgHAiOjE2NDQyMTM1OTAsIm5iZiI6MTY0NDIxMjE1MCwidWlkIjoiMzgwOTMxMiJ9._UhgVeDCM42LVP88KkCr-JcUQ2tVWmT6Wj52aGeVRXs" http://gw-dev.n8n8.cn/oabase/api/softuser/v1/app-index/recommend?app_session=d96376e29b9046e99667708f79d08563
官方文档 ¶
更多参数的学习使用参见 官方文档。