天天看點

【壓測】使用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方法,因為存在阻塞,不能認為該方法就是性能瓶頸。

注意,圖中的排序的線程耗時,包括調用其他方法的耗時,要看方法本身耗時,則需點選自用時間進行排序。