自己在使用JMeter进行分布式测试的时候,遇到了很多的坑。下面总结起来,方便以后查看。

1、控制机端

(1)执行机没有关闭防火墙

在执行机IP+端口号设置正确的情况下,控制机在启动测试计划的时候,出现如下情况:

Windows系统,下的GUI界面:

Linux系统下,出现:

  1. [root@localhost ~]# jmeter -n -t /tmp/jmeterscript/CLI_test.jmx -r -l /tmp/result/result.jtl -j /tmp/jmeterlog/test.log -e -o /tmp/resultforHTML/tableresult
  2. Creating summariser <summary>
  3. Created the tree successfully using /tmp/jmeterscript/CLI_test.jmx
  4. Configuring remote engine: 192.168.134.130:9996
  5. Exception creating connection to: 192.168.134.130; nested exception is:
  6. java.net.NoRouteToHostException: 没有到主机的路由 (Host unreachable)
  7. Failed to configure 192.168.134.130:9996
  8. Configuring remote engine: 192.168.134.131:9996
  9. Exception creating connection to: 192.168.134.131; nested exception is:
  10. java.net.NoRouteToHostException: 没有到主机的路由 (Host unreachable)
  11. Failed to configure 192.168.134.131:9996
  12. Stopping remote engines
  13. Remote engines have been stopped
  14. Error in NonGUIDriver java.lang.RuntimeException: Following remote engines could not be configured:[192.168.134.130:9996, 192.168.134.131:9996]
  15. An error occurred: Error in NonGUIDriver Following remote engines could not be configured:[192.168.134.130:9996, 192.168.134.131:9996]

如上情况说明,无法找到执行机与之进行连接,最先应想的就是执行机中的防火墙是不是没有关闭,我关闭执行机的防火墙后,以上错误消失。

CentOS7中关闭防火墙如下:

1)查看防火墙状态命令:systemctl status firewalld.service

active(running):说明防火墙是开启状态。

2)关闭运行的防火墙使用命令:systemctl stop firewalld.service

disavtive(dead):说明防火墙已经是关闭状态。

3)前面的方法,一旦重启操作系统,防火墙就自动开启了,该怎么设置才能永久关闭防火墙呢?

  • systemctl disable firewalld.service,开机禁止防火墙服务器。
  • systemctl enable firewalld.service ,开机启动防火墙服务器。

提示:开启防火墙命令systemctl statr firewalld.service

(2)内存溢出

在执行JMeter命令时,提示如下信息。

Windows系统,提示如下:

Error occurred during initialization of VM Could not reserve enough space for object heap errorlevel=1

Linux系统,提示如下:

  1. [root@jmeter2 bin]# ./jmeter
  2. Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
  3. #
  4. # There is insufficient memory for the Java Runtime Environment to continue.
  5. # Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
  6. # An error report file with more information is saved as:
  7. # /usr/local/jmeter/apache-jmeter-5.0/bin/hs_err.log

提示你,虚拟机初始化期间无法为HotSpot保留足够的空间。

解决方法:打开jmeter.bat文件,查找set HEAP,把set HEAP=-Xms128m –Xmx512m修改为set HEAP=-Xms512m-Xmx1024m。(看实际需求往大调整)

2、执行机端

(1)启动jmeter-server服务情况一

出现如下所示:

  1. # 启动jmeter服务
  2. [root@localhost bin]# ./jmeter-server
  3. Created remote object: UnicastServerRef2 [liveRef: [endpoint:[127.0.0.1:39077](local),objID:[c466f3:179e14425ba:-7fff, -6326112065037884314]]]
  4. Server failed to start: java.rmi.RemoteException: Cannot start. localhost.localdomain is a loopback address.
  5. An error occurred: Cannot start. localhost.localdomain is a loopback address.

服务器启动异常:Java远程方法调用抛出异常:无法启动服务。localhost.localdomain是一个本地环回地址。

原因

要在远程对象上调用方法,RMI客户端首先必须从RMI注册表中检索远程存根对象。 此存根对象包含服务器地址,该服务器地址稍后将在调用远程方法时用于连接到远程对象(与RMI注册表的连接和与远程对象的连接是两个完全不同的东西)。 默认情况下,服务器将尝试检测自己的地址并将其传递给存根对象。 不幸的是,用于检测服务器地址的算法并不总是产生有用的结果(取决于网络配置)。

