服务器负载太大而影响程序效率是很常见的,Apache服务器自带有一个叫ab(ApacheBench)的工具,在bin目录下。ab专门用于HTTP Server的benchmark testing,可以同时模拟多个并发请求,使用这个轻巧的工具我们可以对服务器进行负载测试。
今天在公司也用它作一些测试,现在整理了下它的一些东西分享下。
首先我们要得到Apache服务器的目录下bin的路径,我电脑中的路径是D:\wamp\bin\apache\Apache2.2.21\bin,打开cmd,转到这个目录下,在其中输入:ab -n 10 -c 10 https://www.jb51.net/ 这条指令,这条指令的意思是:ab -n 全部请求数 -c 并发数 测试URL。这里值得注意的是,如果你的测试URL是一个网站的网址,请记得在其后加上/,否则会无法工作。
http
ab -n 10 -c 10 http://www.jb51.net/
https
abs -n 10 -c 10 https://www.jb51.net/
默认 get
ab -c 10 -n 10 http://www.test.api.com/?gid=2
post
ab -n 100 -c 10 -p ‘post.txt‘ -T ‘application/x-www-form-urlencoded‘ ‘http://test.api.com/ttk/auth/info/‘
注:post.txt 是一个文件可指定目录和文件名里面的格式是:
cid=4&status=1
输入参数相应解释
-n 测试会话中所执行的请求个数,默认仅执行一个请求 -c 一次产生的请求个数,即同一时间发出多少个请求,默认为一次一个 -t 测试所进行的最大秒数,默认为无时间限制....其内部隐含值是[-n 50000],它可以使对服务器的测试限制在一个固定的总时间以内 -p 包含了需要POST的数据的文件 -T POST数据所使用的Content-type头信息 -v 设置显示信息的详细程度 -w 以HTML表格的形式输出结果,默认是白色背景的两列宽度的一张表 -i 以HTML表格的形式输出结果,默认是白色背景的两列宽度的一张表 -x 设置<table>属性的字符串,此属性被填入<table 这里> -y 设置<tr>属性的字符串 -z 设置<td>属性的字符串 -C 对请求附加一个Cookie行,其典型形式是name=value的参数对,此参数可以重复 -H 对请求附加额外的头信息,此参数的典型形式是一个有效的头信息行,其中包含了以冒号分隔的字段和值的对(如"Accept-Encoding: zip/zop;8bit") -A HTTP验证,用冒号:分隔传递用户名及密码 -P 无论服务器是否需要(即是否发送了401认证需求代码),此字符串都会被发送 -X 对请求使用代理服务器 -V 显示版本号并退出 -k 启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求,默认为不启用KeepAlive功能 -d 不显示"percentage served within XX [ms] table"的消息(为以前的版本提供支持) -S 不显示中值和标准背离值,且均值和中值为标准背离值的1到2倍时,也不显示警告或出错信息,默认会显示最小值/均值/最大值等(为以前的版本提供支持) -g 把所有测试结果写入一个‘gnuplot‘或者TSV(以Tab分隔的)文件 -e 产生一个以逗号分隔的(CSV)文件,其中包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以微妙为单位)时间 -h 显示使用方法 -k 发送keep-alive指令到服务器端
以下是我运行的结果:
This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking www.jb51.net (be patient)…..done Server Software: Microsoft-IIS/6.0 //Microsoft-IIS服务器版本6.0 Server Hostname: www.jb51.net //服务器主机名 Server Port: 80 //服务器端口 Document Path: / //测试的页面文档 Document Length: 32639 bytes //文档大小 Concurrency Level: 10 //并发数 Time taken for tests: 13.548 seconds //整个测试持续的时间 Complete requests: 10 //完成的请求数量 Failed requests: 0 //失败的请求数量 Write errors: 0 Total transferred: 331070 bytes //整个场景中的网络传输量 HTML transferred: 326390 bytes //整个场景中的HTML内容传输量 Requests per second: 0.74 [#/sec] (mean) //每秒事务数 ,后面括号中的 mean 表示这是一个平均值 Time per request: 13547.775 [ms] (mean) //平均事务响应时间 ,后面括号中的 mean 表示这是一个平均值 Time per request: 1354.777 [ms] (mean, across all concurrent requests) //每个请求实际运行时间的平均值 Transfer rate: 23.86 [Kbytes/sec] received //平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题 Connection Times (ms) //网络上消耗的时间的分解 min mean[+/-sd] median max Connect: 1 2 0.8 2 3 Processing: 2163 3981 3420.2 2957 13540 Waiting: 1305 3204 3595.3 2096 13169 Total: 2164 3983 3420.0 2959 13541 //以下是整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间,其中50%的用户响应时间小于2959毫秒,66% 的用户响应时间小于3074毫秒,最大的响应时间小于13541 毫秒。由于对于并发请求,cpu实际上并不是同时处理的,而是按照每个请求获得的时间片逐个轮转处理的,所以基本上第一个Time per request时间约等于第二个Time per request时间乘以并发请求数。 Percentage of the requests served within a certain time (ms) 50% 2959 66% 3074 75% 3974 80% 4008 90% 13541 95% 13541 98% 13541 99% 13541 100% 13541 (longest request)
下面来逐行解释我的理解,以下注释部分有查阅网上资料,但所写内容均为自己理解之后手打内容,希望加入自己的理解之后能让读者更容易理解。
bogon:~ tang$ ab -n 100 -c 10 https://www.baidu.com/index.html
This is ApacheBench, Version 2.3 <$Revision: 1706008 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
//以上为apache的版本信息,与本次测试无关
Benchmarking www.baidu.com (be patient).....done
//以上内容显示测试完成度,本次测试发起请求数量较少,完成较快,无中间过程显示。在请求数量很多时会分行显示当前完成数量。
Server Software: bfe/1.0.8.14 //被测试的服务器所用的软件信息,这里使用的是百度自己开发的反向代理Baidu Front End,类似nginx。
Server Hostname: www.baidu.com //被测主机名
Server Port: 443 //被测主机的服务端口号,一般http请求的默认端口号是80,https默认使用443端口
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128 //加密协议
Document Path: /index.html //请求的具体文件
Document Length: 227 bytes //请求的文件index.html大小
Concurrency Level: 10 //并发级别,也就是并发数,请求中-c参数指定的数量
Time taken for tests: 1.093 seconds //本次测试总共花费的时间
Complete requests: 100 //本次测试总共发起的请求数量
Failed requests: 0 //失败的请求数量。因网络原因或服务器性能原因,发起的请求并不一定全部成功,通过该数值和Complete requests相除可以计算请求的失败率,作为测试结果的重要参考。
Total transferred: 103314 bytes //总共传输的数据量,指的是ab从被测服务器接收到的总数据量,包括index.html的文本内容和请求头信息。
HTML transferred: 22700 bytes //从服务器接收到的index.html文件的总大小,等于Document Length*Complete requests=227 bytes*100=22700 bytes
Requests per second: 91.50 [#/sec] (mean) //平均(mean)每秒完成的请求数:QPS,这是一个平均值,等于Complete requests/Time taken for tests=100/1.093=91.50
Time per request: 109.287 [ms] (mean) //从用户角度看,完成一个请求所需要的时间(因用户数量不止一个,服务器完成10个请求,平均每个用户才接收到一个完整的返回,所以该值是下一项数值的10倍。)
Time per request: 10.929 [ms] (mean, across all concurrent requests)// 服务器完成一个请求的时间。
Transfer rate: 92.32 [Kbytes/sec] received //网络传输速度。对于大文件的请求测试,这个值很容易成为系统瓶颈所在。要确定该值是不是瓶颈,需要了解客户端和被测服务器之间的网络情况,包括网络带宽和网卡速度等信息。
Connection Times (ms)
min mean[+/-sd] median max
Connect: 47 74 12.9 74 106
Processing: 9 32 20.2 32 106
Waiting: 9 29 19.1 27 98
Total: 66 106 20.8 106 195
//这几行组成的表格主要是针对响应时间也就是第一个Time per request进行细分和统计。一个请求的响应时间可以分成网络链接(Connect),系统处理(Processing)和等待(Waiting)三个部分。表中min表示最小值; mean表示平均值;[+/-sd]表示标准差(Standard Deviation) ,也称均方差(mean square error),这个概念在中学的数学课上学过,表示数据的离散程度,数值越大表示数据越分散,系统响应时间越不稳定。 median表示中位数; max当然就是表示最大值了。
//需要注意的是表中的Total并不等于前三行数据相加,因为前三行的数据并不是在同一个请求中采集到的,可能某个请求的网络延迟最短,但是系统处理时间又是最长的呢。所以Total是从整个请求所需要的时间的角度来统计的。这里可以看到最慢的一个请求花费了195ms,这个数据可以在下面的表中得到验证。
Percentage of the requests served within a certain time (ms)
50% 106
66% 109
75% 111
80% 114
90% 118
95% 154
98% 176
99% 195
100% 195 (longest request)
//这个表第一行表示有50%的请求都是在106ms内完成的,可以看到这个值是比较接*均系统响应时间(第一个Time per request: 109.287 [ms] (mean) )
以此类推,90%的请求是小于等于118ms的。刚才我们看到响应时间最长的那个请求是195ms,那么显然所有请求(100%)的时间都是小于等于195毫秒的,也就是表中最后一行的数据肯定是时间最长的那个请求(longest request)。