ab并发负载压力测试

一、ab

0、安装ab压力测试软件

[root@a2 conf]# yum install httpd-tools -y

#查看版本
[root@a2 conf]# ab -V
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

  

1、压力测试的几个概念:

吞吐率(Requests per second)
概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。
计算公式:总请求数 / 处理完成这些请求数所花费的时间,即
Request per second = Complete requests / Time taken for tests

并发连接数(The number of concurrent connections)
概念:某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。

并发用户数(The number of concurrent users,Concurrency Level)
概念:要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。

用户平均请求等待时间(Time per request)
计算公式:处理完成所有请求数所花费的时间/ (总请求数 / 并发用户数),即
Time per request = Time taken for tests /( Complete requests / Concurrency Level)

服务器平均请求等待时间(Time per request: across all concurrent requests)
计算公式:处理完成所有请求数所花费的时间 / 总请求数,即
Time taken for / testsComplete requests
可以看到,它是吞吐率的倒数。
同时,它也=用户平均请求等待时间/并发用户数,即
Time per request / Concurrency Level

2、ab是apache自带的压力测试工具。

ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。

Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx、lighthttp、IIS等其它Web服务器的压力。 
ab命令对发出负载的计算机要求很低,既不会占用很多CPU,也不会占用太多的内存,但却会给目标服务器造成巨大的负载,自己使用也须谨慎。否则一次上太多的负载,造成目标服务器直接因内存耗光死机,而不得不硬重启,得不偿失。

在带宽不足的情况下,最好是本机进行测试,建议使用内网的另一台或者多台服务器通过内网进行测试,这样得出的数据,准确度会高很多。远程对web服务器进行压力测试,往往效果不理想(因为网络延时过大或带宽不足)。

 ab软件单机模拟: 0-20000 并发的能力。

 

3、ab的帮助

Options做下解释吧:
-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特性。
-d不显示百分比。
-S不显示预估和警告信息。
-g输出结果信息到gnuplot格式的文件中。
-e输出结果信息到CSV格式的文件中。
-r指定接收到错误信息时不退出程序。
-h显示用法信息,其实就是ab -help。

4、ab使用方法

压测块景设置: 
ab -n 800 -c 800  http://192.168.0.10/ 
(-n发出800个请求,-c模拟800并发,相当800人同时访问,后面是测试url)

ab -t 60 -c 100 http://192.168.0.10/ 
在60秒内发请求,一次100个请求。 
  
//如果需要在url中带参数,这样做 
ab -t 60 -c 100 -T "text/plain" -p p.txt http://192.168.0.10/hello.html 

5、压测记录

#install software
yum install httpd-tools -y

#test nginx

