之前总结了 jmeter 分布式测试的过程,在部署过程中提到,要在 system.properties

中配置自己的 IP。

至于为什么要这么做,源于这一次 debug 的过程。

运行环境

mint, ubuntu 两台主机作为 master 节点,一台 win server 作为 slave 节点,采用分布式的方式,

对 target 进行测试。

问题

问题很奇怪,以 mint 系统作为 master,调度分布式测试没有问题,

$ jmeter -n -t ./test.jmx -R 10.27.2.210 -l test.jtl -e -o report_test
Creating summariser <summary>
Created the tree successfully using ./888.jmx
Configuring remote engine: 10.27.2.210
Starting remote engines
Starting the test @ Wed May 16 10:09:24 CST 2018 (1526436564379)
Remote engines have been started
Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445
summary = 1 in 00:00:00 = 3.5/s Avg: 20 Min: 20 Max: 20 Err: 0 (0.00%)
Tidying up remote @ Wed May 16 10:09:26 CST 2018 (1526436566910)
... end of run

而使用另一台 ubuntu 主机作为 master,调度测试,则卡在 waiting 这一行,

$ jmeter -n -t ./test.jmx -R 10.27.2.210 -l test.jtl -e -o report_test
Creating summariser <summary>
Created the tree successfully using ./888.jmx
Configuring remote engine: 10.27.2.210
Starting remote engines
Starting the test @ Wed May 16 10:09:24 CST 2018 (1526436564379)
Remote engines have been started
Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445

尝试1:防火墙干扰

第一种猜测,应该是 ubuntu 系统的防火墙干扰,阻止了 4445 端口的数据。

先关闭防火墙

$ sudo service ufw stop

再次运行测试,依旧卡在 waiting 那一行,看来问题没有那么简单。

尝试2:关闭监听功能

Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445

信息在网上查找,有人建议修改 jmeter 设置,不监听 shutdown 信息,相应的也就不会开启 4445 端口,

理论上就不会卡在 waiting 那里,而是直接跳过。

在 ubuntu 主机,修改 jmeter.properties 文件,

#jmeterengine.nongui.maxport=4455 修改为
jmeterengine.nongui.maxport=0

但是依旧不能工作。

尝试3:端口没有开启

在 mint 作为 master,成功调度分布式测试的过程中,mint 主机自身打开了 4445 udp 端口,

用 netstat 可以查看的到。

但是,在 ubuntu 调度的时候,用 netstat 也可以查看到 4445 udp 端口已经打开。

而且用 netcat 测试 udp 端口也是可用的。

