天天看点

【压测】使用jmeter进行java性能测试

        基本测试原理:jmeter模拟请求,根据设定的不同请求量,查看目标程序的CPU占用率、内存消耗和线程数等状况,对比数据,分析优化程序。jmeter支持设定请求线程数和每秒执行次数。

       准备工作是写一个执行类,因为要作为jar包使用,所以要建个项目先,项目只有一个实现了AbstractJavaSamplerClient抽象类的类。需要引用${jmeter_home}/lib/ext目录下的ApacheJMeter_java.jar和ApacheJMeter_core.jar两个jar包。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;

public class TestNum extends AbstractJavaSamplerClient {
	// 用于在jmeter上显示执行结果
	private SampleResult results;

	// 用于设置传入的参数,可以设置多个,已设置的参数会显示到Jmeter参数列表中
	public Arguments getDefaultParameters() {
		Arguments params = new Arguments();
		params.addArgument("key", "value");
		return params;
	}

	// 初始化方法,用于初始化性能测试时的每个线程,实际运行时每个线程仅执行一次
	public void setupTest(JavaSamplerContext jsc) {
		// 定义SampleResult类
		results = new SampleResult();
	}

	// 执行体
	public SampleResult runTest(JavaSamplerContext arg0) {
		// 这里不写results.sampleStart()和results.sampleEnd(),因为循环执行时会报错,估计jmeter自己写了
		try {
			Socket s = new Socket("127.0.0.1", 10086);
			s.setSoLinger(true, 1);
			OutputStream outputStream = s.getOutputStream();
			InputStream inputStream = s.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
			String parameter = arg0.getParameter("1");
			outputStream.write(parameter.getBytes());
			//这个方法我也不知道干什么用,本来是想试试是不是用来打印发送数据的
			results.setSamplerData(parameter);
			outputStream.flush();
			//打印返回数据
			results.setResponseMessage(br.readLine());
			s.close();
			//返回结果为成功
			results.setSuccessful(true);
		} catch (Exception e) {
			results.setResponseMessage(e.getMessage());
			//返回结果为失败
			results.setSuccessful(false);
		}
		// 定义一个事务,表示这是事务的结束点
		return results;
	}

	// 测试结束方法,用于结束性能测试中的每个线程,实际运行时,每个线程仅执行一次,在测试方法运行结束后执行
	public void teardownTest(JavaSamplerContext arg0) {
	}

}
           

写好之后,将项目打个jar包,放到lib的ext下,启动jmeter。

依次右键新建线程组,右键add新增sample,Java request,右键add新增监听器,view results tree。

【压测】使用jmeter进行java性能测试

启动你的程序,接收请求。

设置压测参数:

【压测】使用jmeter进行java性能测试

2019年7月10日更新:

下面是线程耗时分析,与上面压测的不是一个程序,因为性能分析承接jmeter模拟压测,故将两部分写在一起。

启动jdk自带工具jvisualvm,推荐用1.7之后的,1.6版本的,我测试时识别不了我的java线程。

点击线程,弹出如下界面,选择抽样器标签,点击CPU,开始抽样。

【压测】使用jmeter进行java性能测试

列表为各方法耗时,点击自用时间百分比,按该列排序。

点击表格上方“快照”,弹出下图(已做过优化,没什么耗时操作)

【压测】使用jmeter进行java性能测试

可以看到,我的程序中,最耗时的是队列的take方法,因为存在阻塞,不能认为该方法就是性能瓶颈。

注意,图中的排序的线程耗时,包括调用其他方法的耗时,要看方法本身耗时,则需点击自用时间进行排序。