用ab进行性能测试

用ab进行性能测试



 

ab是Apache服务器自己带的性能测试工具,用它可以对指定的URL进行模拟访问,然后生成一份有关访问效率的报表,从中可以大概看出网站在高压力情况下的表现。

Windows下的ab.exe一般都在Apache安装目录的bin目录下。这里举几个我实际中用过的例子:

对http://localhost/dz7/index.php产生400次请求
ab -n 400 http://localhost/dz7/index.php
测试完成后,ab会输出测试的结果:

Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Finished 400 requests

Server Software:        Apache/2.2.11
Server Hostname:        localhost
Server Port:            80

Document Path:          /dz7/index.php
Document Length:        7015 bytes

Concurrency Level:      1
Time taken for tests:   21.623 seconds
Complete requests:      400
Failed requests:        399
   (Connect: 0, Receive: 0, Length: 399, Exceptions: 0)
Write errors:           0
Total transferred:      2968811 bytes
HTML transferred:       2805205 bytes
Requests per second:    18.50 [#/sec] (mean)
Time per request:       54.057 [ms] (mean)
Time per request:       54.057 [ms] (mean, across all concurrent requests)
Transfer rate:          134.08 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   1.3      0      16
Processing:    31   54  64.5     47    1265
Waiting:       16   51  64.3     47    1250
Total:         31   54  64.5     47    1265

Percentage of the requests served within a certain time (ms)
  50%     47
  66%     47
  75%     47
  80%     47
  90%     47
  95%     62
  98%    141
  99%    187
 100%   1265 (longest request)

参数-n设定请求的次数;另外,还可以用-c来设定并发访问数,例如要模拟50个并发访问,可以用
ab -n 400 -c 50 http://localhost/dz7/index.php

此外,还有一个实际的问题,就是如何用ab来模拟已登录的用户的访问。绝大部分程序的登录机制都是用Cookie+Session来实现的,浏览器在每次请求时都发送一个Cookie,里面记录了Session的SID。你可以先在利用Firefox的Firebug插件来确定Cookie里的内容是什么。

从中可以看到表示登录用户的内容是“QfI_sid=55ySsk”。ab可以用-C(大写的C)来设定每次请求用发送的Cookie。所以
ab -n 400 -c 50 -C "QfI_sid=55ySsk" http://localhost/dz7/index.php
就可以模拟已登录用户的400次访问,并发数为50的情况。

最后再透露一个绝技:
ab --help

 

 

 

 

 

 

 

 

 

 

 

 

 

详细介绍和用法: 

ApacheBench(ab)使用简介

  ApacheBench可以针对某一特定URL模拟出连续的联机请求,同时还可以仿真出同时间点个数相同的联机请求,因而利用 ApacheBench 可帮助我们在网站开发期间仿真实际上线可能的情况,利用仿真出来的数据做为调整服务器设定或程序的依据。

 

 

概要

 

ab [ -A auth-username ] [ -c concurrency ] [ -C cookie-name=value ] [ -d ] [ -e csv-file ] [ -g gnuplot-file ] [ -h ] [ -H custom-header ] [ -i ] [ -k ] [ -n requests ] [ -p POST-file ] [ -P proxy-auth-username ] [ -q ] [ -s ] [ -S ] [ -t timelimit ] [ -T content-type ] [ -v verbosity] [ -V ] [ -w ] [ -x <table>-attributes ] [ -X proxy[] ] [ -y <tr>-attributes ] [ -z <td>-attributes ] [http://]hostname[:port]/path

 

 

选项

 

-A auth-username:password 

对服务器提供BASIC认证信任。 用户名和密码由一个:隔开,并以base64编码形式发送。 无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。 

-c concurrency 

一次产生的请求个数。默认是一次一个。 

-C cookie-name=value 

对请求附加一个Cookie:行。 其典型形式是name=value的一个参数对。 此参数可以重复。 

-d 

不显示"percentage served within XX [ms] table"的消息(为以前的版本提供支持)。 

-e csv-file 

产生一个以逗号分隔的(CSV)文件, 其中包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以微妙为单位)时间。 由于这种格式已经“二进制化”,所以比'gnuplot'格式更有用。 

-g gnuplot-file 

把所有测试结果写入一个'gnuplot'或者TSV (以Tab分隔的)文件。 此文件可以方便地导入到Gnuplot, IDL, Mathematica, Igor甚至Excel中。 其中的第一行为标题。 

-h 

显示使用方法。 

-H custom-header 

对请求附加额外的头信息。 此参数的典型形式是一个有效的头信息行,其中包含了以冒号分隔的字段和值的对 (如, "Accept-Encoding: zip/zop;8bit"). 

-i 

执行HEAD请求,而不是GET。 

-k 

启用HTTP KeepAlive功能,即, 在一个HTTP会话中执行多个请求。 默认时,不启用KeepAlive功能. 

-n requests 

在测试会话中所执行的请求个数。 默认时,仅执行一个请求,但通常其结果不具有代表意义。 

-p POST-file 

包含了需要POST的数据的文件. 

-P proxy-auth-username:password 

对一个中转代理提供BASIC认证信任。 用户名和密码由一个:隔开,并以base64编码形式发送。 无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。 

-q 

如果处理的请求数大于150, ab每处理大约10%或者100个请求时,会在stderr输出一个进度计数。 此-q标记可以抑制这些信息。 

-s 

用于编译中(ab -h会显示相关信息)使用了SSL的受保护的https, 而不是http协议的时候。此功能是实验性的,也是很简陋的。最好不要用。 

-S 

不显示中值和标准背离值, 而且在均值和中值为标准背离值的1到2倍时,也不显示警告或出错信息。 默认时,会显示 最小值/均值/最大值等数值。(为以前的版本提供支持). 

-t timelimit 

测试所进行的最大秒数。其内部隐含值是-n 50000。 它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。 

-T content-type 

POST数据所使用的Content-type头信息。 

-v verbosity 

设置显示信息的详细程度 - 4或更大值会显示头信息, 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。 

-V 

显示版本号并退出。 

-w 

以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。 

-x <table>-attributes 

设置<table>属性的字符串。 此属性被填入<table 这里 >. 

-X proxy[:port] 

对请求使用代理服务器。 

-y <tr>-attributes 

设置<tr>属性的字符串. 

-z <td>-attributes 

设置<td>属性的字符串. 

 

缺陷

程序中有各种静态声明的固定长度的缓冲区。 另外,对命令行参数、服务器的响应头和其他外部输入的解析也很简单,这可能会有不良后果。

 

它没有完整地实现HTTP/1.x; 仅接受某些'预想'的响应格式。 strstr(3)的频繁使用可能会带来性能问题,即, 你可能是在测试ab而不是服务器的性能。

 

 

例子:

得到结果类似于(后面#为中文翻译):

 

Server Software:        Apache/2.0.55

Server Hostname:        localhost

Server Port:            80

 

Document Path:          /1.php

Document Length:        82522 bytes  #请求文档大小

 

Concurrency Level:      50           #并发数  

Time taken for tests:   92.76140 seconds #全部请求完成耗时

Complete requests:      10000          #全部请求数

Failed requests:        1974           #失败的请求

   (Connect: 0, Length: 1974, Exceptions: 0)

Write errors:           0

Total transferred:      827019400 bytes #总传输大小

HTML transferred:       825219400 bytes 

Requests per second:    108.61 [#/sec] (mean) #每秒请求数(平均)

Time per request:       460.381 [ms] (mean) #每次并发请求时间(所有并发)

Time per request:       9.208 [ms] (mean, across all concurrent requests)                              #每一请求时间(并发平均)   

Transfer rate:          8771.39 [Kbytes/sec] received #传输速率

 

Connection Times (ms) #连接时间

              min  mean[+/-sd] median   max

Connect(#连接):        0    0   2.1      0      46

Processing(#处理):    31  458  94.7    438    1078

Waiting(#等待):       15  437  87.5    422     938

Total:         31  458  94.7    438    1078

你可能感兴趣的:(性能测试)