$ nc -vz -u 10.27.2.13 4445
Connection to 10.27.2.13 4445 port [udp/*] succeeded!

看来也不是端口未开放的问题。

尝试4:信息被阻塞

猜测是不是在哪个环节,shutdown message 被阻拦,导致收不过消息,而一直卡在那里。

于是在 mint 主机运行测试的时候,用 wireshark 监听所有发送与 4445 udp 的信息,然而!什么都没有!

这样看来,之前对问题的判断是不准确的。一直以为和 shutdown message 有关,其实正常运行一次测试,根本不必要有 shutdown message。

尝试5:在日志中寻找

之前一直被表面现象迷惑,认为是 master 的问题,直到进入 slave 节点查看日志 jmeter-server.log

发现这样的错误输出,

2018-05-14 18:29:56,240 ERROR o.a.j.s.BatchSampleSender: testEnded(host)
java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is:
java.net.ConnectException: Connection refused: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source) ~[?:1.8.0_162]
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source) ~[?:1.8.0_162]
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source) ~[?:1.8.0_162]
at sun.rmi.server.UnicastRef.invoke(Unknown Source) ~[?:1.8.0_162]
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source) ~[?:1.8.0_162]
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source) ~[?:1.8.0_162]
at com.sun.proxy.$Proxy20.testEnded(Unknown Source) ~[?:?]
at org.apache.jmeter.samplers.BatchSampleSender.testEnded(BatchSampleSender.java:127) [ApacheJMeter_core.jar:4.0 r1823414]
at org.apache.jmeter.samplers.DataStrippingSampleSender.testEnded(DataStrippingSampleSender.java:86) [ApacheJMeter_core.jar:4.0 r1823414]
at org.apache.jmeter.samplers.RemoteListenerWrapper.testEnded(RemoteListenerWrapper.java:90) [ApacheJMeter_core.jar:4.0 r1823414]
at org.apache.jmeter.engine.StandardJMeterEngine.notifyTestListenersOfEnd(StandardJMeterEngine.java:229) [ApacheJMeter_core.jar:4.0 r1823414]
at org.apache.jmeter.engine.StandardJMeterEngine.run(StandardJMeterEngine.java:495) [ApacheJMeter_core.jar:4.0 r1823414]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_162]
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method) ~[?:1.8.0_162]
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) ~[?:1.8.0_162]
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) ~[?:1.8.0_162]
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) ~[?:1.8.0_162]
at java.net.AbstractPlainSocketImpl.connect(Unknown Source) ~[?:1.8.0_162]
at java.net.PlainSocketImpl.connect(Unknown Source) ~[?:1.8.0_162]
at java.net.SocksSocketImpl.connect(Unknown Source) ~[?:1.8.0_162]
at java.net.Socket.connect(Unknown Source) ~[?:1.8.0_162]
at java.net.Socket.connect(Unknown Source) ~[?:1.8.0_162]
at java.net.Socket.<init>(Unknown Source) ~[?:1.8.0_162]
at java.net.Socket.<init>(Unknown Source) ~[?:1.8.0_162]
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source) ~[?:1.8.0_162]
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source) ~[?:1.8.0_162]
... 13 more

为什么地址是 127.0.1.1 ?为什么要向这个地址通信?

根据对 jmeter master/slave 通信机制的理解,不仅 master 主动向 slave 通信, slave 也向 master 主动通信,自然要知道彼此的地址。

由此联想到,在 slave 节点多网卡的时候,一般都设置 hostname,猜测 master 也需要进行同样的设置,告知 slave 自己的通信地址。

于是在 ubuntu master 主机的 system.properties 最后一行添加,

java.rmi.server.hostname=10.27.2.13

测试终于正常运行了。

写在最后

推而广之,在 jmeter 的所有节点,无论 master/slave,都显示设置自己的 IP 地址。

system.properties 最后一行添加

java.rmi.server.hostname=<IP addr>

为什么 jmeter 分布式测试,一定要设置 java.rmi.server.hostname的更多相关文章

  1. Jmeter分布式测试的各种坑之jmeter-server修改ip

    第一坑:启动压力机的时候,直接./jmeter-server,会报如下错误 错误原因:127.0.0.1是本机, 一个回路地址, 没有指定地址 正确的启动方式:启动命令加一个参数, IP地址写压力机对 ...

  2. 『动善时』JMeter基础 — 59、进行JMeter分布式测试遇到的坑

    目录 1.控制机端 (1)执行机没有关闭防火墙 (2)内存溢出 2.执行机端 (1)启动jmeter-server服务情况一 (2)启动jmeter-server服务情况二 (3)启动jmeter-s ...

  3. JMeter分布式测试环境搭建(禁用SSL)

    JMeter分布式环境,一台Master,一到多台Slave,Master和Slave可以是同一台机器. 前提条件: 所有机器,包括master和slave的机器: 1.运行相同版本的JMeter 2 ...

  4. jmeter分布式测试远程连接失败

    jmeter分布式部署其实很简单.但今天测试的时候发现了一个坑,远程连接一直失败. 原因:服务器上部署了slave,而这台服务器上有多个网卡.举个例子:ip分别为:192.168.100.6,10.1 ...

  5. Jmeter分布式测试实战

    一.Jmeter分布式测试基础 1.Jmeter分布式测试原因: 在使用Jmeter进行接口的性能测试时,由于Jmeter 是JAVA应用,对负载机的CPU和内存消耗比较大.所以当需要模拟数以万计的并 ...

  6. Jmeter分布式测试dubbo接口2

    上次我们将dubbo接口与jmeter集成起来,但是jmeter是由java实现的,本身有很多限制,无法实现高并发,我们需要借助分布式来实现大压力测试. 在上次的例子中,我们只是实现了简单的dubbo ...

  7. Jmeter分布式测试笔记

    在性能测试过程中,如果要求并发数较大时(例如1000+),单机配置cpu与内存等无法支持,则需要使用Jmeter的分布式测试方法. 一.一般什么情况下需要分布式 1.前辈经验:比如机器i5双核的cpu ...

  8. Jmeter系列(39)- Jmeter 分布式测试

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 为什么要做分布式 Jmeter 本身的 ...

  9. 『动善时』JMeter基础 — 58、JMeter分布式测试

    目录 1.JMeter分布式测试概念 2.JMeter分布式测试前提条件 3.JMeter实现分布式测试 (1)在执行机中的配置 (2)在控制机中的配置 (3)启动执行机中的JMeter服务 (4)在 ...

随机推荐

  1. arcgis api for javascript本地部署加载地图

    最近开始学习arcgis api for javascript,发现一头雾水,决定记录下自己的学习过程. 一.下载arcgis api for js 4.2的library和jdk,具体安装包可以去官 ...

  2. kubernetes 认证授权

    每个Kubernetes集群都有一个集群根证书颁发机构(CA). 集群中的组件通常使用CA来验证API server的证书,由API服务器验证kubelet客户端证书等.为了支持这一点,CA证书包被分 ...

  3. mysql安装后找不到sock文件

    mysql rpm安装方式之后,启动找不到sock文件,经排查是之前安装的由mysql, 需要时yum list installed mysql 或者  rpm -qa |grep -i mysql ...

  4. UITextView 和 UITextField限制字符数和表情符号

    UITextField限制字符数 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)r ...

  5. PAT乙级1002

    1002 写出这个数 (20 分)   读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 ...

  6. UCOS时钟节拍的讲究

    其实这个值取适中即可,100,200都行,看你的片子是什么,Cortex-M3的片子取200较合适这个值太小,系统调度周期较长,各个任务之间切换较慢,适时性降低,而太大了,中断周期与调试周期接近了,那 ...

  7. 【Unix 网络编程】TCP 客户/服务器简单 Socket 程序

    建立一个 TCP 连接时会发生下述情形: 1. 服务器必须准备好接受外来的连接.这通常通过调用 socket.bind 和 listen 这三个函数来完成,我们称之为被动打开. 2. 客户通过调用 c ...

  8. Mysql 安全登陆工具 mysql_config_editor

    mysql_config_editor 帮助信息请查看 man mysql_config_editor 或 mysql_config_editor -? 或 mysql_config_editor s ...

  9. jQuery----淘宝商品展示(类似与tab切换)

    实现效果如图:                 功能需求: ①鼠标进入商品名称,商品名称变色,同时对应的物品展示图片显示对应的物品,鼠标移出时候,商品名称恢复原来的颜色 实现分析: 1.HTML+CS ...

  10. c语言输出控制符

    c语言格式输出 %d 10进制 %f 浮点型输出 %lf 长浮点型输出 %c 字符输出 %s 字符串输出 %o 八进制输出 %x 十六进制输出 %p 16进制,一般输出地址 %e 科学计数法输出 %m ...