基本测试原理: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方法,因为存在阻塞,不能认为该方法就是性能瓶颈。
注意,图中的排序的线程耗时,包括调用其他方法的耗时,要看方法本身耗时,则需点击自用时间进行排序。