基本測試原理: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。
啟動你的程式,接收請求。
設定壓測參數:
2019年7月10日更新:
下面是線程耗時分析,與上面壓測的不是一個程式,因為性能分析承接jmeter模拟壓測,故将兩部分寫在一起。
啟動jdk自帶工具jvisualvm,推薦用1.7之後的,1.6版本的,我測試時識别不了我的java線程。
點選線程,彈出如下界面,選擇抽樣器标簽,點選CPU,開始抽樣。
清單為各方法耗時,點選自用時間百分比,按該列排序。
點選表格上方“快照”,彈出下圖(已做過優化,沒什麼耗時操作)
可以看到,我的程式中,最耗時的是隊列的take方法,因為存在阻塞,不能認為該方法就是性能瓶頸。
注意,圖中的排序的線程耗時,包括調用其他方法的耗時,要看方法本身耗時,則需點選自用時間進行排序。