JMeter HTTP请求挂起(可能在过载的网络上)

时间:2013-04-29 19:18:14

标签: java http jenkins jmeter

我使用JMeter测试来检查我们的应用程序是否正在运行。测试从Jenkins通过ANT <jmeter>标签运行。问题是, JMeter不时挂起(并且Jenkins执行器被阻止为仍在运行)。在两个月内(测试每10分钟进行一次)只发生了两次这样的挂起,但今天,两个并行测试同时被卡住(在5分钟内,不同的测试)。我怀疑网络连接(它经常过载且不可靠),但我希望即使在这样的环境中测试也是可靠的。

卡住进程的线程转储是:

   [jmeter] "User test 1-1" prio=10 tid=0x00007fd56c43f000 nid=0x2797 runnable [0x00007fd5704e2000]
   [jmeter]    java.lang.Thread.State: RUNNABLE
   [jmeter]     at java.net.SocketInputStream.socketRead0(Native Method)
   [jmeter]     at java.net.SocketInputStream.read(SocketInputStream.java:146)
   [jmeter]     at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:204)
   [jmeter]     at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:177)
   [jmeter]     at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:201)
   [jmeter]     at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:155)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.readResponse(HTTPSamplerBase.java:1649)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPAbstractImpl.readResponse(HTTPAbstractImpl.java:235)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:300)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:62)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.followRedirects(HTTPSamplerBase.java:1410)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.resultProcessing(HTTPSamplerBase.java:1481)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPAbstractImpl.resultProcessing(HTTPAbstractImpl.java:251)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:358)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:62)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1088)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1077)
   [jmeter]     at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:428)
   [jmeter]     at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256)
   [jmeter]     at java.lang.Thread.run(Thread.java:679)

并从第二次测试(此测试测试www.google.com的可达性):

   [jmeter] "www.google.com 1-1" prio=10 tid=0x0000000000d32000 nid=0x27e8 runnable [0x00007fb9fea54000]
   [jmeter]    java.lang.Thread.State: RUNNABLE
   [jmeter]     at java.net.SocketInputStream.socketRead0(Native Method)
   [jmeter]     at java.net.SocketInputStream.read(SocketInputStream.java:146)
   [jmeter]     at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:204)
   [jmeter]     at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:177)
   [jmeter]     at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:201)
   [jmeter]     at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:155)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.readResponse(HTTPSamplerBase.java:1649)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPAbstractImpl.readResponse(HTTPAbstractImpl.java:235)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:300)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:62)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1088)
   [jmeter]     at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1077)
   [jmeter]     at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:428)
   [jmeter]     at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256)
   [jmeter]     at java.lang.Thread.run(Thread.java:679)

我使用HTTP Request采样器使用默认值:

    <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="www.google.cz" enabled="true">
      <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true">
        <collectionProp name="Arguments.arguments"/>
      </elementProp>
      <stringProp name="HTTPSampler.domain">www.google.cz</stringProp>
      <stringProp name="HTTPSampler.port"></stringProp>
      <stringProp name="HTTPSampler.connect_timeout"></stringProp>
      <stringProp name="HTTPSampler.response_timeout"></stringProp>
      <stringProp name="HTTPSampler.protocol">http</stringProp>
      <stringProp name="HTTPSampler.contentEncoding"></stringProp>
      <stringProp name="HTTPSampler.path"></stringProp>
      <stringProp name="HTTPSampler.method">GET</stringProp>
      <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
      <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
      <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
      <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
      <boolProp name="HTTPSampler.monitor">false</boolProp>
      <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
    </HTTPSamplerProxy>

没有设置超时,但我试验了默认超时为240秒 - 当我从非响应站点尝试GET时,一切正常,在240秒后JMeter失败了任务(如预期的那样)。

JMeter版本在Linux机器上运行2.9。

当我问系统管理员关于网络时,他说这可能是超载的。我无法重现这个错误,因为它发生得如此稀疏(我也没有TCP转储)。

我考虑了两种可能的解决方法:

  • 向JMeter添加超时以消除有问题的线程 - 我不确定如何提示?
  • 使用Build-timout plugin
  • 向Jenkins添加超时

我想解决问题,而不是解决方法。 你有什么建议吗?

线程仍然卡住,可以从中提取一些有用的信息吗?我刚用kill -3 $PID来获取线程转储。

2 个答案:

答案 0 :(得分:5)

为什么不直接向HTTP Sampler添加响应超时:

  

响应超时:等待响应的毫秒数。

如果您使用HTTPClient4,那么您可以使用以下选项,将其添加到httpclient.parameters:

  • http.connection.stalecheck

请参阅http://hc.apache.org/httpclient-legacy/preference-api.html#HTTP_connection_parameters

  

确定是否使用陈旧连接检查。禁用过时连接检查可能会导致性能略有提高,但在通过服务器端已关闭的连接执行请求时,可能会出现I / O错误。

答案 1 :(得分:3)

您可以在Jmeter属性文件中设置默认超时设置,如下所示:(Jmeter版本2.6.11)

# Following properties apply to both Commons and Apache HttpClient

# set the socket timeout (or use the parameter http.socket.timeout)
# Value is in milliseconds
httpclient.timeout=60000
# 0 == no timeout