【问题标题】:Jmeter in distributed mode: JVM doesn't stop because of BeanShell server分布式模式下的 Jmeter:JVM 不会因为 BeanShell 服务器而停止
【发布时间】:2018-11-27 18:40:11
【问题描述】:

我有什么

为分布式模式下的测试创建的 Jmeter 网络:一个 Jmeter 主机加上几个 Jmeter 从机。 BeanShell 服务器已禁用。一切正常。

我想做什么

我想让 BeanShell 服务器能够即时修改属性。

实际结果

BeanShell 服务器启动并成功运行。 测试完成后,日志中会显示以下消息:

The JVM should have exited but did not.
The following non-daemon threads are still running (DestroyJavaVM is OK):
Thread[Thread-7,5,main], stackTrace:java.net.PlainSocketImpl#socketAccept
java.net.AbstractPlainSocketImpl#accept at line:409
java.net.ServerSocket#implAccept at line:545
java.net.ServerSocket#accept at line:513
bsh.util.Sessiond#run at line:65
java.lang.Thread#run at line:748

Thread[Thread-5,5,main], stackTrace:java.net.PlainSocketImpl#socketAccept
java.net.AbstractPlainSocketImpl#accept at line:409
java.net.ServerSocket#implAccept at line:545
java.net.ServerSocket#accept at line:513
bsh.util.Httpd#run at line:64
java.lang.Thread#run at line:748

很明显,这是因为 BeanShell 服务器正在运行并且由于某种原因没有退出。 结果,java 进程永远不会退出并会挂起

问题:

任何想法为什么会发生?如何避免?我没有通过 http 和 telnet 连接到 beanshell 服务器。

更多详情:

所有节点都作为 Docker 容器运行。 所有节点都部署在 AWS 中。 无法在我的机器上本地重现相同的问题。即使启用了 BeanShell 服务器,一切正常,java 也应有尽有。

我尝试了什么:

尝试设置以下属性:

jmeterengine.remote.system.exit=true    
jmeterengine.stopfail.system.exit=true    
jmeterengine.force.system.exit=true

没有帮助,java 进程仍然挂起。

也一样
bsh.system.shutdownOnExit = true;

非常感谢任何想法。

【问题讨论】:

    标签: jmeter beanshell


    【解决方案1】:

    我认为没有办法停止 Beanshell 服务器和测试,因为它在无限循环中运行 Thread

    我建议使用 .bsh 文件停止您的测试和 Beanshell 服务器,例如:

    stopEngine();
    Thread.sleep(5000L); // just in case wait for 5 seconds for graceful shutdown
    System.exit(0);    
    

    地点:

    因此,您将能够像在运行时中修改属性一样关闭所有功能。

    您也可以通过使用OS Process Sampler 自动从tearDown Thread Group 执行System.exit(0); 命令来实现相同的目的,但是在这种情况下,请确保设置以下属性:

    jmeter.save.saveservice.autoflush=true
    

    否则你可能会丢失一些尚未写入磁盘的结果

    【讨论】:

    • 感谢您这么快的回答!这正是我现在所做的。但是在测试已经自行停止而不是通过停止命令的情况下,它并没有帮助。在这种情况下,使用 TearDown 线程的想法看起来很棒,所以会添加它。
    • 但是,对于为什么它不会自行停止的问题仍然没有答案。与 beanshell 服务器相同的 docker 容器在本地退出正常。因此,似乎某些东西在 AWS 端建立了连接,并且由于连接已打开,因此不允许正确停止 java。这真的很奇怪,因为我不允许通过 FW 规则进行任何外部连接,所以只连接到容器内的 localhost。
    【解决方案2】:

    最后,我找到了一个解决方法,所以在这里发布它作为答案。

    其实它并没有回答原来的问题,但是不想浪费时间去寻找原来的根本原因,因为它似乎与 AWS 结构有关(只是因为我无法在本地重现它在我远程启动的同一个容器中)。

    所以,最终的架构是:

    1. 要即时更新属性,我不必同时在从属和主控上启动 BeanShell。不动产的变化发生在奴隶身上,所以不需要主人。它解决了我的具体情况。

    2. 要停止测试,您可以使用现有的 shutdown.sh 和 stoptest.sh 脚本。无需在 beanshell 服务器上执行此操作。

    3. 如果测试正确停止,则 -X 选项 (server.exitaftertest=true) 也可以正常工作,因此不需要强制关闭 JVM,并且您不必添加执行的 tearDown 线程组系统退出。不过这个主意不错。

    4. 值得有一个shutdown.bsh脚本来强制杀死它作为一个工具。

    【讨论】:

      猜你喜欢
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      相关资源
      最近更新 更多