1、abhtml
0、安装ab压力测试软件linux
[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/
一、压力测试的几个概念:nginx
吞吐率(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
二、ab是apache自带的压力测试工具。web
ab很是实用,它不只能够对apache服务器进行网站访问压力测试,也能够对或其它类型的服务器进行压力测试。好比nginx、tomcat、IIS等。apache
Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也能够测试nginx、lighthttp、IIS等其它Web服务器的压力。
ab命令对发出负载的计算机要求很低,既不会占用不少CPU,也不会占用太多的内存,但却会给目标服务器形成巨大的负载,本身使用也须谨慎。不然一次上太多的负载,形成目标服务器直接因内存耗光死机,而不得不硬重启,得不偿失。windows
在带宽不足的状况下,最好是本机进行测试,建议使用内网的另外一台或者多台服务器经过内网进行测试,这样得出的数据,准确度会高不少。远程对web服务器进行压力测试,每每效果不理想(由于网络延时过大或带宽不足)。tomcat
ab软件单机模拟: 0-20000 并发的能力。bash
三、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。
四、ab使用方法cookie
压测块景设置: 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
五、压测记录
#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)
七、其它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来使用。