通过设置RMI服务器上的系统属性java.rmi.server.hostname,可以覆盖传递给存根对象的服务器地址。

默认情况下,RMI注册表使用端口1099。

解决方案

方法一

运行JMeter命令启动jmeter-server服务时,增加如下参数:

./jmeter-server -Djava.rmi.server.hostname=(执行机-本机ip)

方法二

修改jmeter-server文件:

  1. # 修改RMI_HOST_DEF如下
  2. RMI_HOST_DEF=-Djava.rmi.server.hostname=192.16.*.*(本机ip

之后执行命令./jmeter-server,来启动jmeter-server服务即可。(可方法一同理)

补充:

Linux系统中后台执行,启用jmeter-server服务:

nohup ./jmeter-server -Djava.rmi.server.hostname=192.168.*.*

查看jmeter-server服务是否启动成功,执行命令:ps axu | grep jmeter

方法三

也有可能是hostnamelocalhost不一致导致的。

当在 /etc/hosts 文件中进行映射时,通过localhost无法映射到一个有效的IP地址,就会出现上述问题。

操作步骤:

获取机器名称,增加一条域名与IP的映射。

1)先在/etc/hosts里添加一行,如下所示:

机器的实际IP地址为:192.168.134.130

  1. [root@JMeter-01 /]# vim /etc/hosts
  2. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  3. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  4. 192.168.134.130 JMeter-01 localhost

2)然后修改/etc/sysconfig/network文件里面的HOSTNAME。

  1. [root@JMeter-01 /]# vim /etc/sysconfig/network
  2. # Created by anaconda
  3. HOSTNAME=JMeter-01

则可以访问成功。

(以上三种方式都可以试试,其实是一类问题)

(2)启动jmeter-server服务情况二

出现如下所示:

  1. [root@jmeter2 bin]# ./jmeter-server
  2. Server failed to start: java.rmi.server.ExportException: Listen failed on port: 0; nested exception is:
  3. java.io.FileNotFoundException: rmi_keystore.jks (没有那个文件或目录)
  4. An error occurred: Listen failed on port: 0; nested exception is:
  5. java.io.FileNotFoundException: rmi_keystore.jks (没有那个文件或目录)

提示你,找不到系统指定的文件。

原因:要么拥有RMI over SSL的有效密钥库,要么禁用掉SSL。

解决方案禁用掉SSL:修改bin/jmeter.properties配置文件,server.rmi.ssl.disable=true即可解决。

提示:master和slave机器上jmeter.properties配置文件中,server.rmi.ssl.disable都改为true

(3)启动jmeter-server服务情况三

执行机启动jmeter-server服务,提示“Could notfind ApacheJmeter_core.jar”

原因:是因为JMeter没有配置环境变量。

看之前的文章【Linux系统中运行JMeter脚本】,里面有详细的配置环境变量说明。

3、分布式测试控制机接收不到返回结果

即:也就是关于控制机的多网卡问题。

如果控制机(master)只有一个网卡,不需要关注这个问题。

如果我们在练习的时候,只有一台电脑,需要启动虚拟机完成演示的时候,就需要注意这里的问题了。

(1)多网卡出现的问题说明

JMeter采用了rmi进行远程调用,如果控制机(master)有多个网卡,它只是使用其中任意一个网卡。

默认情况下,他会使用无线局域网适配器这块网卡,而虚拟机使用的网卡是以太网适配器VIware Network Adapter VMnet8

如下图所示:

这就导致JMeter的控制机(master)和执行机(slave)不在同一个网段内,会导致无法互通,出现的情况可能是控制机无法连接执行机,或者是执行机中的测试结果无法回传给控制机。

(2)多网卡出现的问题解决方式

我的测试机情况如下:

一台Windows系统主机作为控制机,IP地址如上图中所示。

在该主机上启动了三台虚拟机,IP地址分别为192.168.134.129192.168.134.130192.168.134.131

1)执行机中的配置

修改jmeter-server文件:

RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx(执行机的IP)

当然也可以不配置,在执行机启动jmeter-server服务的时候,执行如下命令,也是一样的。