[root@aikt-n1 vhosts]# ab -n 10000 -c 10000 https://nlu.gree.com/unisound/v1/query
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking nlu.gree.com (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software: nginx/1.8.0
Server Hostname: nlu.gree.com
Server Port: 443
SSL/TLS Protocol: TLSv1/SSLv3,ECDHE-RSA-AES256-GCM-SHA384,2048,256

Document Path: /unisound/v1/query
Document Length: 168 bytes       #HTTP响应数据的正文长度

Concurrency Level: 10000
Time taken for tests: 31.878 seconds   #所有这些请求处理完成所花费的时间 
Complete requests: 10000   # 完成请求数 
Failed requests: 0    #  失败请求数 
Write errors: 0
Non-2xx responses: 10001
Total transferred: 3170317 bytes   #网络总传输量
HTML transferred: 1680168 bytes    #HTML内容传输量 
Requests per second: 313.69 [#/sec] (mean)   #吞吐量-每秒请求数 
Time per request: 31878.099 [ms] (mean)    #服务器收到请求,响应页面要花费的时间 
Time per request: 3.188 [ms] (mean, across all concurrent requests)  #并发的每个请求平均消耗时间 
Transfer rate: 97.12 [Kbytes/sec] received     #平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题

 

#网络上消耗的时间的分解: 

整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间 
其中 50% 的用户响应时间小于 571 毫秒 
80 % 的用户响应时间小于 652 毫秒 
最大的响应时间小于 684 毫秒 

Connection Times (ms)
min mean[+/-sd] median max
Connect: 7 28905 1349.2 28908 31192
Processing: 0 2630 1292.5 2632 4852
Waiting: 0 2622 1295.1 2621 4852
Total: 299 31535 326.5 31542 31582

Percentage of the requests served within a certain time (ms)
50% 31542
66% 31558
75% 31566
80% 31570
90% 31575
95% 31579
98% 31581
99% 31582
100% 31582 (longest request)

 

7、其它ab压测过程中遇到的一些问题

#当使用ab做压力测试,执行类似的命令:

1
ab -c 10 -n 10000 www.xxx.com/

提示apr_poll: The timeout specified has expired (70007)或者apr_socket_recv: Connection timed out (110)。

解决方法:添加-k参数,压力测试命令改为“ab -c 10 -n 10000 -k www.xxx.com/”,如果问题依旧,那就得从linux服务器配置着手。向/etc/sysctl.conf配置文件添加下边的设置,主要调整net.ipv4.netfilter.ip_conntrack_max或nf_conntrack_max的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#kernel2.6之前的内核版本添加如下配置:
net.ipv4.netfilter.ip_conntrack_max = 655360
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1200
 
#kernel2.6之后的内核版本添加如下配置:
net.nf_conntrack_max = 655360
net.netfilter.nf_conntrack_tcp_timeout_established = 1200
 
net.ipv4.tcp_syncookies = 1 #当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1 #开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_tw_reuse = 1 #开启重用,将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_fin_timeout = 25 #修改系統默认的 TIMEOUT 时间
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_max_orphans = 8192
net.ipv4.ip_local_port_range = 32768 61000
1
sysctl -p /etc/sysctl.conf #不重起服务器,让新配置生效

2)在用ab测试的时候,只要出现Failed requests(失败的请求),就会出现三种失败的类型统计:Connect、Length、Exception。

Connect:向服务器发送请求失败;服务器连接失败;请求过程连接中断等。

Length:服务器返回的数据长度不一致,一般是对比Content-Length的值。

Exception:与服务器连接过程中发生意外错误。

这里主要说明一下Length,ab会把第一次成功返回的content-length作为基准,如果后面的请求返回的content-length跟第一次的不一样,它就会把这次请求当成是失败了。对于动态类型的网站,每次服务器返回的数据都不一定相同,所以如果ab提示的是Length错误,基本都可以忽略掉。

3)默认情况下,ab没有启用gzip压缩功能,所以压力测试的结果会跟实际情况有很大的偏差。要想让ab使用gzip压缩功能,得添加参数 -H 'Accept-Encoding: gzip'

1
ab -H 'Accept-Encoding: gzip' www.xxx.com/

4)带参数的压力测试示例

1
ab 'www.xxx.com/?a=1&b=2&c=3'

5)提示:Benchmarking 127.0.0.1 (be patient)... 使用了与请求的协议不兼容的地址(730047)

如果出现这个问题,那很可能是你使用了apache2.4.1或以上的版本。似乎从2.4.*开始,就使用了ipv6的协议,另一种角度来说,这可能是一个bug,所以检测一下是不是以前把ipv6的相关服务给关了。开始菜单->控制面板->任务管理器->服务->启用IP Helper。

再检查一下文件C:\Windows\System32\drivers\etc\hosts,添加下边的对应关系。

1
::1             localhost

::1是ipv6中的IP地址,ipv4为127.0.0.1。

如果真是版本缺陷,我还是建议更换低版本的ab来使用。

posted @ 2018-07-26 10:12  努力哥  阅读(10221)  评论(0编辑  收藏  举报