【问题标题】:java.net.SocketException: Socket closed at the end of the script duration when using Jmeter Concurrency Thread Groupjava.net.SocketException:使用 Jmeter 并发线程组时,套接字在脚本持续时间结束时关闭
【发布时间】:2021-12-02 09:02:34
【问题描述】:

我正在使用 Jmeter 5.2.1 以及 Concurrency Thread Group${__tstFeedback(ThroughputShapingTimer,1,10,10)} 以及 Throughput Shaping Timer 在整个测试期间动态更改目标吞吐量。

测试计划由一个线程组组成,该线程组具有一个模块控制器和其下的吞吐量整形定时器。模块控制器控制一个包含测试逻辑的测试片段。

我在测试结束时遇到了一个问题,大多数情况下,最后几个采样器会导致“java.net.SocketException: Socket closed”异常。无论我是否在测试结束时减速到 0,都会发生这种情况。

相比之下,如果我使用具有相同设置的相同脚本,但只是从普通线程组控制它,那么所有采样器都会在脚本结束时成功完成而不会出现问题。

以下是我设置的一些屏幕截图:

来自采样器的完整错误文本:

java.net.SocketException: Socket closed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.security.ssl.InputRecord.readFully(Unknown Source)
    at sun.security.ssl.InputRecord.read(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(Unknown Source)
    at sun.security.ssl.AppInputStream.read(Unknown Source)
    at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
    at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
    at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280)
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138)
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
    at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
    at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:157)
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.executeRequest(HTTPHC4Impl.java:850)
    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:561)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:67)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1282)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1271)
    at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:627)
    at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:551)
    at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:490)
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:257)
    at java.lang.Thread.run(Unknown Source)

我想了解原因可能是什么,因为这会影响报告。

我们将非常感谢任何有关删除或解决此问题的帮助。

【问题讨论】:

    标签: multithreading concurrency jmeter jmeter-plugins threadgroup


    【解决方案1】:

    JMeter 在 5 次尝试后无法正常终止线程,因此它forcefully terminates the connection,在您的情况下,此终止发生在服务器响应中断 SSL 隧道并导致错误期间。

    “正常”线程组使用different approach 来停止不能在并发线程组中重复使用的线程,因为在您的情况下,它会产生一个额外的线程池,这些线程不属于线程组,除非它们' re 明确使用,因此它们有点超出 JMeter 的控制范围。

    如果您仍想使用并发线程组并且只想忽略或过滤掉错误,可以使用:

    1. JMeter Plugins Command Line Tool Plugin
    2. Filter Results Plugin
    3. Response Assertion 和“忽略状态”框
    4. JSR223 Assertion 和您的自定义代码有条件地将 scope 中的采样器标记为通过或失败

    【讨论】:

    • 响应断言+“忽略状态”框似乎是最容易实现的。但这将适用于所有示例,而不仅仅是脚本持续时间结束时的示例,所以这不是一个理想的解决方案,对吧?
    【解决方案2】:

    当JMeter尝试发送请求但连接已经关闭时,在测试结束时抛出错误。

    这些错误是由于测试配置而产生的,应在测试结果/报告中忽略。

    您可以在 JSR223 后处理器中使用 pre.setIgnore() 在特定时间忽略测试结果。

    示例代码可在here获取。

    【讨论】:

    • 您是否知道我如何以编程方式确定自脚本开始以来并发线程组的预期测试持续时间或结束时间? link
    • 可以通过属性elementName_totalDuration获取详细信息。 props.get("elementName_totalDuration").
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2023-03-18
    • 2021-03-19
    • 2021-06-10
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多