基准测试工具(ab)

ab是什么?
ab是基于命令行的工具,均可运行在windows、linux平台下。
为什么选用这个工具?
易于使用,输入少量命令选项,即可得出结果,同时易于安装。

安装ab

win:如果本地有apache的开发环境,那么ab默认在apache目录下的bin目录下,打开bin目录可以看到
linux:直接yum install httpd-tools,安装即可

简单上手

直接敲入下面代码(注意切换ab所在的目录)
-c 10代表并发数是10
-n 10总共进行100次访问
后面接要访问的网址,切记不可缺少http://

D:\phpStudy\Apache\bin>ab -c 10 -n 1000 http://example.com/phpinfo.php

待ab自己跑一下,得出下面结果

#ab工具的描述,注意其中的版本号
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

#测试结果,共测试1000次,每100次显示访问进度,访问的网站是example.com
Benchmarking example.com (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/1.6.2       #服务器web软件
Server Hostname:        example.com       #主机地址
Server Port:            80                #访问端口

#文档信息
Document Path:          /phpinfo.php      #访问的文档
Document Length:        94804 bytes       #返回结果大小字节数(包含html,js,css,图片及响应中的所有内容字节数总和)

#链接信息
Concurrency Level:      10                #并发数,-c 10 设置了10个并发
Time taken for tests:   7.498 seconds     #总耗时,单位秒
Complete requests:      1000              #总共请求中已完成的请求总数的和
Failed requests:        219               #失败的请求数总和
   (Connect: 0, Receive: 0, Length: 219, Exceptions: 0)
Non-2xx responses:      9                 #未收到2xx系列成功的请求总数
Total transferred:      94135779 bytes    #整个请求总数中响应总数距的总大小字节数,包含头信息
HTML transferred:       93952076 bytes    #整个请求总数中正文内容的总大小字节
Requests per second:    133.36 [#/sec] (mean) #每秒支持的并发数,这里是每秒支持133.36个并发
Time per request:       74.984 [ms] (mean)    #完成一个请求的总耗时
Time per request:       7.498 [ms] (mean, across all concurrent requests) #完成所有并发请求中一个请求的总耗时
Transfer rate:          12259.83 [Kbytes/sec] received #每秒收到的字节总数(KB)

#测试的时间结果数据,留意Total一项,10个并发的情况下,完成一个请求,最小耗时(min)9毫秒,最大耗时(max)146毫秒
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.7      0      20
Processing:     9   74  22.2     68     146
Waiting:        6   73  22.1     67     143
Total:          9   74  22.2     68     146

#完成请求百分比,例如第一项,50%  68,代表一半的请求在68毫秒内完成,95% 129,代表1000的请求里,百分之九十八的请求在129毫秒里完成
Percentage of the requests served within a certain time (ms)
  50%     68
  66%     78
  75%     86
  80%     92
  90%    109
  95%    122
  98%    129
  99%    133
 100%    146 (longest request)

ab选项

输入下面命令得到ab帮助文档,该帮助文档,分别说明了用法和命令选项的含义

D:\phpStudy\Apache\bin>ab -h

ab帮助文档的输出

Usage: ab [options] [http://]hostname[:port]/path
Options are:
    -n requests     Number of requests to perform
    -c concurrency  Number of multiple requests to make at a time
    -t timelimit    Seconds to max. to spend on benchmarking
                    This implies -n 50000
    -s timeout      Seconds to max. wait for each response
                    Default is 30 seconds
    -b windowsize   Size of TCP send/receive buffer, in bytes
    -B address      Address to bind to when making outgoing connections
    -p postfile     File containing data to POST. Remember also to set -T
    -u putfile      File containing data to PUT. Remember also to set -T
    -T content-type Content-type header to use for POST/PUT data, eg.
                    'application/x-www-form-urlencoded'
                    Default is 'text/plain'
    -v verbosity    How much troubleshooting info to print
    -w              Print out results in HTML tables
    -i              Use HEAD instead of GET
    -x attributes   String to insert as table attributes
    -y attributes   String to insert as tr attributes
    -z attributes   String to insert as td or th attributes
    -C attribute    Add cookie, eg. 'Apache=1234'. (repeatable)
    -H attribute    Add Arbitrary header line, eg. 'Accept-Encoding: gzip'
                    Inserted after all normal header lines. (repeatable)
    -A attribute    Add Basic WWW Authentication, the attributes
                    are a colon separated username and password.
    -P attribute    Add Basic Proxy Authentication, the attributes
                    are a colon separated username and password.
    -X proxy:port   Proxyserver and port number to use
    -V              Print version number and exit
    -k              Use HTTP KeepAlive feature
    -d              Do not show percentiles served table.
    -S              Do not show confidence estimators and warnings.
    -q              Do not show progress when doing more than 150 requests
    -l              Accept variable document length (use this for dynamic pages)

    -g filename     Output collected data to gnuplot format file.
    -e filename     Output CSV file with percentages served
    -r              Don't exit on socket receive errors.
    -m method       Method name
    -h              Display usage information (this message)

英文看不懂,附上中文解释,网上抄的,我没试过

-n 即requests,用于指定压力测试总共的执行次数。
-c 即concurrency,用于指定压力测试的并发数。
-t 即timelimit,等待响应的最大时间(单位:秒)。
-b 即windowsize,TCP发送/接收的缓冲大小(单位:字节)。
-p 即postfile,发送POST请求时需要上传的文件,此外还必须设置-T参数。
-u 即putfile,发送PUT请求时需要上传的文件,此外还必须设置-T参数。
-T 即content-type,用于设置Content-Type请求头信息,例如:application/x-www-form-urlencoded,默认值为text/plain。
-v 即verbosity,指定打印帮助信息的冗余级别。
-w 以HTML表格形式打印结果。
-i 使用HEAD请求代替GET请求。
-x 插入字符串作为table标签的属性。
-y 插入字符串作为tr标签的属性。
-z 插入字符串作为td标签的属性。
-C 添加cookie信息,例如:"Apache=1234"(可以重复该参数选项以添加多个)。
-H 添加任意的请求头,例如:"Accept-Encoding: gzip",请求头将会添加在现有的多个请求头之后(可以重复该参数选项以添加多个)。
-A 添加一个基本的网络认证信息,用户名和密码之间用英文冒号隔开。
-P 添加一个基本的代理认证信息,用户名和密码之间用英文冒号隔开。
-X 指定使用的代理服务器和端口号,例如:"126.10.10.3:88"。
-V 打印版本号并退出。
-k 使用HTTP的KeepAlive特性。
-k 使用HTTP的KeepAlive特性。
-d 不显示百分比。
-S 不显示预估和警告信息。
-g 输出结果信息到gnuplot格式的文件中。
-e 输出结果信息到CSV格式的文件中。
-r 指定接收到错误信息时不退出程序。
-h 显示用法信息,其实就是ab -help。

一般用-n-c-t就好了
-n请求总数
-c并发数
-t指定秒数内的并发数

-t的用法说一下,下面的意思是在20秒内并发数10个访问

D:\phpStudy\Apache\bin> ab -c 10 -t 20 http://example.com/phpinfo.php
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking example.com (be patient)
Finished 3011 requests


Server Software:        nginx/1.6.2
Server Hostname:        example.com
Server Port:            80

Document Path:          /phpinfo.php
Document Length:        94804 bytes

Concurrency Level:      10
Time taken for tests:   20.006 seconds
Complete requests:      3011
Failed requests:        495
   (Connect: 0, Receive: 0, Length: 495, Exceptions: 0)
Non-2xx responses:      54
Total transferred:      280896464 bytes
HTML transferred:       280344222 bytes
Requests per second:    150.50 [#/sec] (mean)
Time per request:       66.444 [ms] (mean)
Time per request:       6.644 [ms] (mean, across all concurrent requests)
Transfer rate:          13711.44 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.5      0      10
Processing:     6   66  17.6     63     203
Waiting:        5   64  17.3     61     202
Total:          6   66  17.6     63     203

Percentage of the requests served within a certain time (ms)
  50%     63
  66%     69
  75%     72
  80%     75
  90%     82
  95%     92
  98%    113
  99%    125
 100%    203 (longest request)

特别说明:如果访问http://www.example.com/,没有指定特定文件,记得要加最后的那个/,一定要加!!!否则可能会出现访问不到的情况!!!

可能会影响基准测试的情况

  • 地理位置和网络问题

  • 响应文件大小

  • 代码的复杂度

  • 浏览器解析

  • Web服务器的配置

地理位置和网络问题

如果Web服务器存放在境外,那么我们从本地访问境外的网站,可想而知,经过的路由器结点,服务器结点,再通过太平洋海底的光缆,而后再访问到Web服务器,Web服务器处理后,再继续海底光缆,各个服务器、路由结点的跳转返回,这样的话肯定会影响到测试结果(我的建议是,直接在服务器上进行ab测试)

响应文件大小

假如发送一个3MB的页面,服务器网卡会把3MB的数据拆分成单个很小的数据包,传输过程中,只有一个数据包损坏或丢失,则会重新发送所有的数据包,所以发送的包越小越好,同时,越小的数据传输,越快传输到用户的机器上。

代码的复杂度

代码的复杂度即是对业务逻辑复杂的处理,还有对文件调用、数据库访问、远端API接口的调用等等都会影响处理时间

浏览器解析

每个浏览器都有自己对js、css、html的处理方法,想想IE8以下和chrome的区别即可知道

Web服务器设置

一般Web服务器安装后,简单设置,即可实现Web服务(开箱即用),但是这样的设置没有发挥Web服务器的最大性能,需要资深的工程师对服务器进行相关配置,使之发挥最大性能,这里简单实用Keep-Alive说明。
Keep-Alive的作用就是,Web服务器打开特定数量的连接,让这些连接处于打开状态,使之能快速处理传入的请求,这样就不会为每一个传入的请求打开一个连接然后处理请求,减少服务器的处理请求的进程数,从而增加并发数。
在ab中使用-k进行测试,例如下面这句

#-k,允许服务器保存5个并发连接处于打开并允许的状态,让其他请求快速处理,减少创建新请求的处理时间
ab -c 5 -t 100 -k http://www.example.com/

甄城
1.2k 声望34 粉丝