JMeter压力测试
Jmeter官网下载地址:https://archive.apache.org/dist/jmeter/binaries/
本系统采用最新版本4.0进行设置,在解压完成后,在Linux环境下运行$JMETER_HOME/bin/jmeter.sh;对于Windows系统,则运行%JMETER_HOME%\bin\jmeter.bat。
需要注意的是,JMeter4.0需要Java8的支持
JMeter支持简体中文

**
**
一 线程组配置
线程组用来控制并发请求量

线程组配置页面如下

下面介绍下每个选项的含义
Number of Threads(users):
启动线程数,每个线程模拟一个用户
Ramp-Up Period(in seconds):
上坡周期参数设计是为了避免一次性启动大量进程对系统造成压力。在JMeter测试环境中,默认支持设定一定的上坡速率来逐步加载测试数据源。为了便于理解这个概念,默认情况下我们可以举个例子:当配置运行10个进程时,默认的上坡速率设定了较为陡峭的斜率(即上坡周期设为默认值),这样系统会在每隔一定时间(如默认值下可能是秒级)就开启下一个进程,在总用时约十秒内完成全部十进程的开启过程;如果将该斜率调至较为平缓(即延长上坡周期至几十秒),则系统将在相应的时间间隔内完成全部进程的开启任务;如果将该参数设至零,则表示系统会在测试开始时不加选择地立即打开所有的进程中
Loop Count:
则该线程将一直运行直至手动终止测试流程。
Delay Thread creation until needed:
等到必要时才建立(其中,“该选项”指代系统初始化功能,“Ramp-Up Period”指代启动进程的时间段设置)这两者之间并无冲突关系。如果未选择此选项,则JMeter系统将在测试运行前就准备好所需的所有进程,在随后依据设定好的“Ramp-Up Period”参数来启动相应的进程。相反地,在选择此选项后,则会按照设定好的“Ramp-Up Period”参数来依次建立并启动进程序列而非立即全部准备就绪后再逐一执行
按需延迟线程的创建过程;通过设置固定的时间间隔来管理任务执行;特别提醒您注意避免不必要的延遲;请务必避免设置过长的时间间隔;确保不会对系统性能造成负面影响。
Duration(seconds):
测试周期长度。当Loop Count设置为Forever时,则基于Duration参数进行计算。若未选择Forever选项,则Loop Count的执行优先级将高于Duration参数。
Startup delay(seconds):
在测试延迟启动时间时不会对Ramp-Up Period产生任何影响。建议按照以下步骤配置系统参数:首先将 Startup delay字段设置为10秒,并将Ramp-Up Period字段设定为20秒。在执行测试期间,请确保在等待10秒后逐步启动每一个线程(每隔2秒启动一个),这样总共耗用20秒的时间来完成所有线程的初始化过程,在完成所有线程的初始化后整个流程总共耗费了30秒钟的时间
二 样本(Sampler)配置
JMeter支持设置不同类型的测试样本,并可为每个测试样本指定特定的服务类型进行压力测试。如HTTP协议、TCP协议等都得到了支持。

下面挑常见的进行介绍
1 HTTP样本(HTTP Request)
HTTP样本可以直接配置在页面上,在测试过程中应确保启用KeepAlive选项这可能会对测试结果产生显著影响

在Advanced选项中可以设置网络连接和响应的超时参数;这一设置将对统计指标产生重要影响

