1、软硬件配置
压测是通过在几台服务器上面安装jmeter作为Slave,自己本地的电脑作为Master进行的。当前具有如下几台服务器:
- 172.20.4.50;
- 172.20.4.52;
- 172.20.4.53;
1.1、软件配置
需要安装的软件:
- jdk1.8.0_121,因为jmeter是java开发的,所以需要jdk环境的支持;
- apache-jmeter-3.2;
1.2、硬件配置
由于压测需要大数量的线程对服务器进行模拟请求访问,所以对服务器的CPU和内存依赖很大。
服务器ip | 内存容量(G) | CPU信息 |
---|---|---|
172.20.4.50 | 15 | Intel(R) Xeon(R) CPU E5506 @ 2.13GHz(八核) |
172.20.4.52 | 15 | Intel(R) Xeon(R) CPU E5506 @ 2.13GHz(八核) |
172.20.4.53 | 15 | Intel(R) Xeon(R) CPU E5506 @ 2.13GHz(八核) |
2、使用jmeter前的准备
由于服务器安装的是 apache-jmeter-3.2,所以本地也需要安装同版本的jmeter。jmeter的使用主要有两种方式:
- GUI模式;
- 非GUI模式,需要自己录好脚本,通过命令行指定脚本文件执行;
上述两种方式基本一致,本文只介绍GUI模式的简单使用,如果想有更深的了解,请自行去学习。本文的用例是以本机作为Master,而服务器都作为Slave,作为示例。如果本机性能达不到要求,可以使用服务器中的其中一台作为Master,其他的作为Slave,如此一来需要使用非GUI模式进行测试;
注意:本文以Windows 7作为Master机进行简单介绍
2.1、安装jmeter
在安装jmeter前需要安装jdk1.8.0_121,请自行百度安装。
安装步骤如下:
- 将下载好的包解压到指定目录,如 D:\apache-jmeter-3.2;
- 配置环境变量,计算机(右键)-> 属性 -> 高级系统设置 -> 高级 -> 环境变量。在系统变量中新建变量JMETER_HOME,值为第1步的目录;
- 修改系统变量Path,在变量值后面添加 %JMETER_HOME%\bin,注意,改内容与前面已有的内容以分号分隔;
- 打开cmd,执行jmeter命令,启动jmeter GUI;
3、jmeter的使用
本文以HTTP请求测试为例,其他的测试,如FTP请求等,请自行学习。
3.1、简单使用
简单使用的步骤如下:
- 打开cmd,执行jmeter命令,启动Jmeter GUI;
- 添加测试计划,测试计划(右键)-> 添加 -> Threads(Users) -> 线程组;
- 修改线程组参数,根据需要修改线程组参数: a) 线程数,需要多少线程进行测试; b) Ramp-Up Period(in seconds),线程在多少秒内完全启动完成,如果线程数是3,此参数是1,那么每三分之一秒启动一个线程,如果此参数是3,这每一秒启动一个线程; c) 循环次数,整个过程的循环次数; d) Delay Thead createtion until needed,在需要时才创建线程; e) 调度器,可以根据调度器对测试计划进行时间上的控制,如合适开始,持续多久等等;
- 添加Sampler,线程组(右键)-> Sampler -> HTTP请求;
- 根据需求设置HTTP请求的参数如图3.1.1所示;
- 添加监听器,察看结果树、聚合报告等;
- 启动,在监听器中查看测试的结果以及测试的具体请求详情,如果图3.1.2所示;
3.2、使用分布式服务器进行压测
在使用分布式服务器进行测试前,需要修改%JAVA_HOME%\bin\jmeter\bin\jmeter.properties文件,内容如下:
# 将
remote_hosts=127.0.0.1
# 修改为
remote_hosts=172.20.4.50:1099,172.20.4.52:1099,172.20.4.53:1099
然后重启jemter,再使用设置好的测试用例,选择 远程启动,如图3.2.1所示。启动时候,结果会分批返回给Master机进行显示,注意。为了减小资源的消耗,请求的具体结果不返回。如果需要返回则需要额外进行对服务器进行配置。
4、接口压测技巧
为了能够满足压测需求,我们需要对模拟随机参数进行测试,以避免接口的缓存影响测试效果。对应普通的随机参数,可以直接使用jmeter提供的内置方法。除了内置方法,jmeter还提供了读取csv文件的配置原件,可以让我们能够从文件中直接读取特定的参数。
4.1、CSV Data Set Config
添加此组件,配置好后,如图4.1.1所示,设置的变量名,可以直接在HTTP请求的链接中使用,使用方式为${变量名};
注意,如果需要CSV文件作为参数来源,那么在分布式压测的情况下需要将同一个文件分别复制到服务器上的同一目录下,目前暂定咋/tmp目录下每个人以自己名字创建文件夹保存自己的临时文件,并且需要在测试计划中指定对该文件,否则测试失败。
4.2、BeanShell Preprocessor
在一些接口,可能需要添加签名,并且这个签名的来源是参数,签名串本身也是参数。在这种情况下我们需要写个脚本,动态的对参数进行加签,然后再将签名串作为参数去请求,具体的使用步骤如下:
- 使用java代码编写加签工具,打成jar包;
- 将jar包赋值到%JAVA_HOME%\bin\jmeter\lib\目录下,重启jmeter;
- 添加前置处理器BeanShell Preprocessor,编写脚本,示例脚本如下所示:
// 导入工具包
import com.test.m5dutil.MD5Util;
// vars,表示链接上的参数,key表示参数的key,value表示参数的value值,可以put,可以get
vars.put("businessid", "1401");
String businessid = vars.get("businessid");
// 如链接上的userid是从csv文件中读来的,需要对此动态参数加签,则需要先把它取处理
String userid = vars.get("userid");
String key = "dh8si93ihjs92z83mgzv19a75k";
String param = "businessid" + businessid + "&userid" + userid + "&key=" + key;
// 调用工具的加签方法(注意,每个项目的加签情况可能不一致,所以有些工具不可共用)
String sign = MD5Util.encrypt(param, "UTF-8");
System.out.println("sign = "+ sign);
// 将签名放入参数中
vars.put("sign", sign);
4.3、被测服务器的资源监控
在压测的过程中,被测服务器的各个资源消耗是一个很重要的参考指标,jmeter提供了插件,可以在测试的过程中实时监控被测服务器的性能指标,包括内存,CPU等等;
插件安装的过程如下:
-
- 将JMeterPlugins-Extras-1.4.0.zip解压,将其lib\ext目录下的JMeterPlugins-Extras.jar 文件放到apache-jmeter-3.2\lib\ext目录中;
-
- 将JMeterPlugins-standard-1.4.0.zip解压,将其lib\ext目录下的、JMeterPlugins-standard.jar 文件放到apache-jmeter-3.2\lib\ext目录中;
-
- 由于apache-jmeter-3.2版本中没有jmeter-plugins-cmn-jmeter-0.4.jar,直接运行是,会报错,所以需要将该jar文件放入apache-jmeter-3.2\lib中;
-
- ServerAgent直接放到被测服务器上运行,Linux服务器运行startAgent.sh,默认是4444端口,可以使用命令指定;
重启jmeter然后添加监听器,如图4.3.1所示,jp@gc开头的都是刚刚安装的插件所带来的新监听器,然后就可以实时监听被测服务器性能了,具体如图4.3.2所示。
5、分布式压测
压测的远程启动命令如下:
jmeter -n -t ./get_tv.jmx -r -l ./结果/get_tv_request.jtl -e -o ./聚合报告 -j jmeter_get_tv_'yyyyMMddHHmmss'.log
jmeter -n -t ./get_movie.jmx -r -l ./结果/get_movie_request.jtl -e -o ./聚合报告 -j jmeter_get_movie_'yyyyMMddHHmmss'.log
jmeter -n -t ./get_all.jmx -r -l ./结果/get_all_request.jtl -e -o ./聚合报告 -j jmeter_get_all_'yyyyMMddHHmmss'.log
jmeter -n -t ./comprehensive.jmx -r -l ./结果/comprehensive_request.jtl -e -o ./聚合报告 -j jmeter_comprehensive_'yyyyMMddHHmmss'.log
6、总结
jmeter还有许多的功能,本文只是简单介绍,想深入研究需要自己学习。