性能测试:JMeter实用指南(安装/脚本实例/分布式压测)

一. JMeter安装

【Mac 安装】

  1. 安装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/
  1. 安装JMeter
    进入JMeter的下载页面
    在这里插入图片描述

    下载完成,并解压。
    启动
    进入解压后的文件夹,进入bin目录下执行:
➜  ~ sh jmeter

即可启动JMeter

在这里插入图片描述

设置中文显示
修改JMeter文件夹bin目录下的jmeter.properties文件

//修改前
#language=en 
//修改后
language=zh_CN

重新启动JMeter,即可看到中文界面:

在这里插入图片描述

【Linux 安装】

  1. 安装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)
  1. 安装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均完成下列操作:

  1. 安装好JMeter;
  2. 修改jmeter安装文件夹下bin目录中的jmete.properties
//修改
server.rmi.ssl.disable=true
  1. 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)配置

  1. 本地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
  1. bin目录下执行:jmeter.sh,重新启动
  2. 运行-远程启动中可看到配置的两个slave


    在这里插入图片描述
  3. 选择一个的话,将启动其中一个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


    在这里插入图片描述
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容