ab test压力测试
之前做性能调试的时候一直用的JMeter压测,最近发现一款简单易用的压力测试工具。 ab(Apache benchmark)是一款常用的压力测试工具,是Apache附带的一个小工具 , 专门用于HTTP Server的benchmark testing,可以同时模拟多个并发请求。
v基础知识
ab的原理:ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的,因此,它既可以用来测试apache的负载压力,也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。ab命令对发出负载的计算机要求很低,它既不会占用很高CPU,也不会占用很多内存。但却会给目标服务器造成巨大的负载,其原理类似CC攻击。自己测试使用也需要注意,否则一次上太多的负载。可能造成目标服务器资源耗完,严重时甚至导致死机。
先介绍几个性能指标。
吞吐率:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。
并发连接数:某一时刻服务器所接受的请求数(会话数)。
并发用户数:某一时刻服务器所接受的连接数,一个用户可能同时产生多个连接。
用户平均请求等待时间:总请求数 / 并发用户数。
服务器平均请求等待时间:处理完成所有请求数所花费的时间 / 总请求数。
PV: 即page view,页面浏览量,用户每一次对网站中的每个页面访问均被记录1次。用户对同一页面的多次刷新,访问量累计。
UV:即Unique visitor,独立访客,通过客户端的cookies实现。即同一页面,客户端多次点击只计算一次,访问量不累计。
IP: 即Internet Protocol,本意本是指网络协议,在数据统计这块指通过ip的访问量。即同一页面,客户端使用同一个IP访问多次只计算一次,访问量不累计。
TPS:即Transactions Per Second的缩写,每秒处理的事务数目。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,最终利用这些信息作出的评估分。
QPS:即Queries Per Second的缩写,每秒能处理查询数目。是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。QPS=并发量 / 平均响应时间
RPS:即Requests Per Second的缩写,每秒能处理的请求数目。等效于QPS
vWindows安装ab test
1.1 下载地址
https://www.apachehaus.com/cgi-bin/download.plx
1.2 解压
用CMD命令行打开解压后的bin目录路径。
1.3 测试
ab -n 100 -c 10 http://toutou.com:8301/user/get?uid=1
-n 表示请求数,-c 表示并发数. -t 表示多少s内并发和请求
上面的命令测试总次数为100,并发数为10(相当于10个用户同时访问,他们总共访问100次)。
在解析返回结果之前,我们先来看看如果宿主机由Windows换成Linux后,如何在Linux上使用ab test。
vLinux安装ab test
2.1 安装ab test
yum -y install httpd-tools
ab -V
2.2 测试
v参数/返回结果
3.1 参数
用法:ab [选项] 地址
Usage: ab [options] [http[s]://]hostname[:port]/path
-n requests #执行的请求数,即一共发起多少请求。 -c concurrency #请求并发数。 -t timelimit #测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。 -s timeout #指定每个请求的超时时间,默认是30秒。 -b windowsize #指定tcp窗口的大小,单位是字节。 -B address #指定在发起连接时绑定的ip地址是什么。 -p postfile #指定要POST的文件,同时要设置-T参数。 -u putfile #指定要PUT的文件,同时要设置-T参数。 -T content-type #指定使用POST或PUT上传文本时的文本类型,默认是'text/plain'。 -v verbosity #设置详细模式等级。 -w #将结果输出到html的表中。 -i #使用HEAD方式代替GET发起请求。 -y attributes #以表格方式输出时,设置html表格tr属性。 -z attributes #以表格方式输出时,设置html表格th或td属性。 -C attribute #添加cookie,比如'Apache=1234'。(可重复) -H attribute #为请求追加一个额外的头部,比如'Accept-Encoding: gzip'。(可重复) -A attribute #对服务器提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即,是否发送了401认证需求代码),此字符串都会被发送。 -P attribute #对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。 -X proxy:port #指定代理服务器的IP和端口。 -V #打印版本信息。 -k #启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求。默认时,不启用KeepAlive功能。 -d #不显示"percentage served within XX [ms] table"的消息(为以前的版本提供支持)。 -q #如果处理的请求数大于150,ab每处理大约10%或者100个请求时,会在stderr输出一个进度计数。此-q标记可以抑制这些信息。 -g filename #把所有测试结果写入一个'gnuplot'或者TSV(以Tab分隔的)文件。此文件可以方便地导入到Gnuplot,IDL,Mathematica,Igor甚至Excel中。其中的第一行为标题。 -e filename #产生一个以逗号分隔的(CSV)文件,其中包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以微妙为单位)时间。由于这种格式已经“二进制化”,所以比'gnuplot'格式更有用。 -r #当收到错误时不要退出。 -h #输出帮助信息 -Z ciphersuite 指定SSL/TLS密码套件 -f protocol 指定SSL/TLS协议(SSL3, TLS1, TLS1.1, TLS1.2 or ALL)
3.2 返回结果
以上文中Linux ab test的结果集为例:
[root@localhost ~]# ab -n 100 -c 10 http://toutou.com:8301/user/get?uid=1This is ApacheBench, Version 2.3 <$Revision: 1430300 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking toutou.com (be patient).....done#测试服务器的名字Server Software: #请求的URL主机名 Server Hostname: toutou.com#web服务器监听的端口Server Port: 8301 #请求的URL中的根绝对路径Document Path: /user/get?uid=1#HTTP响应数据的正文长度Document Length: 131 bytes# 并发用户数,这是ab命令中设置的-c参数Concurrency Level: 10 #所有这些请求被处理完成所花费的总时间Time taken for tests: 1.274 seconds# 总请求数量,这是ab命令中设置的-n参数Complete requests: 100 # 失败的请求数,这里的失败是指请求的连接服务器、发送数据、接收数据等环节发生异常,以及无响应后超时的情况。对于超时时间的设置可以用ab的-t参数。如果接受到的http响应数据的头信息中含有2xx以外的状态码,则会在测试结果显示另一个名为“Non-2xx responses”的统计项,用于统计这部分请求数,这些请求并不算是失败的请求。Failed requests: 0#写入错误Write errors: 0# 总的网络传输量(字节数),包含http的头信息等。使用ab的-v参数即可查看详细的http头信息。Total transferred: 25000 bytes# HTML内容传输量,实际的页面传递字节数。也就是减去了Total transferred中http响应数据中头信息的长度。HTML transferred: 13100 bytes# 每秒处理的请求数,服务器的吞吐量,等于:Complete requests / Time taken for tests(QPS)Requests per second: 78.48 [#/sec] (mean)# 用户平均请求等待时间Time per request: 127.425 [ms] (mean)# 服务器平均处理时间Time per request: 12.743 [ms] (mean, across all concurrent requests)# 平均每秒网络上的流量,即每秒收到的速率Transfer rate: 19.16 [Kbytes/sec] received # 压力测试时的连接处理时间。-- min最小值、mean平均值、[+/-sd]方差、median中位数、maxz最大值Connection Times (ms) min mean[+/-sd] median maxConnect: 0 1 0.3 0 1 # socket链路建立消耗,代表网络状况好Processing: 20 121 54.9 119 281 # 写入缓冲区消耗+链路消耗+服务器消耗Waiting: 13 99 48.7 93 234 # 写入缓冲区消耗+链路消耗+服务器消耗+读取数据消耗Total: 21 122 54.8 119 281 # 单个事务总时间ERROR: The median and mean for the initial connection time are more than twice the standard deviation apart. These results are NOT reliable.Percentage of the requests served within a certain time (ms) 50% 119 66% 141 75% 148 80% 159 90% 201 95% 232 98% 268 99% 281 100% 281 (longest request)# 整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间,其中50%的用户响应时间小于119毫秒,66%的用户响应时间小于141毫秒,最大的响应时间小于281毫秒
3.3 从上面的返回结果可以得出以下数据:
1.整个测试持续的时间:1.274s
2.完成的请求数:1000
3.失败的请求数:0
4.总的网络传输量(字节数):25000 bytes
5.HTML内容传输量:13100 bytes
6.服务器的吞吐量:78.48 (QPS的稳定值应取决于失败请求为0时支持的最高并发)
7.用户平均请求等待时间:127.425ms
8.服务器平均处理时间:12.743ms
9.平均每秒网络上的流量: 19.16kb
10.99%的用户响应时间小于181ms
v遇到的问题
4.1.1: 错误描述
apr_socket_recv: Connection reset by peer (104) Total of 2513 requests completed
4.1.2: 解决方案
这个参数的意思是当出现“receive error”,即接收数据错误时是否退出,默认是退出的,所以会出现上述的问题,在参数中加入 -r
参数即可。
4.2.1: 错误描述
Benchmarking toutou.com (be patient) socket: Too many open files (24)
4.2.2: 解决方案
调整可以打开的文件数: ulimit -n 65535
v博客总结
1.ab判断成功与否知识判断
2xx
响应码,不接收服务器的返回值,所以同样的响应ab测试支持的并发数大于LR和Jemter,TPS的响应值也会比较大2.ab运行的测试并发数与ab所运行的机器的cpu的颗粒度有很大的关系,cpu颗粒度越大,测试结果支持的并发数越大
3.ab不像LR或Jemter那么强大,但是它足够轻便,如果只是在开发过程中想检查一下某个模块的响应情况,或者做一些场景比较简单的测试,ab还是一个不错的选择。