以non-gui模式进行分布式测试

“欢迎勾搭心月小姐姐,了解近期开班”

由于Jmeter是一个纯JAVA的应用,用GUI模式运行压力测试时,对客户端的资源消耗是相当惊人的,所以在进行正式的压测时一定要使用non-gui模式运行,如果并发数很高或者客户端的硬件资源比较一般的话,还可以以server模式用多个client进行分布式测试。一直有朋友问我这个分布式测试要怎么用,我就结合官方文档和自己的实际经验来谈一谈。

首先请先确保你的系统中环境都准备好了,否则在执行下文中的一些操作时可能会有一些异常抛出导致脚本执行失败。

前置工作

JAVA_HOME正确设置(如果不会,请自行google)

JMeter及相关插件已安装好(对此步有疑问的,请移步到我的另一篇博客使用Jmeter创建ActiveMQ JMS POINT TO POINT请求,环境搭建、请求创建、插件安装、监听服务器资源等)

配置JMETER_HOME,步骤:

计算机-属性-高级系统设置-环境变量

点击新建,变量名输入:JMETER_HOME,变量值输入你的Jmeter解压路径

点击确定,然后编辑path,在变量值末尾加上%JMETER_HOME%\bin

设置好之后,验证一下配置是否成功,打开DOS窗口输入 jemeter -v,如果打印出Jmeter的版本信息,说明环境配置成功

vim ~/.profile

在文件末尾增加以下代码:

export JMETER_HOME

=/yourpath/apache-jmeter-x.y

#yourpath是你的Jmeter解压目录

#x.y是Jmeter版本,当然你也可以重命名此目录

运行以下命令使配置生效

source ~/.profile

在命令行输入 jemeter -v,如果打印出Jmeter的版本信息,说明环境配置成功

Linux & MacOS X

Windows

必须要了解的一些信息

既然是要通过non-gui模式运行,那么我们就不得不去了解下在non-gui模式下jmeter命令的参数,下面是Jmeter官方文档中列出来的一些参数,中文注释部分为我加入的解释

-h, --help

printusage information

andexit#打印帮助信息

-v, --version

printthe version information

andexit#打印版本信息

-p, --propfile the jmeter property file to use

#运行时指定property文件

默认是使用JMETER_HOME/bin

目录下的jmeter.properties,

如果用户自定义有其它的配置,在这里加上

#用法如下: -p user.properties

-q, --addprop additional property file(s)

#其它配置文件,如JVM参数等等

-t, --testfile the jmeter test(.jmx) file to run

#要运行的jmeter脚本

-j, --jmeterlogfile the jmeter log file

#指定记录jmeter log的文件,默认为jmeter.log

-l, --logfile the file to log samples to

#记录采样器Log的文件

-n, --nongui

run JMeter

innongui mode

#以nongui模式运行jmeter

-s, --serverrun the JMeter server

#运行JMeter server

-H, --proxyHost

Set a proxy server

forJMeter to use

#代理服务器地址

-P, --proxyPort

Set proxy server port

forJMeter to use

#代理服务器端口

-u, --username

Set username

forproxy server that JMeter

isto use

#代理服务器的用户名

-a, --password

Set password

forproxy server that JMeter

isto use

#代理服务器用户名对应的密码

-J, --jmeterproperty

=Define additional JMeter properties

Define additional JMeter properties

#定义额外的Jmeter属性

-G, --globalproperty (argument)[=(value)]Define Global properties (sent to servers)

e.g.-Gport=123

or-Gglobal.properties

#定义发送给server的全局属性

#如:-Gport=123 或者-Gglobal.properties

(指定监听server的端口)

-D, --systemproperty =Define additional System properties

#定义系统属性

-S, --systemPropertyFile a property file to be added as System properties

a property file to be added as System properties

#通过指定的property文件定义系统属性

-L, --loglevel =Define loglevel: [category=]level

e.g. jorphan=INFO

orjmeter.util=DEBUG

#定义日志等级

