官方文档:https://httpd.apache.org/docs/trunk/programs/ab.html
测试场景:模拟10个用户,对应用接口发起总共1000次请求。
测试命令: ab -n 1000 -c 10 'http://139.224.215.199:60011/api/v1/quicksearch/?id=170'
测试报告:
apache的版本信息,与本次测试无关
[root@VM-16-11-centos ~]# ab -n 1000 -c 10 'http://139.224.215.199:60011/api/v1/quicksearch/?id=170'
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
显示测试完成度,在请求数量很多时会分行显示当前完成数量。如果测试发起请求数量较少,完成较快,无中间过程显示。
Benchmarking 139.224.215.199 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: 被测试的服务器所用的软件信息,因为没有使用类似nginx的服务,所以没显示。
Server Hostname: 139.224.215.199 被测主机名
Server Port: 60011 被测主机的服务端口号,一般http请求的默认端口号是80,https默认使用443端口
Document Path: /api/v1/quicksearch/?id=170 请求的具体路径
Document Length: 326 bytes 请求的响应结果的大小
Concurrency Level: 10 并发级别,也就是并发数,请求中-c参数指定的数量
Time taken for tests: 5.344 seconds 本次测试总共花费的时间
Complete requests: 1000 本次测试总共发起的请求数量
Failed requests: 0 失败的请求数量。因网络原因或服务器性能原因,发起的请求并不一定全部成功,通过该数值和Complete requests相除可以计算请求的失败率,作为测试结果的重要参考。
Write errors: 0 写入期间失败的错误数(损坏的管道)。
Total transferred: 872000 bytes 总共传输的数据量,指的是ab从被测服务器接收到的总数据量,包括响应体内容和请求头信息。
HTML transferred: 326000 bytes 从服务器接收的文档字节总数。该数字不包括 HTTP 标头中收到的字节,等于Document Length*Complete requests=326 bytes*1000=326000 bytes
Requests per second: 187.14 [#/sec] (mean) 平均(mean)每秒完成的请求数:QPS,这是一个平均值,等于Complete requests/Time taken for tests=1000/5.344=187.14
Time per request: 53.435 [ms] (mean) 从用户角度看,完成一个请求所需要的时间(因用户数量不止一个,服务器完成10个请求,平均每个用户才接收到一个完整的返回,所以该值是下一项数值的10倍。)
Time per request: 5.344 [ms] (mean, across all concurrent requests) 服务器完成一个请求的时间
Transfer rate: 159.36 [Kbytes/sec] received 网络传输速度。对于大文件的请求测试,这个值很容易成为系统瓶颈所在。要确定该值是不是瓶颈,需要了解客户端和被测服务器之间的网络情况,包括网络带宽和网卡速度等信息。
Connection Times (ms)
min mean[+/-sd] median max
Connect: 7 9 0.9 9 12
Processing: 35 43 14.0 40 226
Waiting: 35 43 14.0 40 226
Total: 42 52 14.1 49 235
这几行组成的表格主要是针对响应时间也就是第一个Time per request进行细分和统计。一个请求的响应时间可以分成网络链接(Connect),系统处理(Processing)和等待(Waiting)三个部分。表中min表示最小值; mean表示平均值;[+/-sd]表示标准差(Standard Deviation) ,也称均方差(mean square error),这个概念在中学的数学课上学过,表示数据的离散程度,数值越大表示数据越分散,系统响应时间越不稳定。 median表示中位数; max当然就是表示最大值了。
需要注意的是表中的Total并不等于前三行数据相加,因为前三行的数据并不是在同一个请求中采集到的,可能某个请求的网络延迟最短,但是系统处理时间又是最长的呢。所以Total是从整个请求所需要的时间的角度来统计的。这里可以看到最慢的一个请求花费了235ms,这个数据可以在下面的表中得到验证。
Percentage of the requests served within a certain time (ms)
50% 49
66% 51
75% 53
80% 54
90% 59
95% 62
98% 64
99% 163
100% 235 (longest request)
//这个表第一行表示有50%的请求都是在49ms内完成的,可以看到这个值是比较接近平均系统响应时间(第一个Time per request: 53.435 [ms] (mean) )
以此类推,90%的请求是小于等于59ms的。刚才我们看到响应时间最长的那个请求是235ms,那么显然所有请求(100%)的时间都是小于等于235毫秒的,也就是表中最后一行的数据肯定是时间最长的那个请求(longest request)。