2 JAVA程序样本(Java Request)
在开发过程中使用JDK实现时,要求我们必须继承基于JMeter框架提供的基础类来构建测试样本,请参考下面的示例代码以获取具体实现方式。
package com.sean;
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.StringUtils;
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;
import java.util.Random;
/** * Created by sean on 2018/5/20.
*/
public class Test extends AbstractJavaSamplerClient {
private String name = null;
private int base = 0;
private Random random = new Random(33);
// 每个线程启动时执行一次
@Override
public void setupTest(JavaSamplerContext context) {
name = Thread.currentThread().getName();
System.out.println(name + " started. random code:" + random.hashCode());
}
// 设置Java Request中可以配置的参数及其默认值
@Override
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("base","0");
return params;
}
@Override
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
System.out.println(name + " run test. random code:" + random.hashCode());
// 用来保存本次样本的执行结果,该结果可在Results Tree或Summary中查看
SampleResult sr = new SampleResult();
// 获取Java Request中配置的参数值
String arg = javaSamplerContext.getParameter("base");
if(StringUtils.isNotBlank(arg))
base = Integer.valueOf(arg);
// 记录请求参数
String jsonReq = JSON.toJSONString(base);
sr.setSamplerData(jsonReq);
// 开始统计样本响应时间
sr.sampleStart();
int result = base + random.nextInt();
// 统计样本响应时间结束
sr.sampleEnd();
// 样本执行结果
String jsonResult = JSON.toJSONString(result);
sr.setResponseData(jsonResult, "utf-8");
sr.setDataType(SampleResult.TEXT);
// 样本是否执行成功
if(result > 0)
sr.setSuccessful(true);
else
sr.setSuccessful(false);
return sr;
}
// 每个线程关闭时执行一次
@Override
public void teardownTest(JavaSamplerContext context) {
System.out.println(name + " stopped.");
}
}
POM文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sean</groupId>
<artifactId>jmeter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>jmeter</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>4.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
在JMeter的工作目录中,安装至指定位置下的已打包好的JAR文件,并将其配置为位于JMETER_HOME/lib/ext目录中;同时,在JMeter的工作目录下安装fastjson依赖包至JMETER_HOME/lib指定位置
请执行以下操作:首先执行JMeter启动命令;其次设置Java客户端请求配置;最后在classname中应指定runTest方法所属的类名。

在Send Parameters With the Request功能中可以设置相关参数。需要注意的是该参数必须预先通过getDefaultParameters方法进行定义后才能进行设置。其中使用的都是基于JMeter内置的功能,并且这些功能可以通过JMeter内置的帮助功能来生成。
在Send Parameters With the Request功能中可以设置相关参数。需要注意的是该参数必须预先通过getDefaultParameters方法进行定义后才能进行设置。其中使用的都是基于JMeter内置的功能,并且这些功能可以通过Jmeter内置的帮助功能来生成

设置2个线程,每个线程循环5次,执行结果如下

**
**
三 监听测试结果
JMeter可以按多种维度统计测试结果

比较常用的有下面两种
View Results Tree(查看结果树)中能看见每个样本的执行状态

各个指标的具体数值都是通过运行runTest方法时被我们手动地记录在SampleResult对象里的
Aggregate Resport(聚合报告)

Samples:样本执行次数
Average:样本执行时间(ms)
Error %:样本执行成功率
Throughput:吞吐量
四 Linux下执行JMeter
将配置好的Test Plan被保存,并上传至Linux服务器的指定位置;样本和依赖的JAR包放置在与Windows环境相同的目录中,并运行该计划
sh jmeter.sh -n -t loadTest.jmx -l result.jtl
在以下说明中,请注意以下参数设置:-n对应于非图形界面操作;-t对应于测试配置文件;-l对应于执行结果文件。将result.jtl文件导入到JMeter后即可查看执行结果
五 JMeter插件安装
1 直接下载插件
安装插件压缩包,并将解压出来的jar包放置于%JMeter_home%\lib\ext路径下。完成这些步骤后,请重新启动JMeter即可完成设置。
2 通过Plugins Manager管理插件
安装 Plugins 管理器(其本身亦为 JMeter 插件)。访问 https://jmeter-plugins.org/install/ 进行下载,并将该模块配置到 %JMeter_home%\lib\ext 文件夹内。安装完成后重启 JMeter 可在 Options 选项卡中找到 Plugins Manager 选项。


重点向大家介绍一下PerfMon这个插件。它是一款专门用于服务器系统状态监控的工具软件。通过安装该官方全称软件后,在执行压力测试的同时也能实时监控服务器的整体运行状态。具体来说,在安装使用过程中我们能够同时支持压力测试和系统状态监控两大功能。
1 配置一个新的监听PerfMon Metrics Collector

可以选择性地设置目标服务器IP地址,并指定要监听的端口(默认为4444),以收集相关信息。

2 下载、运行服务端Server Agent
Perfect Mon Server Proxy Agent的获取位置位于GitHub上的perfmon-agent项目的README.md文件的位置。
解压之后运行$SERVER_AGENT_HOME\startAgent.sh即可
sean@sean:~/jmeter server agent$ sh startAgent.sh &
在执行压力测试后,即可在PerfMon Metrics Collector中实时获取相关属性数据。设置页面中可调整一些与图像相关的展示参数。
在执行压力测试后,即可在PerfMon Metrics Collector中实时获取相关属性数据。设置页面中可调整一些与图像相关的展示参数。

