Jmeter JVM应该已经退出,但没有退出

Jmeter JVM应该已经退出,但没有退出,jmeter,jvm,performance-testing,load-testing,distributed,Jmeter,Jvm,Performance Testing,Load Testing,Distributed,在非gui模式下使用Jmeter 3.3进行分布式测试的过程中,我得到的错误是,如何修复此问题: 我在主机器和从机器上使用相同版本的JMeter和JDK JVM应该已经退出,但没有退出。 以下非守护进程线程仍在运行(DestroyJavaVM正常): 螺纹[main,5,main] stackTrace:java.net.SocketInputStream#socketRead0 java.net.SocketInputStream#socketRead java.net.SocketInput

在非gui模式下使用Jmeter 3.3进行分布式测试的过程中,我得到的错误是,如何修复此问题:

我在主机器和从机器上使用相同版本的JMeter和JDK

JVM应该已经退出,但没有退出。 以下非守护进程线程仍在运行(DestroyJavaVM正常): 螺纹[main,5,main]

stackTrace:java.net.SocketInputStream#socketRead0
java.net.SocketInputStream#socketRead
java.net.SocketInputStream#read
java.net.SocketInputStream#read
java.io.BufferedInputStream#fill
java.io.BufferedInputStream#read
java.io.DataInputStream#readByte
sun.rmi.transport.StreamRemoteCall#executeCall
sun.rmi.server.UnicastRef#invoke
java.rmi.server.RemoteObjectInvocationHandler#invokeRemoteMethod
java.rmi.server.RemoteObjectInvocationHandler#invoke
com.sun.proxy.$Proxy19#rrunTest
org.apache.jmeter.engine.ClientJMeterEngine#runTest at line:149
org.apache.jmeter.engine.DistributedRunner#start at line:132
org.apache.jmeter.engine.DistributedRunner#start at line:149
org.apache.jmeter.JMeter#runNonGui at line:1005
org.apache.jmeter.JMeter#startNonGui at line:910
org.apache.jmeter.JMeter#start at line:538
sun.reflect.NativeMethodAccessorImpl#invoke0
sun.reflect.NativeMethodAccessorImpl#invoke
sun.reflect.DelegatingMethodAccessorImpl#invoke
java.lang.reflect.Method#invoke
org.apache.jmeter.NewDriver#main at line:248

最可能的情况是,您的JMeter引擎过载,因此当您请求运行的线程关闭时,无法正常关闭它们

  • 一定要跟上
  • 第一个“最佳实践”陈述了考虑迁移到或在页
  • 中获得的最新版本。
  • 确保JMeter实例在CPU、RAM等方面有足够的空间进行操作。如果您没有其他监控软件,您可以使用它
  • 做一个测试并检查它-这样你就能知道你的测试到底卡在哪里了
  • 引入合理的超时值,以便在服务器无法响应时,JMeter不会无限等待,而是会因错误而失败

  • 最后(但我不建议这样做),您可以通过将下一行添加到user.properties文件:

    如果您这样做,请记住,您可能会遇到这样的情况:即使在测试结束后,JMeter从机仍将尝试执行某些操作,因此您需要手动或使用脚本终止并重新启动进程


  • 我强烈建议使用此jmeter属性:

    jmeterengine.force.system.exit=true
    
    记录在案。这些中文网页向我通风报信

    您可以在启动JMeter时在命令行上添加
    -Jjmeterengine.force.system.exit=true
    ,或者将
    jmeterengine.force.system.exit=true
    添加到JMeter_HOME/bin/JMeter.properties

    我是如何确认此修复的

    对于MS-Win10上的JMeter 5.1和java版本“1.8.0ç”,我们使用的是该版本的定制版本。 在我从命令行(jmeter.bat-n-tplan.jtl)进行了60秒的测试运行后,命令行在显示此输出后挂起(非常类似于op):

    按如下方式修改命令行后,jmeter.bat干净地退出,而不是挂起,所有丑陋的堆栈跟踪也消失了:

    jmeter.bat -n -Jjmeterengine.force.system.exit=true -t plan.jtl 
    
    为了确认这个问题是由我们的定制操作引起的,我从.jmx中删除了它,并且还删除了jmeterengine.force.system.exit=true。没有悬挂,没有丑陋的stacktrace(我真的很喜欢stacktraces)

    我还没有采取下一步来发现问题是出在官方还是我们定制的变体上,后者现在还没有(将来也永远不会)公开

    应该提到这个故事中的一个缺口。我觉得这个测试最终指向了我们定制的后端监听器(或jmeter)。然而,奇怪的是,上面的线程转储中似乎没有一个线程属于后端侦听器。因此,我称赞JMeter通过转储堆栈跟踪做了正确的事情——很少有其他应用在适当的故障排除时达到自动转储的程度。但在本例中,可能需要增强jmeter自动转储代码,因为它没有指向罪魁祸首后端侦听器代码。阿帕奇那边有人在听吗


    祝你好运。

    你能写一个小的、独立的程序来复制这个问题吗?如果你把它贴在这里,它将帮助其他人调查这个问题。请参阅有关@DT的帮助,以获取#6 jmeter.exit.check.pause=-1,在分布式模式下,此属性应仅设置在master上,或同时设置在master和slave上。
    Tidying up ...    @ Wed Jan 29 14:41:04 CST 2020 (1580330464874)
    ... end of run
    The JVM should have exited but did not.
    The following non-daemon threads are still running (DestroyJavaVM is OK):
    Thread[DestroyJavaVM,5,main], stackTrace:
    Thread[pool-2-thread-3,5,main], stackTrace:sun.misc.Unsafe#park
    java.util.concurrent.locks.LockSupport#parkNanos
    java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject#awaitNanos
    java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue#take
    java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue#take
    java.util.concurrent.ThreadPoolExecutor#getTask
    java.util.concurrent.ThreadPoolExecutor#runWorker
    java.util.concurrent.ThreadPoolExecutor$Worker#run
    java.lang.Thread#run
    
    Thread[pool-2-thread-4,5,main], stackTrace:sun.misc.Unsafe#park
    java.util.concurrent.locks.LockSupport#parkNanos
    java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject#awaitNanos
    java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue#take
    java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue#take
    java.util.concurrent.ThreadPoolExecutor#getTask
    java.util.concurrent.ThreadPoolExecutor#runWorker
    java.util.concurrent.ThreadPoolExecutor$Worker#run
    java.lang.Thread#run
    
    Thread[pool-2-thread-1,5,main], stackTrace:sun.misc.Unsafe#park
    java.util.concurrent.locks.LockSupport#parkNanos
    java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject#awaitNanos
    java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue#take
    java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue#take
    java.util.concurrent.ThreadPoolExecutor#getTask
    java.util.concurrent.ThreadPoolExecutor#runWorker
    java.util.concurrent.ThreadPoolExecutor$Worker#run
    java.lang.Thread#run
    
    jmeter.bat -n -Jjmeterengine.force.system.exit=true -t plan.jtl