./jmeter-server -Djava.rmi.server.hostname=xxx.xxx.xxx.xxx

2)控制机中的配置

修改jmeter.bat启动文件(我是Windows系统主机作为控制机)

在文件中新增如下内容:

  1. set rmi_host=-Djava.rmi.server.hostname=192.168.134.100
  2. # 可添加,可修改
  3. set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %PERM% %DDRAW% %rmi_host%

如下图所示:

这样就把控制机的IP网段从192.168.1.101换成了192.168.134.100

提示:

  • 设置网段的IP不要和虚拟机中的IP冲突。
  • 这里的配置是基于上一篇文章【JMeter分布式测试】中的配置。
  • 如果不需要进行分布式了,不要忘记把jmeter.bat启动文件修改回来,防止做其他工作时有影响。

这样就设置后,Windows系统主机就可以控制三个Linux虚拟机分布式执行脚本了。

4、参数化问题

(1)参数化问题说明

  • 通常,我们编写、调试脚本都是在 Window 机器上,而真正性能测试时,脚本几乎都在 Linux 下运行。
  • 使用 CSV 数据文件做参数化时,是需要指定文件路径的。
  • 这里就有个问题:Window 下写的文件路径到了 Linux 下是不正确的,导致无法正常读取 CSV 文件。
  • 为了解决这个问题,下面将要讲解一个简单的万能解决方法。

(2)两个前提

  • 我们的 CSV 文件必须在 JMeter的bin目录下创建,然后再添加自己要的数据。
  • JMeter命令必须从bin目录下启动。

(3)操作方式

CSV 数据文件设置组件中,直接按下面的格式写:

这样就可以了,只要把CSV文件上传到Linux系统 JMeter下的bin目录,这个脚本就可以跨平台执行了。

(4)总结

  • ${__P(user.dir,)}${__P(file.separator,)}test.txt可以根据不同的系统,不同的JMeter安装路。径,自动获取 Jmeter 路径,然后再获取不同系统下的文件路径分隔符,最后加上文件名称拼成文件路径。
  • 这样就可以解决使用CSV数据文件做参数化时,跨平台导致路径不一致的问题。
  • 重点前提:CSV 文件放在JMeter的bin目录下,且到 bin 目录中执行Jmeter命令。

5、其他补充

(1)修改端口号

JMeter分布式测试的默认端口号是1099,我们可以自定义修改端口号。

jmeter.properties配置文件中修改:

  • server_port=10086:表示master机器要远程连接的端口,即:remote_hosts=xxxx:10086
  • server.rmi.localport=10086:表示slave server启动显示的端口。

其实上面两者一样,修改改server_port即可。

(2)查看分布式测试过程中

jmeter.properties配置文件中修改mode=Standard

  • 用于查看分布式测试过程中,每个压力机的测试结果。
  • 若不启用,在运行过程中,控制器是无法实时看到压力机的结果。

提示:一般不需要开启。

参考:

