`

实战:使用JMeter的Java Sampler轻松定制自己的benchmark

阅读更多

以前碰到更多的是WEB APP的性能测试,也许用得最多的是Loadrunner, Web Stress tool之类的常态化工具,从没考虑过对于后端引擎类的测试是怎样的。

 

现在有幸主导了一个企业引擎的研发,其最关健的不是其功能如何,而是性能如何。故benchmark就显得尤为重要。

 

既然是benchmark,一系列的性能监测、度量工具使用在所难免:

 

1. nmon。首选的AIX/Linux性能监测工具。很多年前简单总结过,可参考:http://www.blogjava.net/itstarting/archive/2009/02/19/255638.html.

 

2. jconsole。这个jdk自带的工具,监控JVM Heap size及回收、线程数量、CPU使用之类的,简单好用

 

3. JMeter。这个Apache的老字号,不得不搬出来(公司没有Loadrunner,也不能盗版)

 

4. Jamon。这个是方法级性能监控工具,完全无侵入性,如果框架用Spring,加上一小段AOP的配置即可

 

 

没想到的是,最给我带来惊喜,还是JMeter.

 

严格意义上上,JMeter我还是第一次在正式场合搬出来深度使用,以前简单的加压http,顶多算是个hello world.

 

JMeter有很多的插件式的扩展,因为本引擎使用的Netty + Protobuf,所以自然想到的还是JUnit Sampler和Java Sample。其中JUnit Sample个人觉得没有Java Sampler好,姑且按下不表。

 

Java Sampler,顾名思义,就是一个Java的采样器,扩展AbstractJavaSamplerClient即可轻松实现。

 

public class Benchmark extends AbstractJavaSamplerClient {
...
}
 

Benchmark有很多的场景,可以写很多个Benchmark类,比如Benchmark_A, Benchmark_B,我偷懒,四大场景我就写了一个。

 

好了,下面重点说说需要实现的部分,及其作用。

 

1. 重载getDefaultParameters方法。

@Override
public Arguments getDefaultParameters(){
	    Arguments params = new Arguments();
	    
	    //TODO: Right here to define/set parameters from GUI.
	    
	    return params;
}

 在这个方法里,可以设置各种参数,这些参数可以从GUI处获取,也可以设置合适的默认值。有意思的是,这些默认值在GUI扫描的时候,会自动出现在界面上,以供必要的调整和优化。

 

 

2. 重载setupTest方法。

@Override
public void setupTest(JavaSamplerContext arg0) {
   //TODO: to init the test case, something like JUnit's setUp
}

为了达到真正的性能测试目的,所有的数据准备工作,应在这里完成。 需要注意的是,这个方法在JMeter初始化的每个线程都会执行一遍,而不是全局仅一遍。

 

 

3. 重载并重点编写runTest方法。

@Override
public SampleResult runTest(JavaSamplerContext arg0) {
    //TODO: The load testing client side logic acting as the emulators puts here
}

这是我们重点要做编写的客户端代码,为Java Sampler实现的重点。

在这里,你可以尽情的调用客户端的API,完成所需要与服务器端交互的一切,包括交易成功与否的判断。

所谓代码胜千言,下面看看代码好了,加上了注释,就不用废话了:

@Override
public SampleResult runTest(JavaSamplerContext arg0) {	
	SampleResult sp = new SampleResult(); //采样结果
        MatchResponse matchResponse;
        UUID uuid = UUID.randomUUID();
        String key = uuid.toString();
        sp.sampleStart();                                    //采用开始时间
        
        //下面是客户端逻辑
        try {        	
        	if("PC2-ID".equalsIgnoreCase(benchmark_mode)){
        		matchResponse = client.sendMatchRequest(
        					key,
							ENGINE.code(), 
							pc2Image, 
							sourcePositions, 
							targetIdentifiers, 
							ImageType.PC2.imageCode());
        	}else if("WSQ-ID".equalsIgnoreCase(benchmark_mode)){
        		matchResponse = client.sendMatchRequest(
    						key,
							ENGINE.code(), 
							wsqImage, 
							sourcePositions, 
							targetIdentifiers, 
							ImageType.WSQ.imageCode());
        	}else if("ID-ID".equalsIgnoreCase(benchmark_mode)){
        		matchResponse = client.sendMatchRequest(
    						key,
							ENGINE.code(), 
							sourceIdentifier, 
							sourcePositions, 
							targetIdentifiers, 
							ImageType.PC2.imageCode());
        	}else{
        		print("Not supported benchmark mode found", benchmark_mode);
        		throw new java.lang.IllegalArgumentException("Not supported benchmark mode found");
        	}

            sp.sampleEnd(); //采用结束
            
            this.printMatchResponse(matchResponse);

        	//set success flag to true but need to verify later
        	sp.setSuccessful(true);
        	
        	//下面进一步分析服务器端返回的信息,以判断本次交易是否成功
        	Iterator<MatchResult> matchResults = matchResponse.getMatchResults().iterator();
        	MatchResult matchResult;
        	MatchScore score;
        	while(matchResults.hasNext()){
        		matchResult = matchResults.next();
        		Iterator<MatchScore> scores = matchResult.getMatchScores().iterator();
        		while(scores.hasNext()){
            		score = scores.next();
            		if (score.score<9999.0){
            			sp.setSuccessful(false);
            			break;
            		}
            	}
        	}
        } catch (Exception e) {
            sp.sampleEnd();
            sp.setSuccessful(false);   
        	e.printStackTrace();
            return sp;   
        }
        
        return sp;  //返回采用结果,这个结果将会被JMeter使用,并反馈到GUI/报告中,方便明了
}
 

4. 重载并编写teardownTest方法。

@Override
public void teardownTest(JavaSamplerContext context) {   
	//TODO: clean up    
}

天下没有不散的筵席,落幕时分跟JUnit的tearDown一样,但据我测试的效果来看,这玩意全局只调用一次,而非跟setupTest 那样每个线程都来一次。

 

 

下面谈谈怎么配置JMeter,并真正跑起来。

 

有几个步骤:

1. 安装JMeter...咳废话

2. 打包Benchmark为jar并拷贝所有的依赖到 %apache-jmeter%\lib\ext下。

我用maven,就更简单了,配上下面那段:

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<version>2.3.1</version>
				<configuration>
					<archive>
						<manifest>
							<addClasspath>true</addClasspath>
							<classpathPrefix>lib/</classpathPrefix>
						</manifest>
						<manifestEntries>
				        	<Class-Path>.</Class-Path>
				        </manifestEntries> 
					</archive>
				</configuration>
			</plugin>

这样拷贝过去的就是:

%apache-jmeter%\lib\ext\我的benchmark.jar

%apache-jmeter%\lib\ext\lib\*——各种杂七杂八的依赖

 

3. 启动JMeter。

双击%apache-jmeter%\bin\jmeter.bat

 

4. 新增一个Thread Group.

右键Test Plan->Add->Threads (Users)->Thread Group

改名为Benchmark,并设置几个重量级的参数:

a) Number of Threads (users),并发的线程数
b) Ramp-Up Period (in seconds),预热时间,类似于一般意义上的Think Time
c) Loop Count,每组并发线程循环的次数

d) Scheduler是另外一组用来配置调度的,我没用这个

附上图:


 

5. 新增Java Request.

右键刚新增的线程组(这里名叫Benchmark了)-> Add -> Sampler -> Java Request

默认情况下,如果你仅放了一个Java Sampler,JMeter即可通过扫他的classpath扫到你的Java Sampler并自动出现在GUI上。如下图:


 

6. 再放一到若干个Listener,用以观察输出/图形化报表

一般而言,我喜欢放两个,一个是最最朴素的"View Results in Table":

右键刚新增的线程组Benchmark-> Add -> Listener -> View Results in Table

再来一个"Graph Full Results",图形化的

 

到此为止,基本配置完毕,保存一下。

 

 

跑Benchmark其实就很简单了,一般而言三个步骤:

1. 调整Thread Group的参数,一般包括Number of Threads (users)和Loop Count,以配合不同的压力场景

2. 调整必要的参数,通过点击Java Request,即可控制你的Java Sampler的每个参数细节

3. 点击Start,并观察输出,包括View Results in Table或者Graph Full Results。输出主要包括:No of Samples、Latest Sample、Average、Deviation、Throughput、Median等,够用了。如下图:



 

 

附:一般而言,如果线程不是太吓人(比如超过1000),一个JMeter实例就够了,如果多了,就要考虑多个JMeter实例并行测试了。

 

==The End==

  • 大小: 92.1 KB
  • 大小: 99.4 KB
  • 大小: 71.6 KB
  • 大小: 211.7 KB
分享到:
评论

相关推荐

    JMeter实战技巧:使用Java Request Sampler进行接口测试

    JMeter实战技巧:使用Java Request Sampler进行接口测试

    Jmeter Java Sampler编写入门.docx

    Java Sampler在JMeter中的使用是为了实现更底层的性能测试,特别是在面对非HTTP协议,如WebService、Hessian或其他自定义协议的接口性能测试时。通过编写Java代码,测试者可以直接调用应用提供的接口,从而避免HTTP...

    Jmeter-Java-Sampler.rar_jmeter_jmeter java_压力测试

    而Java Sampler是JMeter中的一个重要组件,允许用户自定义测试逻辑,为复杂场景提供高度定制的压力测试。 Java Sampler是JMeter框架的一部分,它允许开发者用Java语言编写测试脚本,从而实现对任何基于Java接口的...

    Jmeter WebSocket Sampler 依赖文件

    标题中的"Jmeter WebSocket Sampler 依赖文件"指的是为了在JMeter中使用WebSocket测试功能所需要的一组特定文件。这些文件包括JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar,这是一个包含了WebSocket Sampler功能的...

    JMeter WebSocketSampler 依赖jar包下载

    JMeter WebSocketSampler 依赖jar包下载 提供最全最新的包含: 1、JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar 2、jetty-http-9.1.2.v20140210.jar 3、jetty-io-9.1.2.v20140210.jar 4、jetty-util-9.1.2.v20140210...

    JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar

    org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:429) org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:257) java.lang.Thread.run(Thread.java:744)

    jmeter-ssh-sampler-master.zip

    在"jmeter-ssh-sampler-master.zip"这个压缩包中,我们主要探讨的是如何使用JMeter SSH Sampler来连接并操作Linux系统。 首先,SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程登录和其他...

    Jmeter WebSocket Sampler插件jar包_v20180605.zip

    Jmeter完整的WebSocket协议插件包,可通过插件对WebSocket进行压力测试。支持ws和wss的websocket协议,下载完成后将jar包文件直接放在jmeter的\lib\ext目录下,重启jmeter后,可在添加-取样器中看到这些插件,用来...

    Jmeter Java Request Demo

    你可以编写自己的Java类来实现特定的请求逻辑,然后在JMeter中配置这个Java Request sampler来执行你的代码。 对于TCP请求,这是基于传输控制协议的网络通信方式,主要用于提供面向连接的服务。在JMeter中使用Java ...

    使用Jmeter测试java请求

    总的来说,使用JMeter测试Java请求是性能测试中常见且重要的任务,它能帮助开发者识别和优化Java服务的性能问题,确保在高负载下仍能提供稳定的服务。在实际操作中,可能还需要结合其他工具和方法,如日志分析、监控...

    JMeter测试视频教程

    演示:掌握JMeter各元素的使用 课时15:JMeter-II.ppt 课时16:1.测试SQL Query的方法 课时17:2.演示:测试SQL Query 课时18:3.测试Web页面的方法 课时19:4.演示:测试WEB页面 课时20:JMeter-III.ppt 课时21:1.Meter...

    Jmeter 中文使用手册(免费完整版).docx

    Jmeter 中文使用手册免费完整版 Jmeter 是一个功能强大且灵活的压力测试和性能测试工具,由 Apache 软件基金会开发和维护。其主要特点是: 1.-cross-platform:Jmeter 是一个纯 Java 桌面应用程序,可以在任何支持...

    Jmeter使用之二:Jmeter录制脚本

    《Jmeter使用之二:Jmeter录制脚本详解》 JMeter是一款强大的性能测试工具,尤其在Web应用的负载和压力测试中表现出色。本文将深入探讨如何利用JMeter进行脚本录制,以便模拟真实用户行为,为性能测试提供基础。 ...

    jmeter-视频地址.txt

    18:命令行压测及生成报告 19:Jmeter之分布式压测 20:jm eter扩展插件 21:自己动手开发jmeter插件 22:FTP协议实战 23:WebService协议实战 24:JDBC协议实战 25:JDBC协议实战增删改查 26:JDBC协议实战高级操作...

    Jmeter Kafka Sampler插件

    Jmeter Kafka Sampler插件 详细介绍请参考博客: https://blog.csdn.net/TalorSwfit20111208/article/details/127270944

    jmeter做的http并发测试完整例子(包含完整可执行脚本http_sample.jmx)

    1:安装Java8环境 2:安装apache-jmeter-3.1 下载地址:https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-3.1.zip 3:服务端运行ServerAgent-2.2.1 4:Jmeter里\lib\ext,附件两jar包 5:启动Jmeter...

    jmeter学习教程视频下载

    课程目录: ...21:自己动手开发jmeter插件 22:FTP协议实战 23:WebService协议实战 24:JDBC协议实战 25:JDBC协议实战增删改查 26:JDBC协议实战高级操作 27:Jmeter4.0的一些更新

    JMeter-WebSocketSampler

    JMeter-WebSocketSampler jetty-http-9.1.1.v20140108.jar jetty-io-9.1.1.v20140108.jar jetty-util-9.1.1.v20140108.jar websocket-api-9.1.1.v20140108.jar websocket-client-9.1.1.v20140108.jar websocket-...

    jmeter java测试工具

    jmeter java测试工具

    jmeter 插件开发Sampler读取Excel文件并设置为变量

    标题 "jmeter 插件开发Sampler读取Excel文件并设置为变量" 描述了一种针对JMeter工具的自定义插件开发方法,该插件能够方便地读取Excel文件中的数据,并将这些数据自动设置为JMeter测试计划中的变量。在性能测试中,...

Global site tag (gtag.js) - Google Analytics