一、JMeter远程性能监控工具的使用
在JMeter中安装插件“jp@gc - PerfMon Metrics Collector”,可以实现监听指定服务器的资源消耗情况,包括CPU、Disk I/O、Network I/O 、Memory等。该插件提供了图形化式的输出结果,能够实时反映在服务调用过程中的服务器资源消耗情况,相比nmon更为方便(nmon本身提供了数据的导出功能,但是还需要通过另外的分析工具才能生成报表,并且需要测试人员手工选择采样数据的时间区间,)。具体的实现步骤为:
1. JMeter上安装“jp@gc - PerfMon Metrics Collector”插件,插件列表如下:
JMeter-Plugins-Extras.jar
JMeterPlugins-Standard.jar
拷贝上面的两个jar包到../apache-jmeter-xx.x/lib/ext目录下,并重启客户端。
2.服务器上安装性能监听程序
ServerAgent-2.2.1.zip
拷贝压缩包到服务器任意目录并解压,启动startAgent.sh脚本。(如果无法执行,执行chmod +x startAgent.sh添加执行权限)。执行命令为:./startAgent.sh &。在JMeter正常运行时,必须确保服务器上的该进程存在,否则JMeter客户端无法采集服务器资源消耗数据。
3. 使用“jp@gc - PerfMon Metrics Collector”
在线程组中添加了“jp@gc - PerfMon Metrics Collector”后,界面上可以配置需要监控的服务器,主要配置的是:Host/IP、Port和Metric to collect。其中Port默认为4444,不需要更改。
注意:安装插件可以使用JMeter的插件管理工具(jmeter-plugins-manager-0.11.jar),下载该jar包并拷贝到../jmeter-xx/lib/ext目录下后,重启JMeter。在“选项”->“Plugins Manager”中可以看到可以使用的插件。
二、使用HTTP请求查看服务器调用时间
为测试计划添加“teardownThread Group”,该线程组在Java请求完成后只执行一次,在其中配置了HTTP请求,通过168.168.98.56:9092/services/time/timeCollect的REST接口获取服务器的调用时间。通过配置“HTTP请求”实现。通过“jp@gc JSON Path Extractor”解析HTTP Response中的timeNumber、crmTime、serviceTime等参数。配置“Debug Sampler”进行数据的输出。最后,在“查看结果树”中就可以查看到从服务器获取到的数据。具体的实现步骤为:
1. 安装“jp@gc JSON Path Extractor”插件(可选)
jpgc-json-2.6.zip
将该插件解压并拷贝到../apache-jmeter-xx.x/lib目录下,并重启JMeter。
注意:使用后置处理器中的“JSON Extractor”的功能一致,此时就不用安装“jp@gc JSON Path Extractor”插件了。
2. 添加“teardownThread Group”
“teardown Thread Group”会在测试计划的“线程组”执行完毕后,再执行。这样我们就可以通过一个HTTP接口调用,获取到“线程组”中所有的请求完成后的统计数据。
添加teardownThread Group
3. 添加“HTTP请求”
图添加HTTP请求
之所以要在这里加一个“HTTP请求”的Sampler,是因为我们的系统实现了一个Rest接口,可以通过调用该接口获取所有的请求完成后的服务器总时间和外部系统调用时间。
4. 添加后置处理器“jp@gc JSON Path Extractor”或者“JSON Extractor”
图添加JSON Path Extractor或者JSON Extractor
因为我们的Http的Response为如下的格式:{"code":"0000","msg":"","level":null,"data":{"timeNumber":1,"serviceTime":1,"crmTime":1},"totalAmount":0},所以配置jp@gc-JSON Path Extractor中的配置信息为:
图配置JSON Path Extractor中的crmTime
图配置JSON Path Extractor中的timeNumber
图配置JSON Path Extractor中的serviceTime
表示从Response的JSON信息中提取crmTime、serviceTime和timeNumber。如果Http中不是JSON返回信息,该监听器就无法使用。
5. 添加“Debug Sampler”
图添加Debug Sampler
具体的配置信息为:
JMeter Properties:False
JMeter Variables: True
System Properties:False
6. 添加“查看结果树”
略。
7. 查看结果
注意:一个tearDown Thread Group只能添加一个HTTP请求,否则会导致其中一个HTTP请求无请求结果从而使得JSON Path Extractor提取信息失败,无法得到正确的结果。但是我们的服务器有两个,解决办法是:添加两个“teardownThread Group”,分别添加HTTP请求。
三、服务器性能监控工具的使用
解压nmon_linux_14g.tar.gz包至服务器任意目录,根据操作系统选择合适的程序,我这里选择的是nmon_linux_x86_64。(注意需要chmod +x添加可执行权限)。执行后可查看服务器的实时资源使用情况,包括CPU、Disk I/O、Network I/O、Memory等。
也可以将资源消耗数据通过文件保存起来后续分析使用,具体可参考:http://www.cnblogs.com/simeone/p/4026173.html
四、nonGUI的环境部署
图xx JMeter的nonGUI测试环境搭建拓扑图
1. 搭建基于Dubbo服务的接口性能测试测试环境。
以两个JMeter服务节点(jmeter-server)、一个JMeter客户端(复用JMeter服务节点)、两个Dubbo服务节点为例搭建一个基于nonGUI-JMeter的Dubbo服务压力测试环境。
1) [将apache-jmeter-3.1拷贝到服务节点的任一目录下;
2)修改bin/jmeter中的内存配置(HEAP);
3) 如果jmeter、jmeter-server未赋予可执行权限,通过chmod +x jmeter, chmod +x jmeter-server赋予其可执行权限;
4) 在JMeter客户端所在节点上,修改bin/jmeter.properties文件中的remote_hosts,指向IP1:port, P2:port;
2. JMeter服务节点部署
1. 拷贝apache-jmeter-3.1至服务器上指定地址(一般为/home/appadmin目录);
2. 启动jmeter-server(./jmeter_server &)。确保jmeter_server拥有可执行的权限(chmod +x jmeter_server);
3. 在每次更新jar包时,需要kill掉当前的jmeter-server进程并重启;
4.JMeter客户端部署
无需部署,一般选择其中的一个jmeter_server作为Jmeter client。
4. 实现AbstractJavaSamplerClient接口的jar包的编写、打包和发布
4.1 编写
新建一个springboot工程,在pom.xml文件中引入依赖:
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>3.0</version>
</dependency>
原则上针对每一个要进行压力测试的dubbo接口编写一个类,继承AbstractJavaSamplerClient抽象类。父类中包含若干要重新实现的方法:
public void setupTest(JavaSamplerContext context);
在该方法中实现创建Spring上下文,获取dubbo接口实例等功能;
public void teardownTest(JavaSamplerContext context);
在该方法中实现关闭Spring的ApplicationContext的功能;
publicArguments getDefaultParameters();
在这里实现在JMeter的UI配置界面上展现测试接口所需的参数,并且给参数一些默认值的功能;当JMeter运行时,从界面上取参数数据。
SampleResult runTest(JavaSamplerCOntext context);
运行JMeter;
在GatewayDubboTest工程中配置该工程连接Zookeeper的属性为:dubbo.registry.address = zookeeper://IP(同时部署在客户端IP1/客户端IP2节点的服务配置的Zookeeper参数也是这个ZK地址)。
4.2 打包
在Maven工程中使用maven-assembly-plugin插件打包,pom依赖为:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2</version>
<configuration>
<archive>
<manifest>
<mainClass>com.XXXX.starcraft.Starter.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>
jar-with-dependencies
</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
然后在工程中使用assembly:assembly –DskipTests命令进行打包即可。
4.3 发布
将生成的jar包拷贝到服务器1, 服务器2的./apache-jmeter/lib/ext目录下。注意:因为打包时未把依赖jar包加入,所以该jar包依赖的其他jar包需要手动添加到../apache-jmeter/lib目录下。
5. 运行测试用例
运行测试任务前,1)确保JMeterServer(即服务器1, 服务器2)已经启动(启动方式为./jmeter-server &),可通过ps–ef | grep jmeter命令进行查看;2)确保dubbo服务节点(即用户端)的服务已经启动,可通过ps –ef|grep java命令进行查看。
选择服务器1作为发起JMeter请求的客户端。进入/bin目录下,使用./jmeter命令,具体的格式有两种:
(1)仅生成*.jtl文件
./jmeter -t script/dingtoukaitong.jmx -n -l listener.jtl–r
其中:./jmeter是JMeter提供的命令;dingtoukaitong.jmx是待执行的脚本文件;listener.jtl是要输出的文本化结果,该结果输出到当前目录下。
(2) 生成*.jtl同时生成报表
./jmeter -n -t script/dingtoukaitong.jmx -r -l listener-aipOpen-2-2-2*500000.jtl -e -o /home/appadmin/apache-jmeter-3.1/bin/resultReport-aipOpen-2-2-2*500000
其中:./jmeter是JMeter提供的执行命令;dingtoukaitong.jmx是待执行的脚本文件;listener-aipOpen-2-2-2*500000.jtl是要输出的文本化结果;resultReport-aipOpen-2-2-2*500000是待生成的报表所在文件夹。
注意:当使用此种方式时,确保待输出的文本化结果和报表文件夹都必须不存在。
6. 运行结果分析
6. 几种重要的监听器
(1)运行结果输出为index.html图表
./jmeter -n -t script/dingtoukaitong.jmx -r -l listener-2-2-4*25000.jtl -e -o /home/appadmin/apache-jmeter-3.1/bin/resultReport
script/dingtoukaitong.jmx 是要运行的测试工程;
listener-2-2-4*25000.jtl是要输出的性能测试结果;
resultReport是要输出的图形化结果
五、java request sampler的参数化
有时候对于某一个dubbo请求接口,需要模拟多条不同参数的请求。这时候可以将参数写准备在一个*.csv或者*.txt文件中。通过在线程组中添加CSV Data Set Config读取文件中的数据,如下图所示:
图中①处表示CSV Data Set Config读取的目标文件的绝对路径;②处表示文件中每一行数据的组织形式,以“,”分隔不同的数据。其中,数据在*.csv或*.txt文件中的具体形式如下图:
与②处的表现形式是一样的。
然后,在Java Request Sampler中可以像下图这样设置:
此时,dubbo接口的参数从CSV Data Set Config中读取的文件行中解析,达到了不同的请求,使用不同的请求参数的目的。
使用non-gui模式进行多节点测试时,需要将*.jmx拷贝到服务器上,同时需要拷贝*.csv或者*.txt文件到任意目录,同时在*.jmx文件中修改filename的路径,如下图所示:
问题汇总
1. 问题描述:调用Dubbo服务时,客户端报KryoException或者NoClassDefFoundError等错误时,需要检查使用的starcraft-api和starcraft-base的jar包是否与服务器一致;
解决方案:如果出现不正常的调用错误,比如包冲突、包中的类无法找到等类似的问题,需要到指定的路径下重新下载jar包(接口工程包)
并拷贝到../apache-jmeter-xx.x/lib目录下,重新启动JMeter;
因此,若项目中需要引用非外部的包资源,该包资源在频繁的变动过程中时,必须确保JMeter客户端和服务器使用的包的一致性;
2. 问题描述:在做Dubbo接口压力测试时,需要对接口进行封装,实现AbstractJavaSamplerClient接口。实现中需要通过创建ClassPathXmlApplicationContext并从中获取Dubbo接口,实例化context在定义变量时进行,导致了dubbo服务的TCP连接数太多。
解决方案:建议在setupTest中进行context的实例创建工作,具体代码为:
context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
3. 问题描述:在大并发时,JMeter客户端会偶发OutOfMemory的异常;
解决方案:JMeter客户端在../bin/jmeter.bat中设置JVM参数,增加内存配置。