当前位置: 首页 > 知识库问答 >
问题:

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

张永嘉
2023-03-14

我使用JMeter测试来检查我们的应用程序是否正在运行。测试是从Jenkins通过ANT运行的。

卡住进程的线程转储为:

   [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请求采样器:

    <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>

没有设置超时,但我尝试默认超时为240s-当我尝试从无响应站点获取时,一切正常,240s后JMeter无法完成任务(如预期)。

JMeter版本是2.9运行在linux机器上。

当我问系统管理员关于网络的问题时,他说网络可能超载了。我无法重现这个bug,因为它发生得太少(我也没有TCP转储)。

我想有两种可能的解决办法:

  • 添加一个超时到JMeter来杀死有问题的线程-我不确定如何,有什么提示吗?
  • 添加超时到Jenkins-使用构建超时插件

但我想解决问题,而不是采取变通办法。你有什么建议吗?

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


共有2个答案

宋臻
2023-03-14

您可以在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
宰父玄天
2023-03-14

为什么不添加响应超时到HTTP采样器:

  • http://jmeter.apache.org/usermanual/component_reference.html#HTTP_Request

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

如果您使用HTTPClient4,那么您可能有以下选项,将其添加到httpclient。参数:

  • http.connection.stalecheck

看见http://hc.apache.org/httpclient-legacy/preference-api.html#HTTP_connection_parameters:

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

 类似资料:
  • Mpx提供了网络请求库fetch,抹平了微信,阿里等平台请求参数及响应数据的差异;同时支持请求拦截器,请求取消等 使用说明 import mpx from '@mpxjs/core' import mpxFetch from '@mpxjs/fetch' mpx.use(mpxFetch) // 第一种访问形式 mpx.xfetch.fetch({ url: 'http://xxx.com' }

  • 类似于Ajax,QAP实现了Fetch功能,能够简单的异步的获取资源。 GET QN.fetch('http://121.42.141.44:8888', { body: '', method: 'GET', mode: 'same-origin', dataType: 'text', }) .then(response => { return respon

  • request 指的是小程序中的网络请求,在 mpvue 框架中可以通过小程序提供的原生 API wx.request 来进行相关的处理。但是在这里推荐一个第三方的网络请求库 fly。之所以推荐这个第三方库,是因为可以在多个端上实现代码的复用,目前已支持的有 Node.js 、微信小程序 、Weex 、React Native 、Quick App。 在 mpvue 中如何使用 安装 npm in

  • Chrome提供了较为完整的方法供扩展程序分析、阻断及更改网络请求,同时也提供了一系列较为全面的监听事件以监听整个网络请求生命周期的各个阶段。网络请求的整个生命周期所触发事件的时间顺序如下图所示。 网络请求的生命周期,图片来自developer.chrome.com 要对网络请求进行操作,需要在Manifest中声明webRequest权限以及相关被操作的URL。如需要阻止网络请求,需要声明web

  • wget 命令 wget url #下载文件 wget -O demo.html url #下载文件并改为指定名称 wget -c url #断点续传 wget -i url url url #下载多个文件 wget -t 5 url #网络不好时重试 5 次 wget -t 0 url #不断重试 wget --limit-rate 20k url #限速下载 wget -Q 10

  • 假设我在同一台机器上有两个docker网络。(网络1和网络2) 在每个网络上,我都有容器。(容器-1-网络-1和容器-1-网络-2等) 我需要从Container-1(172.18.0. x)向Container-2(172.19.0. x)发送PUT请求,但我收到“连接拒绝”,因为不同的网络无法相互通信。我在这里有什么选择?我可以将一个容器移动到另一个网络,或将网络合并到一个或以某种方式链接容器