在Apache服务器的套件中,有一个叫做 ab (ApacheBench) 的工具。
ApacheBench 主要是用来测试Apache服务器执行效率用的
ApacheBench 可以针对某个特定的 URL 仿真出连续的联机请求
同时还可以仿真出同时间点数个相同的联机请求,因此利用 ApacheBench 可帮助我们在网站开发期间仿真实际上线可能的情况,利用仿真出来的数据做为调整服务器设定或程序的依据。
参数说明
01 |
bixiaopeng@172-13-3-157 ~$ ab -h |
02 |
Usage: ab [options] [http[s]: // ] hostname [:port] /path |
04 |
//-n 在测试会话中所执行的请求个数。默认时,仅执行一个请求 |
05 |
-n requests Number of requests to perform |
06 |
//-c 一次产生的请求个数。默认是一次一个。 |
07 |
-c concurrency Number of multiple requests to make |
08 |
//-t 测试所进行的最大秒数。其内部隐含值是-n 50000。它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。 |
09 |
-t timelimit Seconds to max. wait for responses |
11 |
-b windowsize Size of TCP send /receive buffer, in bytes |
13 |
-p postfile File containing data to POST. Remember also to set -T |
15 |
-u putfile File containing data to PUT. Remember also to set -T |
16 |
//-T POST数据所使用的Content- type 头信息。 |
17 |
-T content- type Content- type header for POSTing, eg. |
18 |
'application/x-www-form-urlencoded' |
19 |
Default is 'text/plain' |
20 |
//-v 设置显示信息的详细程度 - 4或更大值会显示头信息, 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。 -V 显示版本号并退出。 |
21 |
- v verbosity How much troubleshooting info to print |
22 |
//-w 以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。 |
23 |
-w Print out results in HTML tables |
25 |
-i Use HEAD instead of GET |
26 |
-x attributes String to insert as table attributes |
27 |
-y attributes String to insert as tr attributes |
28 |
-z attributes String to insert as td or th attributes |
29 |
//-C cookie-name=value 对请求附加一个Cookie:行。 其典型形式是name=value的一个参数对。此参数可以重复。 |
30 |
-C attribute Add cookie, eg. 'Apache=1234. (repeatable) |
31 |
-H attribute Add Arbitrary header line, eg. 'Accept-Encoding: gzip' |
32 |
Inserted after all normal header lines. (repeatable) |
33 |
-A attribute Add Basic WWW Authentication, the attributes |
34 |
are a colon separated username and password. |
35 |
//-P proxy-auth-username:password 对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。 |
36 |
-P attribute Add Basic Proxy Authentication, the attributes |
37 |
are a colon separated username and password. |
38 |
-X proxy:port Proxyserver and port number to use |
39 |
-V Print version number and exit |
40 |
-k Use HTTP KeepAlive feature |
41 |
-d Do not show percentiles served table. |
42 |
-S Do not show confidence estimators and warnings. |
43 |
-g filename Output collected data to gnuplot format file . |
44 |
-e filename Output CSV file with percentages served |
45 |
-r Don't exit on socket receive errors. |
46 |
-h Display usage information (this message) |
47 |
-Z ciphersuite Specify SSL /TLS cipher suite (See openssl ciphers) |
48 |
-f protocol Specify SSL /TLS protocol (SSL2, SSL3, TLS1, or ALL) |
50 |
//-attributes 设置 属性的字符串. 缺陷程序中有各种静态声明的固定长度的缓冲区。另外,对命令行参数、服务器的响应头和其他外部输入的解析也很简单,这可能会有不良后果。它没有完整地实现 HTTP /1 .x; 仅接受某些 '预想' 的响应格式。 strstr(3)的频繁使用可能会带来性能问题,即, 你可能是在测试ab而不是服务器的性能。 |
举个栗子
参数很多,一般我们用 -c 和 -n 参数就可以了. 例如:
01 |
bixiaopeng@bixiaopengtekiMacBook-Pro ~$ ab -c 10 -n 1000 http: //www .wirelessqa.com/?p=143 |
02 |
This is ApacheBench, Version 2.3 <$Revision: 655654 $> |
03 |
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http: //www .zeustech.net/ |
04 |
Licensed to The Apache Software Foundation, http: //www .apache.org/ |
07 |
Benchmarking www.wirelessqa.com (be patient) |
08 |
Completed 100 requests |
09 |
Completed 200 requests |
10 |
Completed 300 requests |
11 |
Completed 400 requests |
12 |
Completed 500 requests |
13 |
Completed 600 requests |
14 |
Completed 700 requests |
15 |
Completed 800 requests |
16 |
Completed 900 requests |
17 |
Completed 1000 requests |
18 |
Finished 1000 requests |
24 |
Server Hostname: www.wirelessqa.com |
28 |
Document Path: /?p=143 |
29 |
Document Length: 40865 bytes |
33 |
Time taken for tests: 349.234 seconds |
34 |
Complete requests: 1000 |
36 |
(Connect: 0, Receive: 0, Length: 674, Exceptions: 0) |
38 |
Total transferred: 41114189 bytes |
39 |
HTML transferred: 40889965 bytes |
40 |
Requests per second: 2.86 [ |
41 |
Time per request: 3492.343 [ms] (mean) |
42 |
Time per request: 349.234 [ms] (mean, across all concurrent requests) |
43 |
Transfer rate: 114.97 [Kbytes /sec ] received |
47 |
min mean[+ /-sd ] median max |
48 |
Connect: 35 161 401.6 59 3394 |
49 |
Processing: 571 3282 2723.1 2648 28374 |
50 |
Waiting: 309 654 767.3 538 21420 |
51 |
Total: 610 3443 2777.4 2826 28514 |
54 |
Percentage of the requests served within a certain time (ms) |
63 |
100% 28514 (longest request) |
结果:在同一时间有10个访问请求的情况下,完成1000次请求,失败674次,共花时间349.234秒,这个页面每秒平均处理2.86个请求
具体分析
01 |
//-c 每次发送10个,-n 共发送1000次请求 |
03 |
bixiaopeng@bixiaopengtekiMacBook-Pro ~$ ab -c 10 -n 1000 http: //www .wirelessqa.com/?p=143 |
04 |
This is ApacheBench, Version 2.3 <$Revision: 655654 $> |
05 |
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http: //www .zeustech.net/ |
06 |
Licensed to The Apache Software Foundation, http: //www .apache.org/ |
08 |
Benchmarking www.wirelessqa.com (be patient) |
09 |
Completed 100 requests |
10 |
Completed 200 requests |
11 |
Completed 300 requests |
12 |
Completed 400 requests |
13 |
Completed 500 requests |
14 |
Completed 600 requests |
15 |
Completed 700 requests |
16 |
Completed 800 requests |
17 |
Completed 900 requests |
18 |
Completed 1000 requests |
19 |
Finished 1000 requests |
24 |
Server Hostname: www.wirelessqa.com |
29 |
Document Path: /?p=143 |
31 |
Document Length: 40865 bytes |
36 |
Time taken for tests: 349.234 seconds |
38 |
Complete requests: 1000 |
40 |
//Failed requests给出了失败原因统计: |
41 |
//Connect :无法送出请求,目标主机连接失败,要求过程中连线被中断 |
42 |
//Length :回应的内容长度不一致,以content-Length头文件为判断依据 |
43 |
//Exception :发生了无法预期的错误 |
44 |
// 备注1:这里分析一下为何失败了674次,从下面的统计数据我们可以看出,失败请求都落在Length上面,原因是被测网页是动态内容,当第一次发出HTTP request与后面发出的HTTP request所响应的html Length是不同大小的(即每次响应的Content-Length大小不一致),所以才会引起Length失败,这里Length是以第一次取得的Content-Length为主,以后得到的Content-Length跟第一次的不一致,就会报Length错误,所以这类Length大小不一的失败在测试动态面面的压力测试中是合理的,可以不用管它。 |
46 |
(Connect: 0, Receive: 0, Length: 674, Exceptions: 0) |
50 |
Total transferred: 41114189 bytes |
52 |
// 备注2:单个html文件的大小为40865,共发出1000次请求,40865000跟40889965差不多,所以1000次请求应该已经正确送出,没什么问题 |
53 |
HTML transferred: 40889965 bytes |
54 |
// 关键指标之一,相当于 LR 中的 每秒事务数 ,后面括号中的 mean 表示这是一个平均值 |
55 |
Requests per second: 2.86 [ |
56 |
// 关键指标之二,相当于 LR 中的 平均事务响应时间 ,后面括号中的 mean 表示这是一个平均值 |
57 |
Time per request: 3492.343 [ms] (mean) |
58 |
// 每个请求实际运行时间的平均值,就是上面的时间 除以并发数 |
59 |
Time per request: 349.234 [ms] (mean, across all concurrent requests) |
62 |
// 平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题 |
63 |
Transfer rate: 114.97 [Kbytes /sec ] received |
67 |
min mean[+ /-sd ] median max |
68 |
Connect: 35 161 401.6 59 3394 |
69 |
Processing: 571 3282 2723.1 2648 28374 |
70 |
Waiting: 309 654 767.3 538 21420 |
71 |
Total: 610 3443 2777.4 2826 28514 |
73 |
// 整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间,其中50%的用户响应时间小于2826 毫秒,66% 的用户响应时间小于3636 毫秒,最大的响应时间小于28514毫秒 |
74 |
Percentage of the requests served within a certain time (ms) |
75 |
50% 2826 // 就是有50%的请求都是在2826ms内完成的 |
83 |
100% 28514 (longest request) |