并发测试实验
一.并发测试工具对比
- Jmeter
- 优势在于可以录制用户的一段操作动作,测试时每个并发模拟的是一系列的操作,更加符合用户的操作真实性。
- 但是使用时以一个客户端应用程序来运行的,在Windows下使用要比Linux方便,但是在测试的并发数量很大,一台机器的资源不够时,Windows下很难做到测试机资源的扩展,而如果部署在Linux系统中,则很多文件无法在Linux系统下生成,只能在Windows与其一模一样的版本中生成文件后再使用Xftp传输过去,过程比较复杂而且不能保证文件可用。
- Apache Benchmark
- Apache服务器自带的测试工具,Linux安装非常简单。
-
使用命令行运行,运行得到的统计结果分为以下几类:
输出文件中是按照请求的处理时间进行了百分比统计,格式如下:
左图中每列表示前{$1}% 请求的单次请求时间在{\$2}ms内
-
AB工具中,POST/PUT的参数和Cookie可以写在文件中,但是必须在末尾加一个无用参数,据说是占位符的问题。
-
但是,AB工具只能针对一个链接,无法录制系列动作或者从一个地址集合中随机取地址。
-
Siege
- 仿真用户请求并发测试工具,可以从预定义列表中随机选取URL进行请求,Cookie和header信息需要使用
--header
写在命令中,可以混杂POST和GET请求。 -
结果中统计的最高并发数和我们使用
-c
参数设置的最大并发并不一致,但是单条访问时间和实际做到的最大并发数基本趋势还是吻合的。 -
统计结果相比AB较少,需要多次执行自行统计做对比。
- 仿真用户请求并发测试工具,可以从预定义列表中随机选取URL进行请求,Cookie和header信息需要使用
二.安装说明
-
Apache Benchmark安装
sudo yum install httpd-tools
- Siege安装说明
wget http://download.joedog.org/siege/siege-3.1.4.tar.gz
tar -xzvf siege-3.1.4.tar.gz
cd siege-3.1.4
./configure + make + make install
Ps. 需要gcc相关依赖,如果系统缺少相关模块,可以通过rpm包或者yum安装。
三.Apache Benchmark使用说明
命令行参数 | 说明 | 使用样例 |
---|---|---|
-n | 总访问条数 | -n 10000 |
-c | 并发数 | -c 200 这里80.126上最大能到1020 |
-t | 时间限制,秒 | -t 300 到达时限后无论是否执行完毕都会停止 |
-s | 每个Request超时时间 | -s 20 默认值为30 |
-p | 指定POST参数文件 | -p post.txt 内容为 |
-u | 指定PUT参数文件 | -u put.txt 内容为 |
-T | Content-Type | -T 'application/json' POST/PUT的头 |
-k | 开启HTTP KeepAlive方式 | 一个线程开始后不断开 |
-e | 输出CSV文件 | -e output.csv 内容为百分比和访问时间 |
四.Siege使用说明
命令行参数 | 说明 | 使用样例 |
---|---|---|
-c | 最大并发数 | -c 200 这里80.126上最大能到1024,但是实际并发达不到 |
-b | 请求之间的Delay | -b就是请求间没有延时 |
-r | 重复运行测试次数 | -r 30 重新运行测试30次 |
-t | 测试运行时间 | -t 10 持续测试10分钟,与-r互斥 |
-H/--header | Header | -H "Content-Type:application/json" 也可以设置Cookie: --header "Cookie:cookieName:cookieValue" |
-f | 地址文件 | 用于Siege在该文件中取地址进行访问: host/port/api POST {"p1":"v1"} host/port/api?p1=v1&p2=v2 |
-i | - | 随机向-f设置的文件中的地址发送请求 |
-o | 输出文件 | 测试结果文件 |
五.工具准备
- Tomcat-7.0.76
- Apache Benchmark
- Siege
- concurrency.war
- concurrency.sh
六.war包提供的测试用接口
一个简单的Spring Boot工程,未涉及数据库连接,提供了如下接口:
接口地址 接口描述 注释 /1 无参数GET请求 /2 单参数GET请求 一个String参数name /3 单参数POST请求 一个String参数name /4 复杂参数POST请求 一个Bean参数user /5 可选参数SleepGET请求 根据参数Sleep相应秒,默认2秒
七.Siege测试
编写了concurrency.sh脚本,可以进行多次Siege测试
bash concurrency.sh -i 10 -x 50 -t 10 -f url.txt -o output.csv -m 5 # -i 最小并发数 # -x 最大并发数 # -m 并发数增长步长 # -t 每次运行的测试次数 # -f url文件 # -o 输出文件
这里使用以上命令,将所有的测试用接口添加到了
url.txt
中.首先测试了并发量为200~800,步长为>10,单个并发访问10个URL,进行了测试,得到了
siege_200_800_10.csv
,由于测试量比较大,中间一些并发测试运行时出现了错误,最终得到了62次测试的结果。而且Siege通过参数c设置的并发量并不能真正达到,通过测试结果来看,设置800并发的时候,>大概只能做到300。
数据导入Excel之后,按照并发量排序后,做并发量-平均响应时间折线图如下:
第二次测试时将并发范围扩大到100~1000,步长仍然为10,每个并发用户执行20次随机URL访问,获得
siege_100_1000_10.csv
,这时候得到的并发量-平均响应时间折线图如下:
两图中均做了趋势线,可以看到,虽然响应时间不是很稳定,但是整体上有一个上升趋势,与我们的预想比较符合,至于不稳定性,其来源大概是在测试机的性能上,当命令测试机发出很多并发请求时,部分请求发送/接受出现了延时。
接下来,根据测试结果的做了并发量-失败请求量的折线图:
可以发现在并发量上升之后,出现的失败访问量也在提高,也就是说并发量的提高使服务器的稳定性下降了。
八.AB测试
AB的测试结果中不能获取程序真正做到的并发量,所以使用接口5进行了测试,ab的参数为800并发,总请求800次,理论情况如果是800并发,则平均时间在接口五Sleep的2s左右,执行如下命令:
bash
time ab -n 800 -c 800 -T 'application/json' http://127.0.0.1:8080/concurrency/5/真正的执行后发现时间用了10s,计算可以估计出设置800并发的情况下,ab做到的大概是160并发。
同时AB只能对一个链接地址做测试,不符合我们的需求,因此没有做后续的拓展。
九.结论
- 各个并发测试工具都有它的特点和功能,针对我们的测试需求,可以选择Siege作为我们的并发测试工具。
- Siege测试时设定的并发参数与实际上做到的并发有差异,差异大小和测试结果的稳定性在于测试机的性能,但是无论并发测试的参数如何,可以从结果中看到,平均响应时间和最高并发量之间呈现出反相关。也证明Siege工具测试结果的真实性。