『动善时』JMeter基础 — 59、进行JMeter分布式测试遇到的坑的更多相关文章

  1. 『动善时』JMeter基础 — 6、使用JMeter发送一个最基础的请求

    目录 步骤1:创建一个测试计划 步骤2:创建线程组 步骤3:创建取样器 步骤4:创建监听器 步骤5:完善信息 步骤6:保存测试计划 步骤7:查看结果 总结:JMeter测试计划要素 当我们第一次打开J ...

  2. 『动善时』JMeter基础 — 8、JMeter主要元件介绍

    目录 1.测试计划(Test Plan) 2.线程组 3.取样器(sampler) 4.逻辑控制器(Logic Controller) 5.配置元件(Config Element) 6.定时器(Tim ...

  3. 『动善时』JMeter基础 — 41、使用JMeter连接数据库(MySQL)

    目录 1.为什么要使用JMeter连接数据库 2.JMeter连接数据库的前提 3.JDBC连接配置组件界面介绍 4.JMeter连接数据库演示 (1)测试计划内包含的元件 (2)测试计划中添加链接数 ...

  4. 『动善时』JMeter基础 — 2、JMeter的安装和启动

    1.安装Java环境 由于JMeter是纯Java的桌面应用程序,因此它的运行环境需要Java环境,即需要安装JDK或JRE.(也就是安装JDK环境) 步骤简要说明: 下载并安装JDK 配置环境变量 ...

  5. 『动善时』JMeter基础 — 7、jmeter.properties文件常用配置

    目录 1.默认语言设置 2.配置默认编码格式 3.GUI图标放大比例设置 4.功能区工具栏图标大小设置 5.视图区目录树图标大小设置 6.内容区编辑字体设置 7.添加JMeter元素快捷键设置 8.捕 ...

  6. 『动善时』JMeter基础 — 22、JMeter中实现参数化(CSV)

    目录 1.参数化的定义 2.什么情况下需要用到参数化 3.JMeter实现参数化的方式 4.CSV数据文件设置界面详细说明 (1)CSV数据文件设置组件界面说明 (2)补充说明:Recycle on ...

  7. 『动善时』JMeter基础 — 27、通过JMeter函数助手实现参数化

    目录 1.测试计划中的元件 2.数据文件内容 3.函数助手配置 (1)函数助手的打开方式 (2)函数助手界面介绍 (3)编辑后的函数助手界面 4.HTTP请求组件内容 5.线程组元件内容 6.脚本运行 ...

  8. 『动善时』JMeter基础 — 47、JMeter的HTTP代理服务器详细介绍

    目录 1.HTTP代理服务器的添加 2.HTTP代理服务器界面详解 (1)State:状态 (2)Global Settings:全局设置 (3)Test Plan Creation:测试计划创建 ( ...

  9. 『动善时』JMeter基础 — 55、JMeter非GUI模式运行

    目录 1.JMeter的非GUI模式说明 2.为什么使用非GUI模式运行JMeter 3.怎样使用非GUI模式运行JMeter (1)非GUI模式运行JMeter步骤 (2)其它参数说明 4.CLI模 ...

随机推荐

  1. 使用微信开放标签<wx-open-launch-weapp>的踩坑日记

    最近在完成H5跳转小程序需求时,使用到了微信官方退出的开放标签<wx-open-launch-weapp>,来谈一谈使用的心得和不足. 1.适用环境微信版本要求为:7.0.12及以上. 系 ...

  2. hive 启动不成功,报错:hive 启动报 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/mapred/MRVersi

    1. 现象:在任意位置输入 hive,准备启动 hive 时,报错: Exception in thread "main" java.lang.NoClassDefFoundErr ...

  3. proxysql+MHA+半同步复制

    先配置成主从同步 先在各节点安装服务 [root@inotify ~]# yum install mariadb-server -y 编辑主节点的配置文件,并启动 [root@centos7 ~]# ...

  4. 【C/C++】金币

    做了一下去年的题目,今年看起来就没这么难了 从上到下的可以从下到上考虑,会简单很多,dp入门 题目 金币 小招在玩一款游戏,在一个N层高的金字塔上,以金字塔顶为第一层,第i层有i个落点,每个落点有若干 ...

  5. 为什么重写equals()就要重写hashcode()

    阿里巴巴开发规范 只要重写 equals,就必须重写 hashCode 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方 ...

  6. linux小应用 —— 日志过滤

    先说问题,统计一个日志文件中去重之后的ip地址的个数.其实这是一个非常常见也比较简单的问题,其中我个人认为最主要的应该是匹配ip地址是这个问题的核心.剩下的就是对linux命令的熟练程度的问题了.首先 ...

  7. Java synchonized 同步

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...

  8. <转>libevent使用demo

    这篇文章介绍下libevent在socket异步编程中的应用.在一些对性能要求较高的网络应用程序中,为了防止程序阻塞在socket I/O操作上造成程序性能的下降,需要使用异步编程,即程序准备好读写的 ...

  9. [BUUCTF]PWN——picoctf_2018_buffer overflow 1/2

    picoctf_2018_buffer overflow 1 附件 步骤: 例行检查,32位程序,没开保护 本地运行一下程序,看看程序大概的执行情况 32位ida载入,习惯性的检查程序里的字符串,发现 ...

  10. vue3官网介绍,安装,创建一个vue实例

    前言:这一章主要是vue的介绍.安装.以及如何创建一个vue实例. 一.vue介绍 vue3中文官网:建议先自己看官网. https://v3.cn.vuejs.org/ vue是渐进式框架,渐进式指 ...