一 AB背景介绍
Apache附带的压力测试工具apache bench--简称ab,非常容易使用,并且完全可以摸你各种条件对Web服务器发起测试请求。ab可以直接在Web服务器本地发起测试请求,这对于需要了解服务器的处理性能至关重要,因为它不包括数据的网络传输时间以及用户PC本地的计算时间。
ab
is a tool for benchmarking your Apache Hypertext Transfer Protocol (HTTP) server. It is designed to give you an impression of how your current Apache installation performs. This especially shows you how many requests per second your Apache installation is capable of serving. - See more at: http://www.rickyzhu.com/129_quick-introduce-to-ab.html#sthash.SeO8xgfH.dpuf
支持的参数和参数的介绍如下:
ab [ -A auth-username:password ] [ -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:password ] [ -q ] [ -s ] [ -S ] [ -t timelimit ] [ -T content-type ] [ -v verbosity] [ -V ] [ -w ] [ -x <table>-attributes ] [ -X proxy[:port] ] [ -y <tr>-attributes ] [ -z <td>-attributes ] [http://]hostname[:port]/path
ab的参数详细解释
普通的测试,使用-c -n参数配合就可以完成任务
格式: ./ab [options] [http://]hostname[:port]/path
参数:
-n 测试的总请求数。默认时,仅执行一个请求
-c 一次并发请求个数。默认是一次一个。
-H 添加请求头,例如 ‘Accept-Encoding: gzip’,以gzip方式请求。
-t 测试所进行的最大秒数。其内部隐含值是-n 50000。它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
-p 包含了需要POST的数据的文件.
-T POST数据所使用的Content-type头信息。
-v 设置显示信息的详细程度 – 4或更大值会显示头信息, 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。 -V 显示版本号并退出。
-w 以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。
-i 执行HEAD请求,而不是GET。
-C -C cookie-name=value 对请求附加一个Cookie:行。 其典型形式是name=value的一个参数对。此参数可以重复。
本文介绍AB的获取安装及应用实例。
二 AB的获取和安装
1 系统安装Apache,可以在/usr/bin路径下找到ab,或者whereis ab即可发现。
2 单独安装ab http://www.netingcn.com/install-ab-without-httpd.html
ab运行需要依赖apr-util包,安装命令为:yum install apr-util
下载apache的rpm包,可以直接去官网手动下载,当然也可以使用命令yumdownloader来完成,yumdownloader是 yum-utils包下面的,如果没有安装yum-utils,则需要先安装它。因为解压apache的rpm包时会在当前目录下生成etc、var和 usr三个目录,所以建议先创建一个临时目录,命令如下:
mkdir ~/abtmp cd ~/abtmp yumdownloader httpd rpm2cpio httpd-*.rpm | cpio -idmv
上述命令成功后,可以在~/abtmp下的usr/bin中看到一个名为ab的文件,复制到系统PATH下就大功告成,例如。
cp ~/abtmp/usr/bin/ab /usr/bin
可使用系统:win7 Linux 等等
三 实例
1 web的http请求,e.g. ab -n 100 -c 5 http://baidu.com/
#-n 请求的总执行次数; -c 并发数 "http://baidu.com/" 待测url
[work@bjdhj-118-56 ~]$ ab -n 100 -c 5 http://baidu.com/
#首先是Apache的版本信息 This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Copyright 2006 The Apache Software Foundation, http://www.apache.org/ Benchmarking baidu.com (be patient).....done Server Software: Apache Server Hostname: baidu.com #请求的服务 Server Port: 80 #请求端口 Document Path: / # Document Length: 81 bytes #页面长度 Concurrency Level: 5 #并发数 Time taken for tests: 0.125373 seconds #总耗时 Complete requests: 100 #总访问次数 Failed requests: 0 #注1 Write errors: 0 Total transferred: 37600 bytes #总共传输字节数,包含http的头信息等 HTML transferred: 8100 bytes #html字节数,实际的页面传递字节数 Requests per second: 797.62 [#/sec] (mean) #每秒多少请求,这个是非常重要的参数数值,服务器的吞吐量 Time per request: 6.269 [ms] (mean) #用户平均请求等待时间 Time per request: 1.254 [ms] (mean, across all concurrent requests) #服务器平均处理时间,也就是服务器吞吐量的倒数 Transfer rate: 287.14 [Kbytes/sec] received #每秒获取的数据长度 Connection Times (ms) min mean[+/-sd] median max Connect: 1 1 0.4 1 3 Processing: 3 4 1.2 4 12 Waiting: 3 3 1.3 4 11 Total: 5 5 1.3 5 13 Percentage of the requests served within a certain time (ms) 50% 5 # 50%的请求在5ms内返回 66% 6 75% 6 80% 6 90% 6 95% 8 98% 11 99% 13 100% 13 (longest request)
四 测试过程中会出现以下这些错误
1)ab并发数不能大于请求数,会提示 :"ab: Cannot use concurrency level greater than total number of requests"
2)请求数默认不能超过1024个,会提示:"socket: Too many open files (24)"
可用ulimit -n命令修改,例如:ulimit -n 8192 (设置用户可以同时打开的最大文件数)。
3)并发数默认不能大于20000个,会提示"ab: Invalid Concurrency [Range 0..20000]"
需要修改apache源代码support目录下ab.c文件,找到:#define MAX_CONCURRENCY 20000 将宏定义的值改大,重新编译安装apache。
4)提示:"apr_socket_recv: Connection reset by peer (104)"网上说是apr-util有些问题,不太稳定,多试几次就好了。
5)问题:关于Failed Request,为什么会有失败的请求?这个数据是什么含义?是否影响rps等测试结果。
答:可检查文件长度,如下,Length*complete+http头信息≈Total,说明所有请求正确发出 Document Length: 35137 bytes Complete requests: 100 Total transferred: 3543782 bytes 在出现Failed Request时,会给出一行要求失败的各原因的数据统计,分别代表的意义: Connect 无法送出要求、目标主机连接失败、要求的过程中连线被中断 Receive 无法接收要求 Length 回应的内容长度不一致 ( 以 Content-Length 标头值为判断依据 ) Exception 发生无法预期的错误 当第2次以后的HTTP Request所得到的HTTP Response Header得到的Content-Length与第一次不一致,就会得到Length的错误,并不影响测试结果。
6)问题:结果得到两个response time,相差很大,这两个数据自个什么意思?
答:解释如下。 ab有一个-c n参数,就是第一行的Concurrency Level,可以让ab创建n个并发链接测试。它们关系是:Tpr1=Tpr2*n ,Tpr2=1/Rps The first value is calculated with the formula concurrency *timetaken * 5/done while the second value is calculated with the formula timetaken * 5 前一个衡量单个请求的延迟,cpu是分时间片轮流执行请求的,多并发的情况下,一个并发上的请求时需要等待这么长时间才能得到下一个时间片,计算方法Time per request: 60.444 [ms] (mean, across all concurrent requests)*并发数。通俗点说就是当以-c 10的并发下完成-n 1000个请求的同时,额外加入一个请求,完成这个求平均需要的时间。 后一个衡量性能的标准,它反映了完成一个请求需要的平均时间,在当前的并发情况下,增加一个请求需要的时间。计算方法Time taken for tests: 60.444 seconds/Complete requests: 1000,通俗点说就是当以-c 10的并发下完成-n 1001个请求时,比完成-n1000个请求多花的时间。 可以适当调节-c 和-n大小来测试服务器性能,借助htop指令来直观的查看机器的负载情况。