并发测试工具使用

并发测试实验

一.并发测试工具对比

  1. Jmeter
    • 优势在于可以录制用户的一段操作动作,测试时每个并发模拟的是一系列的操作,更加符合用户的操作真实性。
    • 但是使用时以一个客户端应用程序来运行的,在Windows下使用要比Linux方便,但是在测试的并发数量很大,一台机器的资源不够时,Windows下很难做到测试机资源的扩展,而如果部署在Linux系统中,则很多文件无法在Linux系统下生成,只能在Windows与其一模一样的版本中生成文件后再使用Xftp传输过去,过程比较复杂而且不能保证文件可用。
  2. Apache Benchmark
    • Apache服务器自带的测试工具,Linux安装非常简单。

    • 使用命令行运行,运行得到的统计结果分为以下几类:

      pic1

      输出文件中是按照请求的处理时间进行了百分比统计,格式如下:

      pic_2 左图中每列表示前{$1}% 请求的单次请求时间在{\$2}ms内

    • AB工具中,POST/PUT的参数和Cookie可以写在文件中,但是必须在末尾加一个无用参数,据说是占位符的问题。

    • 但是,AB工具只能针对一个链接,无法录制系列动作或者从一个地址集合中随机取地址。

  3. Siege

    • 仿真用户请求并发测试工具,可以从预定义列表中随机选取URL进行请求,Cookie和header信息需要使用--header写在命令中,可以混杂POST和GET请求。

    • 结果中统计的最高并发数和我们使用-c参数设置的最大并发并不一致,但是单条访问时间和实际做到的最大并发数基本趋势还是吻合的。

    • 统计结果相比AB较少,需要多次执行自行统计做对比。

      siege_result

二.安装说明

  1. Apache Benchmark安装

    sudo yum install httpd-tools

  2. 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 输出文件 测试结果文件

五.工具准备

  1. Tomcat-7.0.76
  2. Apache Benchmark
  3. Siege
  4. concurrency.war
  5. 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之后,按照并发量排序后,做并发量-平均响应时间折线图如下:

res-con

第二次测试时将并发范围扩大到100~1000,步长仍然为10,每个并发用户执行20次随机URL访问,获得siege_100_1000_10.csv,这时候得到的并发量-平均响应时间折线图如下:

res-con-1000

两图中均做了趋势线,可以看到,虽然响应时间不是很稳定,但是整体上有一个上升趋势,与我们的预想比较符合,至于不稳定性,其来源大概是在测试机的性能上,当命令测试机发出很多并发请求时,部分请求发送/接受出现了延时。

接下来,根据测试结果的做了并发量-失败请求量的折线图:

con-fail

可以发现在并发量上升之后,出现的失败访问量也在提高,也就是说并发量的提高使服务器的稳定性下降了。

八.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工具测试结果的真实性。

发表评论

邮箱地址不会被公开。 必填项已用*标注