【问题标题】:jmeter: NoHttpResponseException: The target server failed to respondjmeter:NoHttpResponseException:目标服务器响应失败
【发布时间】:2015-11-04 07:11:14
【问题描述】:

我在 nodejs 中有一个应用程序,我正在针对成千上万的用户进行测试。对于 1000 个用户(当服务器部署在本地时),Jmeter 在大多数测试用例中都失败了:

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)

有时候,我也明白这一点:

java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:196)
    at java.net.SocketInputStream.read(SocketInputStream.java:122)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166)
    at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:281)
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:92)
    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)

我尝试了此链接中的所有步骤: https://wiki.apache.org/jmeter/JMeterSocketClosed 他们都没有工作。 (我使用的是 Jmeter 2.13)

【问题讨论】:

    标签: node.js performance jmeter load-testing


    【解决方案1】:

    如果您在本地运行您的应用服务器(我假设硬件水平适中,即双核/四核 CPU、4/8 GB RAM 等)并在同一台服务器上运行 Jmeter 实例,那么您应该了解以下内容,

    1. 根据经验,您可以假设仅 Jmeter(应用了所有 tuning settings 并有足够的加速)可以使用该硬件创建 500-1000 个线程。

    2. 您正在与 Jmeter 在同一台机器上运行您的应用服务器。这意味着您的应用服务器正在使用更少的资源。从错误来看,目标服务器/应用服务器似乎无法处理该负载。

    3. 这种行为很明显,原因有很多,例如内存不足、CPU 利用率过高、IO 问题、Jmeter 无法处理服务器。

    你能做的是,

    1. 尝试将应用服务器部署在具有相同或更好硬件的单独机器上。
    2. 遵循上述链接中提到的所有 Jmeter 最佳实践。
    3. 在两台服务器上运行测试并监控资源利用率,以便将值与结果相关联。

    检查您的测试是否通过。 (即使它没有,那么至少你知道它不是因为 Jmeter :) 并且在资源 util 日志的帮助下,Jmeter 日志你可以找出瓶颈。)

    我发现的类似问题是Why am I receiving Response code: Non HTTP response code: java.net.SocketException?

    【讨论】:

    • 谢谢。我尝试了同样的方法 - 将应用程序部署在不同的服务器上,并尝试使用本地的 Jmeter 访问它。在这种情况下,问题没有出现。但是有了这个,是否可以测试 1000-5000 CONCURRENT 用户?
    • 这取决于您的服务器能力。如果您按照我的建议对服务器 util 日志和其他性能计数器进行监控,然后通过这些日志检查空间以获得更多负载。如果服务器可以承受该负载,那么是的,您可以使用 1000-5000 个用户运行测试。不要仅仅使用 1000-5000-10000 的负载,而是尝试找出应用程序上的实际预期负载,然后执行此操作。否则它只是压力测试。
    • 假设服务器可以承担该负载,在本地机器上运行的 Jmeter 是否可以同时执行 5000 个线程而不会挂起?这不取决于我本地机器的能力吗?
    • 当然是的 :) 这取决于 JMeter 中的设置(堆大小、jvm 策略)和硬件的最大容量。
    • 如果有帮助,请点赞或接受答案,以便将来成为社区。​​span>
    【解决方案2】:

    当运行最大用户数时,我希望你已经注意了运行的各个方面

    • 用户启动时间
    • 适当的计时器(必须提供适当的思考时间)
    • 最重要的是,正在使用的服务器应该具有响应能力

    对于给定的简单服务器(不支持多线程),当我们连续发送并发请求时,在给定的时间点,我们必须分析并得出一个健康的负载,在一个有更多数量的点发送请求时,通常的行为是脚本会使您在错误中运行;)

    请重新检查并发布更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多