Jmeter远程测试
11.3 详解JMeter远程测试(1)
《零成本实现Web性能测试:基于Apache JMeter》第11章JMeter进阶知识,本章内容比较宽泛,总结起来都是一些JMeter高阶知识。其中"详解JMeter函数和变量"一节,请重 点关注各种JMeter内置函数;"详解JMeter正则表达式"一节,对入门读者很重要;"详解JMeter远程测试"一节在实际工作中会经常用到,非 常重要;"详解JMeter最佳实践经验"和"一些小技巧"都是一些实践经验,供读者借鉴。本节为大家介绍JMeter远程测试。
11.3 详解JMeter远程测试(1)
如果运行JMeter客户端的机器性能不能满足测试需要,那么测试人员可以通过单个JMeter GUI客户端来控制多个远程JMeter服务器,以便对服务器进行压力测试,模拟足够多的并发用户。通过远程运行JMeter,测试人员可以跨越多台低端 计算机复制测试,这样就可以模拟一个比较大的服务器压力。一个JMeter GUI客户端实例,理论上可以控制任意多的远程JMeter实例,并通过它们收集测试数据,如图11-3所示。这样一来,就有了如下特性:
保存测试采样数据到本地机器。
通过单台机器管理多个JMeter执行引擎。
没有必要将测试计划复制到每一台机器,JMeter GUI客户端会将它发往每一台JMeter服务器。
每一台JMeter远程服务器都执行相同的测试计划。JMeter不会在执行机间做负载均衡,每一台服务器都会完整地运行测试计划。
在1.4GHz~3GHz的CPU、1GB内存的JMeter客户端上,可以处理线程100~300。但是Web Service例外。XML处理是CPU运算密集的,会迅速消耗掉所有的CPU。一般来说,以XML技术为核心的应用系统,其性能将是普通Web应用的 10%~25%。另外,如果所有负载由一台机器产生,网卡和交换机端口都可能产生瓶颈,所以一个JMeter客户端线程数不应超过100。
采用JMeter远程模式并不会比独立运行相同数目的非GUI测试更耗费资源。但是,如果使用大量的JMeter远程服务器,可能会导致客户端过载,或者网络连接发生拥塞。
请注意,假如测试人员将JMeter执行引擎安装在应用服务器(测试目标)上,那么这显然会加重应用服务器的负担,测试结果也将变得不可信。作者推 荐的方式是将JMeter远程服务器放在应用服务器(测试目标)所在的同一个网段内。这样做既可以减少JMeter收集测试结果对网络产生的冲击,又可以 避免对应用服务器(测试目标)性能产生影响。
图11-3 JMeter远程测试原理图 |
下面是启动JMeter远程测试的基本步骤:
步骤1:配置节点
确保所有节点(JMeter客户端和JMeter远程服务器)运行相同版本的JMeter。尽可能在所有操作系统上使用相同的Java版本。
如果测试用到了外部数据文件,那么请注意这些文件不会被JMeter客户端分发,因此测试人员需要确保每台执行机上都保存了这些数据文件(其所在目 录也必须正确)。如果有必要,用户可以为每台执行机设置不同的属性变量,即在JMeter远程服务器上编辑user.properties或者 system.properties文件。这些属性将会在JMeter远程服务器启动时被识别,并有可能被应用到测试计划之中,从而影响测试执行(例如, 与其他远程服务器发生交互)。另外,不同的JMeter远程服务器可能会使用不同内容的数据文件(例如,每台服务器必须使用不同的ID,就以此来划分数据 文件)。
步骤2:启动远程服务器
要启动JMeter远程节点,请在执行机上运行JMETER_HOME/bin/jmeter-server (UNIX)或者JMETER_HOME/bin/jmeter-server.bat(Windows)脚本。
请注意,每个远程节点上只能运行一个JMeter远程服务器脚本,除非采用不同的RMI端口。从JMeter 2.3.1开始,JMeter远程服务器会自己启动RMI注册;用户没有必要单独启动RMI注册。假设测试人员一定要单独启动RMI注册,可以在远程节点 上定义JMeter属性server.rmi.create=false。
默认情况下,JMeter远程服务器的RMI使用动态端口号。这样就会为防火墙配置带来麻烦,因此JMeter 2.3.2及其以后的版本,会检查JMeter属性server.rmi.localport。如果该值非零,JMeter远程服务器就会用它来作为本地 端口号。
步骤3:将JMeter远程服务器的IP地址添加到客户端属性文件中
编辑JMeter控制机的属性文件。在/bin/jmeter.properties文件中找到属性"remote_hosts",使用JMeter远程服务器的IP地址作为其属性值。可以添加多个服务器的IP地址,以逗号作为分隔。
请注意测试人员还可以使用-R命令行选项来指明将会使用的远程服务器。这与使用-r 和-Jremote_hosts={服务器列表}的效果相同。例如jmeter -Rhost1,127.0.0.1,host2。
如果测试人员定义JMeter属性server.exitaftertest=true,那么远程服务器在运行完单个测试后就会退出。-Z标志也有同样的效果,参见后面的内容。
11.3 详解JMeter远程测试(2)
步骤4(a):通过GUI客户端启动JMeter测试
现在轮到启动JMeter GUI客户端了。在MS-Windows环境下运行"bin/jmeter.bat"脚本,在UNIX环境下运行"bin/jmeter"脚本。测试人员 会发现在运行(Run)菜单下,包含两个子菜单"Remote Start"和"Remote Stop",如图11-4所示。这两个子菜单中包含测试人员在属性文件中设置的JMeter远程服务器IP地址。此刻,请使用远程启动和停止来代替普通的 JMeter启动和停止。
图11-4 运行菜单 |
步骤4(b):通过非GUI客户端启动JMeter测试
还有另外一种方法,测试人员可以通过非GUI客户端来启动远程服务器。命令如下:
- jmeter -n -t script.jmx -r
或者:
- jmeter -n -t script.jmx -R server1,server2...
其他标志可能也有用。
-Gproperty=value:在所有JMeter远程服务器中定义一个属性(可以多次出现)
-Z:在测试结束后退出远程服务器。
第一个例子会启动定义在JMeter属性remote_hosts中的远程服务器;而第二个例子会先定义远程服务器列表,接着启动它们。命令行客户端会在所有服务器停止后退出。
1.手动配置JMeter远程测试
在某些情况下,jmeter-server脚本不能正常工作(如果测试人员使用的操作系统不在JMeter开发者预期的范围内)。下面介绍如何启动JMeter远程服务器(对应上面的步骤2),其中包含了更多人工操作。
步骤2(a):启动RMI注册
从JMeter 2.3.1开始,JMeter远程服务器会自己启动RMI注册,因此这里的内容不适用于普通情况。如果要采用历史版本的操作方法,首先在JMeter远程服务器上定义JMeter属性server.rmi.create=false,并遵循如下指南。
JMeter使用Remote Method Invocation(RMI)作为远程通信机制。因此,测试人员需要用到JDK "bin"目录中的RMI注册程序(名为"rRmiregistry")。在运行Rmiregistry之前,请确保如下jar存在于测试人员的系统 claspath中:
JMETER_HOME/lib/ext/ApacheJMeter_core.jar。
JMETER_HOME/lib/jorphan.jar。
JMETER_HOME/lib/logkit-1.2.jar。
注册程序需要访问特定JMeter类。运行Rmiregistry无须参数。默认情况下应用程序会监听端口1099。
步骤2(b):启动JMeter远程服务器
一旦RMI注册程序运行起来,就启动JMeter远程服务器。JMeter启动脚本需携带"-s"选项。
步骤3和步骤4同上面的介绍。
2.一些小技巧
JMeter/RMI要求建立一个从客户端到远程服务器的连接。这就会用到测试人员所选择的端口号,默认值是1099。JMeter/RMI还要求 建立一个反向连接,目的是从远程服务器向客户端返回测试采样结果。这就会用到一个更高数字的端口号。如果在JMeter客户端与JMeter远程服务器之 间存在任何防火墙或者网络过滤器,那么测试人员就需要确保它们已经被正确配置,并允许相关连接通信。如果有必要,请使用监听软件来观察通信的过程。
如果JMeter运行在Suse Linux上,下面这些技巧对测试人员可能会有帮助。默认的安装可能会启动防火墙。在这种情况下,远程测试将无法正常工作。如果测试人员发现连接被拒绝 后,可以通过下面的选项打开debugging。从JMeter 2.3.1版本开始,RMI注册由JMeter远程服务器启动;不过相关选项依然可以通过JMeter命令行传递。例如,"jmeter -s -Dsun.rmi.loader.logLevel=verbose"(省略了-J前缀)。另外这些属性还可以被定义在 system.properties文件中。
解决的方法是从etc/hosts中删除对127.0.0.1和127.0.0.2的回送(Loopback)。 当127.0.0.2的回送无效时,jmeter-server将无法连接到Rmiregistry。
替换:
- `dirname $0`/jmeter -s "$@"
为:
- HOST="-Djava.rmi.server.hostname=[computer_name][computer_domain]
- -Djava.security.policy=`dirname $0`/[policy_file]"
- `dirname $0`/jmeter $HOST -s "$@"
11.3 详解JMeter远程测试(3)
同时创建一个规则(Qolicy)文件,添加[computer_name][computer_domain]行到/etc/hosts。
3.如何使用不同端口号
默认情况下,JMeter使用标准RMI端口号1099(这是可以改变的)。要想成功改变使用的端口号,需满足如下条件:
在远程服务器,启动Rmiregistry使用新端口号。
在远程服务器,启动JMeter并预先定义server_port属性。
在客户端,更新remote_hosts属性,在其中包含remote host:port设置。
从JMeter 2.1.1版本开始,jmeter-server脚本支持改变端口号。例如,假设测试人员希望使用端口号1664(可能因为1099端口已经被其他应用程序占用了)。
Windows系统 (DOS窗口中):
- C:\JMETER> SET SERVER_PORT=1664
- C:\JMETER> JMETER-SERVER [other options]
UNIX系统:
- $ SERVER_PORT=1664 jmeter-server [other options]
- [N.B. use upper case for the environment variable]
在这两种情况下,脚本都会在指定端口上启动Rmiregistry,接着以远程服务器模式启动JMeter,并已经定义了"server_port"属性。
选定的端口号将会被记录到远程服务器的jmeter.log文件中(Rmiregistry不会创建一个日志文件)。
4.使用采样批次
测试计划中的监听器会把它们的结果返回到JMeter客户端,而JMeter客户端默认情况下会将这些结果写入到指定文件中,采样结果会在产生后立即发回JMeter客户端。这样就会对网络和JMeter客户端产生很大的压力。用户可以通过设置一些属性,来改变默认操作。
模式(Mode)(采样结果发送模式)默认是Standard。
Standard:在采样结果产生后立即发送。
Hold:将采样结果保存在一个数组中,直到测试结束。这可能会占用远程服务器的大量内存。
Batch:当计数器或者时间超过阈值之后,发送保存的采样结果。
Statistical:当计数器或者时间超过阈值之后,以概要的形式发送采样结果;采样结果以线程组(Thread Group)名称和采样标签(Sample Label)进行概要统计。积累的数据域包括:elapsed time、latency、bytes、sample count、error count,其他数据域将会被丢弃。
Stripped:将成功采样的响应数据移除。
StrippedBatch:将成功采样的响应数据移除,并批次发送。
Custom implementation:将模式参数设置为测试人员的客户化采样发送器的类名。该类必须实现接口SampleSender,并且类的构造函数只有一个RemoteSampleListener型的参数。
如下属性会影响Batch和Statistical模式。
num_sample_threshold:一个批次中的采样数目(默认为100)。
time_threshold:等待的毫秒数(默认为60秒)。
ERROR - jmeter.gui.action.RemoteStart: Failed to initialise remote engine java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
java.net.ConnectException: Connection refused: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.newCall(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Unknown Source)
at org.apache.jmeter.engine.ClientJMeterEngine.getEngine(ClientJMeterEngine.java:54)
at org.apache.jmeter.engine.ClientJMeterEngine.<init>(ClientJMeterEngine.java:67)
at org.apache.jmeter.gui.action.RemoteStart.doRemoteInit(RemoteStart.java:180)
at org.apache.jmeter.gui.action.RemoteStart.doAction(RemoteStart.java:80)
at org.apache.jmeter.gui.action.ActionRouter.performAction(ActionRouter.java:81)
这个问题终于被我解决了,其实原因好简单呀。只要将本机的server.bat执行即可。
注意:要是在配置的地方写了127.0.0.1 的话 就要开本机的 sever.bat. 不写的话 就不用开了
4、查看1099端口是否被占用
netstat -ano | findstr "1099"
tasklist | findstr "1099"
Jmeter-server启动失败:Cannot start. Unable to get local host IP address. is a loopback address
(2012-03-30 13:51:42)
标签:
it |
分类: 性能测试:jmeter |
在Windows下启动Jmeter非常顺利,转到Linux下居然启动失败。
想起之前 遇到“/etc/hosts文件设置不对导致Jboss启动失败”,
立马把焦点指向/etc/hosts。
果然还是这个问题,贴/etc/hosts示例:
127.0.0.1 10.20.10.31 |
执行命令`hostname`查看当前机器名如果当前机器名与/etc/hosts不一致
,可手动先执行成一次`hostname
yourhostname`或直接加到jmeter-server文件中(注意机器名中不要含域信息,譬如:myname.rdev.company.com。这样设置仍然启动失败)。
由/etc/hosts文件导致启动失败的错误有:
1 |
Created remote object: UnicastServerRef [liveRef: [endpoint:[10.20.10.31:62090](local),objID:[2c639f6d:12794fca52a:-7fff, 712947915258586677]]] Server failed to start: java.rmi.RemoteException: Cannot start. higkoo is a loopback address. |
2 |
Created remote object: UnicastServerRef [liveRef: [endpoint:[10.20.10.31:38796](local),objID:[-b0d822e:12794fee8b1:-7fff, 8314597152635832475]]] Server failed to start: java.rmi.RemoteException: Cannot start. Unable to get local host IP address. |
Jmeter远程测试的更多相关文章
- 【转】JMeter远程测试
详解JMeter远程测试(1) 如果运行JMeter客户端的机器性能不能满足测试需要,那么测试人员可以通过单个JMeter GUI客户端来控制多个远程JMeter服务器,以便对服务器进行压力测试,模拟 ...
- jmeter 远程测试
如果你的JMeter客户机不能进行属性,来模拟 足够的用户强调您的服务器或在网络水平是有限的,存在一个选项来控制多个远程JMeter 引擎从一个JMeter客户机. 通过运行JMeter远程,你可以复 ...
- jmeter分布式测试教程和远程的代理机无法连接网络的问题解决方法
一.Jmeter分布式执行原理: 1.Jmeter分布式测试时,选择其中一台作为控制机(Controller),其它机器做为代理机(Agent). 2.执行时,Controller会把脚本发送到每台A ...
- 【Fine原创】JMeter分布式测试中踩过的那些坑
最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈, ...
- Jmeter分布式测试搭建(二)
Jmeter运行的时候十分耗内存和cpu,跑到500多个进程的时候,就卡死了.我们测试时,如果进行大数据量的并发测试时,单个电脑的CPU和内存可能无法承受,这个时候,我们需要进行一个分布式的测试,比如 ...
- 使用非 GUI 模式运行 JMeter 压力测试
使用非 GUI 模式,即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资源.使用命令jmeter -n -t <testplan filename> -l <list ...
- 转:Jmeter分布式测试
在使用Jmeter进行性能测试时,如果并发数比较大(比如最近项目需要支持1000并发),单台电脑的配置(CPU和内存)可能无法支持,这时可以使用Jmeter提供的分布式测试的功能. 一.Jmeter分 ...
- JMeter JMeter远程分布式联机性能测试
JMeter远程分布式联机性能测试 by:授客 QQ:1033553122 测试环境 apache-jmeter-2.13 Java JDK版本:1.8 1. JMeter分布式测试简介 当一个 ...
- Jmeter --- 分布式测试
在使用Jmeter进行性能测试时,如果并发数比较大(比如最近项目需要支持1000并发),单台电脑的配置(CPU和内存)可能无法支持,这时可以使用Jmeter提供的分布式测试的功能. 一.Jmeter分 ...
随机推荐
- 对象奔驰E2000
<script> window.onload = function (ev) { // 调用对象前先创建 // 2 var vcar=new Car("奔驰",&quo ...
- 微信h5支付源码DEMO参考
类库代码 wechatH5Pay.php <?php //use Flight; /** * 微信支付服务器端下单 * 微信APP支付文档地址: https://pay.weixin.qq.co ...
- 《JavaScript 高级程序设计》第二章:在HTML中使用JavaScript
script 标记是 netspace 公司最早为在 html中引入 javascript代码而创造的HTML元素,并最终被 HTML规范采纳. script 标记有四个比较重要的属性: src ty ...
- python asyncio学习截图
感觉对python越来越通了. 感觉不错, 截图
- Collections.sort 给集合排序
List<MenuVo> child_menus = new ArrayList<MenuVo>(); for (MenuVo menuVo : child_menus) { ...
- JDK的get请求方式
package com.example.wang.testapp3; import android.app.ProgressDialog; import android.os.Bundle; impo ...
- P3144 关闭农场 并查集 反向
FJ和他的奶牛们正在计划离开小镇做一次长的旅行,同时FJ想临时地关掉他的农场以节省一些金钱. 这个农场一共有被用M条双向道路连接的N个谷仓(1<=N,M<=3000).为了关闭整个农场,F ...
- 洛谷 P1002 过河卒 【棋盘dp】
题目链接:https://www.luogu.org/problemnew/show/P1002 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点 ...
- GreenDao与ReactiveX的完美搭配
转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6719380.html 作为Android开发者,一定不会对 GreenDao 和 ReactiveX 陌生 ...
- Linux shell中处理
awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 awk命令形式: awk ...