一. JMeter安装
【Mac 安装】
- 安装JDK
进入Java 8的下载页面,如下图,选择适用于Mac OS的JDK版本,点击下载:
下载后打开文件进行安装,【继续】下一部即可:
安装完成后打开终端,输入如下命令检查是否安装成功:
//检查JDK版本
➜ ~ java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
配置Java环境变量
打开终端,输入如下命令:
//打开环境变量配置文件
➜ ~ vim .bash_profile
在.bash_profile文件中进行环境变量的配置,输入以下代码
export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home # 等号右边的路径目录,可以通过/usr/libexec/java_home -V这个命令得到
export JAVA_HOME=$JAVA_8_HOME # 设置一个中间变量,为了方便多个JDK版本时更换JAVA_HOME
export PATH=$JAVA_HOME/bin:$PATH:. #冒号前代表JDK目录下的bin目录,冒号后代表当前目录
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
按【esc】输入:wq,保持退出后继续在终端输入:
//使配置文件立即生效
➜ ~ source ~/.bash_profile
//检查配置是否成功
➜ ~ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home/
- 安装JMeter
进入JMeter的下载页面:
下载完成,并解压。
启动
进入解压后的文件夹,进入bin目录下执行:
➜ ~ sh jmeter
即可启动JMeter
设置中文显示
修改JMeter文件夹bin目录下的jmeter.properties文件
//修改前
#language=en
//修改后
language=zh_CN
重新启动JMeter,即可看到中文界面:
【Linux 安装】
- 安装JDK
进入Java 8的下载页面,如下图,选择适用于Linux的JDK版本,点击下载:
下载后需把压缩文件上传到linux系统,并解压文件
# unzip jdk-8u221-linux-x64.tar.gz
配置系统变量
# vim /etc/profile
添加如下代码:
export JAVA_HOME=/server/java/default //填写jdk解压地址
export CLASSPATH=$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin
按【esc】输入:wq!保持退出,输入:
//使变量立即生效
# source /etc/profile
查看是否安装成功
# java -version
[root@ci15-test-test-ds ~]# java -version
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
-
安装JMeter
将JMeter的压缩包上传到Linux服务器,并解压,解压后进入其bin目录下:
说明已安装成功。
二. 第一个压测脚本
下面是我的测试计划:
-
HTTP请求默认值:指定请求的协议/IP/端口号,线程组接口里面的公共参数
-
HTTP信息头管理器:发送请求的公共请求头信息
- 仅一次控制器:因为授权登陆接口执行一次,获取到token即可,因此使用逻辑控制器:仅一次控制器,限制仅发送一次该请求。
接口:授权登陆
-
参数使用自定义变量
变量在测试计划中定义:
本接口的响应:
-
添加响应断言
- 添加JSON提取器,获取接口返回数据token
接口:首页 -
【首页】接口添加HTTP信息头管理器,参数中添加上个请求中获取到的token
- 添加【首页】接口响应断言
线程组配置
线程组元件是任何一个测试计划的开始点。在一个测试计划中的所有元件都必须在某个线程组下。线程组元件控制 JMeter 执行你的测试计划时候使用的线程数量。
- Ramp-Up:指示 JMeter 用于达到全部选择的线程的时间。如果选择了 10 个线程,并且 ramp-up period 是 100 秒,那么 JMeter 将使用 100 秒使 10 个线程启动并运行。每个线程将在前一个线程启 动后 10(100/10)秒后启动。
这里设置线程:5,循环次数:10,即5*10=50个并发用户。
然后,给线程组添加监听器:察看结果树,聚合报告。
启动项目:
-
在察看结果树中可看到请求是否成功
-
聚合报告察看本次并发下接口的一些性能数据
plugins插件:服务器性能监控
服务器资源使用情况(比如:cpu memory I/O)的监控,需要通过JMeter的plugins插件来实现。
- 客户端:通过PerfMon Metrics Collector监听器进行服务器性能数据显示,通过安装插件添加
- 服务端(被测服务):下载ServerAgent,进行数据采集
客户端安装
点击访问,下载JMeterPlugins-Standard和JMeterPlugins-Extras:
解压复制JmeterPlugins-Extras.jar、JmeterPlugins-Standard.jar到Jmeter文件夹的lib/ext路径下。
重启JMeter后,在监听器中可看到Perfmon Metrics Collector,客户端配置成功
服务器端安装
点击下载ServerAgent-2.2.3.zip,把下载的文件上传到被测服务器,并解压。
进入解压后的文件夹,执行如下命令
// 修改脚本执行权限
# chmod 777 startAgent.sh
// 运行
# ./startAgent.sh
INFO 2019-07-26 11:22:44.243 [kg.apc.p] (): Binding UDP to 4444
INFO 2019-07-26 11:22:45.250 [kg.apc.p] (): Binding TCP to 4444
INFO 2019-07-26 11:22:45.259 [kg.apc.p] (): JP@GC Agent v2.2.3 started
测试ServerAgent启动情况:
笔记本终端打开telnet监听
➜ ~ telnet 10.103.27.98 4444
Trying 10.103.27.98...
Connected to 10.103.27.98.
Escape character is '^]'.
test //输入test,测试
Yap // 成功显示:Yap
服务器端查看是否接收到数据:
INFO 2019-07-26 15:42:09.726 [kg.apc.p] (): Binding UDP to 4444
INFO 2019-07-26 15:42:10.736 [kg.apc.p] (): Binding TCP to 4444
INFO 2019-07-26 15:42:10.745 [kg.apc.p] (): JP@GC Agent v2.2.3 started
INFO 2019-07-26 15:42:21.780 [kg.apc.p] (): Accepting new TCP connection
INFO 2019-07-26 15:42:56.544 [kg.apc.p] (): Yep, we received the 'test' command
说明ServerAgent打开成功
客户端添加监控并使用
- 把线程组设为无限循环
- 添加“jp@gc - PerfMon Metrics Collector”监听器
- 添加要监控的项目,如CPU、内存等,一行选择一种添加监听项
-
指定数据保存文件
然后运行测试计划,即可得到服务器端资源的监控数据:
无界面的压测脚本执行
登陆服务器,进入jmeter,新建两个文件夹
- script:存放压测脚本
- result:存放运行结果
将上面写好的jmx脚本文件放到新建的script文件夹,然后进入script目录下,执行:
# jmeter -n -t xw_login_home.jmx -l ../result/xw_login_home_100_60s.jtl
参数说明:
- -n表示以nogui方式运行测试计划
- -t表示测试计划,后面跟测试计划名称
- -l表示测试结果,后面跟测试结果文件名称
Creating summariser <summary>
Created the tree successfully using xw_login_home.jmx
Starting the test @ Fri Jul 26 16:27:03 CST 2019 (1564129623152)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary + 1 in 00:00:01 = 1.2/s Avg: 451 Min: 451 Max: 451 Err: 0 (0.00%) Active: 1 Started: 1 Finished: 0
summary + 55 in 00:00:30 = 1.9/s Avg: 41 Min: 18 Max: 384 Err: 0 (0.00%) Active: 1 Started: 6 Finished: 5
summary = 56 in 00:00:30 = 1.8/s Avg: 49 Min: 18 Max: 451 Err: 0 (0.00%)
summary + 54 in 00:00:24 = 2.3/s Avg: 34 Min: 17 Max: 402 Err: 0 (0.00%) Active: 0 Started: 10 Finished: 10
summary = 110 in 00:00:54 = 2.0/s Avg: 42 Min: 17 Max: 451 Err: 0 (0.00%)
Tidying up ... @ Fri Jul 26 16:27:58 CST 2019 (1564129678354)
... end of run
- summary+ 是开始这个时点的报告
- summary= 是总结它之前的报告,呈现出的是当前时点之前总的情况,通常是均值
- 最后一个summary=是本次压测总的情况,如果脚本按时正常结束的话,最后一次summary里面的值应该和你从GUI打开聚合报告或概括报告的值一致
运行结束后result文件夹下生成结果文件xw_login_home_100_60s.jtl,可下载到本地GUI环境查看。
新建测试计划-添加线程组-添加监听器:聚合报告/察看结果树/PerMon Metrics Collector
每个监听器版面点击【浏览】按钮,选择下载的jtl文件,即可看到运行结果数据,如:
JMeter分布式集群:部署多台机器性能压测
分布式原理
- 客户端机器作为一个控制器controller,控制多台slave机器的操作
- controller通过GUI界面启动slave机器,将jmeter压测发送给每台启动的slave,slave获得脚本后开始执行。slave本地不需预先存储脚本
- 各台slave执行完成后,将结果传回给controller,controller收集整合显示
本次实践应用服务
- Cotroller:本地笔记本
- slave服务1:10.103.27.27
- slave服务2:10.103.27.34
- 被测服务:10.103.27.98
服务器(slave)配置
每个slave均完成下列操作:
- 安装好JMeter;
- 修改jmeter安装文件夹下bin目录中的jmete.properties
//修改
server.rmi.ssl.disable=true
- bin目录下执行
//hostname为当前服务的ip
# ./jmeter-server -Djava.rmi.server.hostname=10.103.27.15
显示如下为成功启动
# ./jmeter-server -Djava.rmi.server.hostname=10.103.27.15
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[10.103.27.15:40714](local),objID:[35bf8b0b:16c2dac5d2b:-7fff, -8848807356610081160]]]
客户端(controller)配置
- 本地JMeter安装文件夹bin目录下修改jmete.properties:
- server.rmi.ssl.disable=true
- remote_hosts=10.103.27.15,10.103.27.34 //两个slave的ip,逗号分隔
- server.rmi.localport=1099
- server_port=1099
- bin目录下执行:jmeter.sh,重新启动
-
运行-远程启动中可看到配置的两个slave
- 选择一个的话,将启动其中一个slave运行。点击下方的:远程启动所有,两个slave将同时启动,运行后,服务器端可看到:
- slave1
# ./jmeter-server -Djava.rmi.server.hostname=10.103.27.15
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[10.103.27.15:40714](local),objID:[35bf8b0b:16c2dac5d2b:-7fff, -8848807356610081160]]]
Starting the test on host 10.103.27.15 @ Fri Jul 26 18:09:09 CST 2019 (1564135749452)
Finished the test on host 10.103.27.15 @ Fri Jul 26 18:10:53 CST 2019 (1564135853170)
- slave2
# ./jmeter-server -Djava.rmi.server.hostname=10.103.27.34
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[10.103.27.34:33181](local),objID:[-762268b2:16c2da85fd4:-7fff, 61746913375076529]]]
Starting the test on host 10.103.27.34 @ Fri Jul 26 18:08:48 CST 2019 (1564135728007)
Finished the test on host 10.103.27.34 @ Fri Jul 26 18:10:31 CST 2019 (1564135831607)
-
controller