-r, --runremote (non-GUI only)

Start remote servers

(as defined by the jmeter

property remote_hosts)

#启动远程server

(在jmeter property中定义好的remote_hosts),

公在non-gui模式下此参数才生效

-R, --remotestart server1,

... (non-GUI only)Start these remote servers

(overrides remote_hosts)

Start these remote servers

(overrides remote_hosts)

#启动远程server

(如果使用此参数,将会忽略jmeter property

中定义的remote_hosts)

-d, --homedir

the jmeter home directory to use

#Jmeter运行的主目录

-X, --remoteexitExit the remote servers at end of test (non-GUI)

#测试结束时,退出(在non-gui模式下)

配置jmeter client & server

了解了上面的各个参数后,开始配置分布式测试

先看一下官方文档是怎么说的,中文为我添加的注释:

1. the firewalls on the systems are turned off.

#1.关闭防火墙

2. all the clients are on the same subnet.

#2.所有的客户端都在同一个子网内

3. the serveris

inthe same subnet,

if192.x.x.x

or10.x.x.x ip addresses are used.

If the server doesn

doesn't use 192 or 10 ip address,

there shouldn't be any problems.

#3.server也必须在同一子网内如果使用

192.x.x.x或者10.x.x.x这样的IP地址,

如果server没有使用192或者10这样的IP地址,

(server同client不在同一子网内)

将不会有任何问题

4. Make sure JMeter can access the server.

#4.确保Jmeter可以访问到server

5. Make sure you use the same version

of JMeter on all the systems.

Mixing versions maynotworkcorrectly.correctly.

#5.确保各系统的Jmeter版本保持一致,

不同版本的Jmeter将不能很好的工作

分布式测试的思想为:一台master主机初始化测试并控制多个slave系统,下图为服务器和客户端的结构示意图:

一些术语的解释:

master,以GUI模式运行,同时控制测试的运行,在这里就是client,启动脚本所在的那台机器。

slave,运行jmeter-server并从master接收指令、向目标服务器发送请求

设置jmeter-server:

用文本编辑器打开JMETER_HOME/bin目录下的jmeter.properties文件,添加运行jmeter-server的主机IP到remote-hosts

remote_hosts=10.0.0.158, 10.0.0.140,localhost

如果你不希望你的客户端也作为jmeter-server运行的话,把localhost从上面的配置中移除。

写了这么多,下面进行实战阶段:

将配置在remote_hosts中的机器上的jmeter-server启动(windows以管理员身份运行JMETER_HOME/bin目录下的jmeter-server.bat,linux&macos下运行JMETER_HOME/bin目录下的jmeter-server)

这里多说一句,官方文档中有这样一个配置

实际上这一步是可以省略掉的(我使用的版本为2.13),文档中的行数也不对,应该是以前版本的了吧,当然配置一下也没问题

在客户端以gui模式启动jmeter,然后打开或者创建一个测试脚本。从gui模式启动所有的远程server,方法:运行-远程全部启动,看下图,也可以单独启动某一个jmeter-server

如果有jmeter-server没有启动或者配置有问题,那么这次测试不会运行,会报以下错误(我这里是没有在140这台机器上启动Jmeter-server):

启动成功后,在运行jmeter-server上的机器上可以看到以下日志输出

至此,脚本调试完成,关掉Jmeter GUI(先通过GUI停掉远程已经开启的jmeter-server。进入测试脚本所在的目录,执行以下命令

jmeter -t "JMS Point-to-Point.jmx" -n -l testresult.csv -r

运行成功后,在客户端机器上可以看到以下Log输出:

至此,以经通过non-gui模式运行Jmeter分布式测试了

这里有一点小贴士:以分布式运行Jmeter,是在所有的server上运行同样的测试脚本,也就是说,如果你打算1s起100个线程,如果你用5台机器进行分布式测试,那么将脚本调试至1s起20个线程,否则则是1s起了500个线程,这样可能跟你的预期有所差别。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180313B15E1P00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券