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

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

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

前置工作

    • Linux & MacOS X

      • vim ~/.profile
      • 在文件末尾增加以下代码:

        export JMETER_HOME=/yourpath/apache-jmeter-x.y
        #yourpath是你的Jmeter解压目录
        #x.y是Jmeter版本,当然你也可以重命名此目录
      • 运行以下命令使配置生效

        source ~/.profile
      • 在命令行输入 jemeter -v,如果打印出Jmeter的版本信息,说明环境配置成功
    • Windows
      • 计算机-属性-高级系统设置-环境变量
      • 点击新建,变量名输入:JMETER_HOME,变量值输入你的Jmeter解压路径
      • 点击确定,然后编辑path,在变量值末尾加上%JMETER_HOME%\bin
      • 设置好之后,验证一下配置是否成功,打开DOS窗口输入 jemeter -v,如果打印出Jmeter的版本信息,说明环境配置成功

必须要了解的一些信息

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

 -h, --help
                print usage information and exit
         #打印帮助信息 
        -v, --version
                print the version information and exit
          #打印版本信息
        -p, --propfile {argument}
                the jmeter property file to use
          #运行时指定property文件,默认是使用JMETER_HOME/bin目录下的jmeter.properties,如果用户自定义有其它的配置,在这里加上
          #用法如下: -p user.properties
        -q, --addprop {argument}
                additional property file(s)
          #其它配置文件,如JVM参数等等
        -t, --testfile {argument}
                the jmeter test(.jmx) file to run
          #要运行的jmeter脚本
        -j, --jmeterlogfile {argument}
                the jmeter log file
          #指定记录jmeter log的文件,默认为jmeter.log
        -l, --logfile {argument}
                the file to log samples to
          #记录采样器Log的文件
        -n, --nongui
                run JMeter in nongui mode
          #以nongui模式运行jmeter
        -s, --server
                run the JMeter server
          #运行JMeter server
        -H, --proxyHost {argument}
                Set a proxy server for JMeter to use
          #代理服务器地址
        -P, --proxyPort {argument}
                Set proxy server port for JMeter to use
          #代理服务器端口
        -u, --username {argument}
                Set username for proxy server that JMeter is to use
          #代理服务器的用户名
        -a, --password {argument}
                Set password for proxy server that JMeter is to use
          #代理服务器用户名对应的密码
        -J, --jmeterproperty {argument}={value}
                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 {argument}={value}
                Define additional System properties
          #定义系统属性
        -S, --systemPropertyFile {filename}
                a property file to be added as System properties
         #通过指定的property文件定义系统属性
        -L, --loglevel {argument}={value}
                Define loglevel: [category=]level
                e.g. jorphan=INFO or jmeter.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)
          #启动远程server(如果使用此参数,将会忽略jmeter property中定义的remote_hosts)
        -d, --homedir {argument}
                the jmeter home directory to use
                #Jmeter运行的主目录
        -X, --remoteexit
                Exit 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 server is in the same subnet, if 192.x.x.x or 10.x.x.x ip addresses are used. If the server
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 may not work
correctly.
#5.确保各系统的Jmeter版本保持一致,不同版本的Jmeter将不能很好的工作

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

下图为Jmeter实际运行时的结构:

一些术语的解释:

  • 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从上面的配置中移除。

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

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

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

      1. On the slave systems, go to jmeter/bin directory and execute jmeter-server.bat (jmeter-server on
      unix). On windows, you should see a dos window appear with “jre\[version]\bin\rmiregistry.exe”.
      If this doesn‘t happen, it means either the environment settings are not right, or there are
      multiple JRE installed on the system. Note: [version] would be the jre version installed on the
      system.
      1. Open jmeter-server.bat in a text editor
      2. go to line 44 and find “:setCP”
      3. edit “START rmiregistry” to the full path. Example: “START
      C:\<JAVA_HOME>\jre\bin\rmiregistry”

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

  2. 在客户端以gui模式启动jmeter,然后打开或者创建一个测试脚本
  3. 从gui模式启动所有的远程server,方法:运行-远程全部启动,看下图,也可以单独启动某一个jmeter-server
    • 如果有jmeter-server没有启动或者配置有问题,那么这次测试不会运行,会报以下错误(我这里是没有在140这台机器上启动Jmeter-server):
    • 启动成功后,在运行jmeter-server上的机器上可以看到以下日志输出
  4. 至此,脚本调试完成,关掉Jmeter GUI(先通过GUI停掉远程已经开启的jmeter-server)
  5. 进入测试脚本所在的目录,执行以下命令
    • 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个线程,这样可能跟你的预期有所差别。

在实践中发现,通过对Jmeter进行设置调优,单台客户机的并发数也很不错,后面抽空专门写一篇关于Jmeter调优的文章。

欢迎阅读转载此文,如对文中所述有疑问或者有不明白的地方,请留言提出或者联系我:[email protected]

