基于 Netty 的 impl 上的 JMeter 测试每第二个请求都会产生错误

JMeter test on Netty-based impl produces error for every second request

我已经实现了基于 netty.io 项目提供的 HTTP server example 的 HTTP 服务。

当我从命令行 (wget) 或浏览器对服务 URL 执行 GET 请求时,我收到了预期的结果。

当我使用 ApacheBench ab -n 100000 -c 8 http://localhost:9000/path/to/service 执行负载测试时,没有遇到任何错误(无论是在服务端还是在 ab 端)并且看到请求处理持续时间的公平数字。

之后,我在 JMeter 中设置了一个测试计划,该计划有一个线程组,其中有 1 个线程和 2 个循环计数。我插入了一个 HTTP 请求采样器,我只是在其中添加了服务器名称 localhost、端口编号 9000 和路径 /path/to/service。然后我还添加了一个 View Results Tree 和一个 Summary Report 监听器。

最后,我执行了测试计划,收到了一个有效的响应和一个错误,显示如下内容:

Thread Name: Thread Group 1-1
Sample Start: 2015-06-04 09:23:12 CEST
Load time: 0
Connect Time: 0
Latency: 0
Size in bytes: 2068
Headers size in bytes: 0
Body size in bytes: 2068
Sample Count: 1
Error Count: 1
Response code: Non HTTP response code: org.apache.http.NoHttpResponseException
Response message: Non HTTP response message: The target server failed to respond

Response headers:


HTTPSampleResult fields:
ContentType: 
DataEncoding: null

在响应数据选项卡中发现的关联异常显示以下内容

org.apache.http.NoHttpResponseException: The target server failed to respond
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:95)
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:61)
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254)
    at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
    at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191)
    at org.apache.jmeter.protocol.http.sampler.MeasuringConnectionManager$MeasuredConnection.receiveResponseHeader(MeasuringConnectionManager.java:201)
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)
    at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:715)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:520)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.executeRequest(HTTPHC4Impl.java:517)
    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:331)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:74)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1146)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1135)
    at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:434)
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:261)
    at java.lang.Thread.run(Thread.java:745)

因为我已经有一个类似的服务 运行 接收和处理没有错误的网络跟踪数据,这可能是我的测试计划或 JMeter 中的问题 .. 但我不确定 :-(

有没有人经历过类似的行为?提前致谢;-)

问题可能与 Keep-Alive 管理有关。

阅读那些:

所以您的解决方案是其中之一:

如果您确定这是一个保持活动状态的问题:

  • 尝试每晚构建 jmeter http://jmeter.apache.org/nightly.html:

    Download the _bin and _lib files
    Unpack the archives into the same directory structure
    The other archives are not needed to run JMeter. 
    
  • 并调整httpclient4.idletimeout

  • 的值

解决方法是根据 :

增加重试或添加连接失效检查