找茬小王子 2024-04-30 17:00 采纳率: 50%
浏览 23

Jmeter并发测试报错如何解决?

使用Jmeter做web服务器的接口并发测试时,设置并发数量少(200以内)的时候所有请求都正常,并发数量多了(200以上)以后少数几个请求出现异常,总计出现3种异常,想请教各位测试大咖这些异常情况该如何解决
一、 failed to respond

org.apache.http.NoHttpResponseException: 47.107.113.27:80 failed to respond
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:141)
    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:940)
    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:651)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:66)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1311)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1300)
    at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:651)
    at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:570)
    at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:501)
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:268)
    at java.lang.Thread.run(Unknown Source)

二、Read timed out

java.net.SocketTimeoutException: Read timed out
    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 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:940)
    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:651)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:66)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1311)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1300)
    at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:651)
    at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:570)
    at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:501)
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:268)
    at java.lang.Thread.run(Unknown Source)

三、个别请求返回:未能读取到有效 token

{"code":401,"msg":"未能读取到有效 token","data":null}

未能读取到有效 token的问题在网上找到原因:并发的数量多了之后每个请求执行的顺序被打乱,导致部分需要token的请求提前执行所以返回没有读取到有效token,我想问这种情况一般怎么做才能保证请求执行的顺序

  • 写回答

7条回答 默认 最新

  • 专家-皆知 2024-04-30 17:00
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    针对您遇到的JMeter并发测试中的三个问题,我将逐一提供解决方案,并尽量避免使用限制性的词汇。

    一、failed to respond (NoHttpResponseException)

    这个问题通常是因为服务器在处理高并发请求时未能及时响应,或者网络层面出现了问题。

    解决方案:

    • 增加连接超时和响应超时设置:在JMeter的HTTP请求默认配置中,调整Connect Timeout(连接超时)和Response Timeout(响应超时)的值,例如设置为30秒或更长。
    • 优化服务器配置:与开发团队协作,检查服务器的负载均衡和线程池设置,确保服务器能处理更高的并发量。
    • 使用更大的HTTP连接池:在JMeter的HTTP采样器高级选项中,增大Advanced -> HTTP Request Defaults -> Implementation(如使用HC4 Implementation)下的Max Keep-Alive Requests值。

    二、Read timed out (SocketTimeoutException)

    这也是超时问题,意味着在指定时间内没有从服务器收到数据。

    解决方案:

    • 如同上述第一个问题,增加超时设置。
    • 分批并发:使用JMeter的线程组控制,分批启动线程,减少瞬间的并发压力。
    • 检查服务器日志:查看服务器端是否有慢查询或其他性能瓶颈的迹象。

    三、未能读取到有效 token

    这是典型的依赖顺序问题,特别是在并发场景下。

    解决方案:

    1. 使用前置处理器获取Token:确保在需要Token的请求前,使用HTTP Cookie Manager或HTTP Authorization Manager来管理Token。如果Token是通过特定API获取,使用前置处理器(如JSR223 Sampler与Groovy脚本)来获取并存储在变量中。

      def response = new groovy.json.JsonSlurper().parseText(prev.getResponseDataAsString())
      vars.put('token', response.token) // 假设响应中的token字段
      
    2. 使用逻辑控制器维护执行顺序

      • 对于必须按顺序执行的请求,使用“线程组”内的“交易控制器”(Transaction Controller),确保其内部请求按顺序执行。
      • 使用“循环控制器”或“如果控制器”基于条件确保Token获取后再执行其他请求。
    3. 分布式测试:如果单机无法承受高并发,考虑分布式测试以减轻单节点的压力,同时确保每个节点都有正确的Token处理逻辑。

    保证请求顺序的一般策略

    • 使用逻辑控制器:JMeter的“逻辑控制器”如“简单控制器”、“事务控制器”可以帮助组织请求顺序。
    • 依赖注入:确保每个请求可以访问它所需要的依赖项(如Token),这通常通过变量或属性实现。
    • 避免硬编码顺序:利用JMeter的变量和函数,动态地决定请求的执行,尤其是在并发环境中。

    请根据实际情况调整这些策略,以最适合您的测试场景。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月30日

悬赏问题

  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错
  • ¥15 拓扑学,凸集,紧集。。
  • ¥15 如何扩大AIS数据容量