时间: 2024-10-13 16:05:12

Jmeter以non-gui模式进行分布式测试的相关文章

【转】 JMeter学习(三十)以non-gui模式进行分布式测试

由于Jmeter是一个纯Java的应用,用GUI模式运行压力测试时,对客户端的资源消耗是相当惊人的,所以在进行正式的压测时一定要使用non-gui模式运行,如果并发数很高或者客户端的硬件资源比较一般的话,还可以以server模式用多个client进行分布式测试.一直有朋友问我这个分布式测试要怎么用,我就结合官方文档和自己的实际经验来谈一谈. 首先请先确保你的系统中环境都准备好了,否则在执行下文中的一些操作时可能会有一些异常抛出导致脚本执行失败 前置工作 JAVA_HOME正确设置(如果不会,请自

性能测试--Jmeter的Non GUI模式、集群

Jmeter的Non GUI模式.集群 一.Non GUI模式 1.一般情况下在NonGUI模式下运行jmeter,有两个好处: 节省系统资源,能够产生更大的负载 可以通过命令行参数对测试场景进行更精细的配置 2.示例: 使用上一篇博文中smile task的查看所有task的脚本作为例子演示non gui模式 jmeter -n -t scripts/c7/all_tasks.jmx -l scripts/c7/all_tasks_res.jtl -e -o scripts/c7/report

jmeter的non-gui模式分布式测试

由于Jmeter是一个纯JAVA的应用,用GUI模式运行压力测试时,对客户端的资源消耗是相当惊人的,所以在进行正式的压测时一定要使用non-gui模式运行, 如果并发数很高或者客户端的硬件资源比较一般的话,还可以以server模式用多个client进行分布式测试. 准备工作 配置JMETER_HOME,步骤: Linux & MacOS X vim ~/.profile 在文件末尾增加以下代码: export JMETER_HOME=/yourpath/apache-jmeter-x.y #yo

使用非 GUI 模式运行 JMeter 压力测试

使用非 GUI 模式,即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资源.使用命令jmeter -n -t <testplan filename> -l <listener filename> 这里是我们使用非 GUI 模式运行测试脚本时可以使用的一些命令: -h 帮助 -> 打印出有用的信息并退出 -n 非 GUI 模式 -> 在非 GUI 模式下运行 JMeter -t 测试文件 -> 要运行的 JMeter 测试脚本文件 -l 日志文件 -

使用非GUI模式运行jmeter测试脚本

使用非 GUI 模式,即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资源.使用命令jmeter -n -t <testplan filename> -l <listener filename>(比如 jmeter -n -t testplan.jmx -l listener.jtl)        我的第一次使用命令行执行测试脚本时,看到的输出如下:D:\Jmeter\bin> jmeter -n -t testplan.jmx -l listener.jt

Jmeter 分布式测试

Jmeter 是Java 应用,对于CPU和内存的消耗比较大,因此,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至会引起JAVA内存溢出错误.为了让jmeter工具提供更大的负载能力,jmeter短小精悍一有了使用多台机器同时产生负载的机制. 那么,是如何实现多台负载机同时运行的呢?当然不会多个人坐在多台负载机面前,一喊开始,大家同时启动jmeter.这种方式很笨,也很难达到真正的同步.其实,我们通过单个jmeter 客户端就可以控制多个远程的jmeter服务

Jmeter分布式测试

在使用Jmeter进行性能测试时,如果并发数比较大(比如最近项目需要支持1000并发),单台电脑的配置(CPU和内存)可能无法支持,这时可以使用Jmeter提供的分布式测试的功能. 一.Jmeter分布式执行原理: 1.Jmeter分布式测试时,选择其中一台作为调度机(master),其它机器做为执行机(slave). 2.执行时,master会把脚本发送到每台slave上,slave 拿到脚本后就开始执行,slave执行时不需要启动GUI,我理解它应该是通过命令行模式执行的. 3.执行完成后,

【Fine原创】JMeter分布式测试中踩过的那些坑

最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈,一般线程加到100左右就会出现工具本身无法支撑的问题,广泛了解解决办法后,发现分布式部署测试机仍是首选方案. 关于如何配置jmeter分布式部署测试机很多博客上已经描述得很详细了,这里就不再赘述,可以参考虫师的博客: http://www.cnblogs.com/fnng/archive/2012/

Jmeter的分布式测试

一. 分布式测试 分布式应用(distributed application)指的是应用程序分布在不同计算机上,通过网络来共同完成一项任务的工作方式.性能测试当中,负载机的性能会对性能测试的执行产生影响.作为Java应用程序,Jmeter运行时也需要一定的资源,当性能测试的模拟的并发过大时,负载机的CPU,内存等会被大量消耗,经常会出现Java内存溢出的错误,往往导致负载机成为测试瓶颈.Jmeter提供了分布式操作的功能,用户可以通过扩展负载机的方式来解决单台机器负载过大的问题. 二. Jmet