本文介绍在使用PTS过程中出现异常报错的可能原因以及解决方案。

常见报错信息

class java.net.ConnectException:null

表示请求在与远端(被压测端)建立TCP连接时出现失败或者被远端拒绝。请检查后端服务器的健康状况,或者网络连接层是否存在瓶颈。

org.apache.http.ConnectionClosedException:Connection closed

表示连接异常关闭,服务端主动关闭了连接。

java.io.IOException:Connection reset by peer

表示连接被后端服务器重置。若使用了SLB,请检查SLB的配置是否有问题。

org.apache.http.ConnectionClosedException:Connection closed unexpectedly

表示数据尚未接收完成,连接就已关闭。该报错的可能原因是服务端未及时响应或者提前终止调试或压测。

java.lang.RuntimeException:java.net.UnknownHostException

表示域名信息无法解析。请检查域名是否已注册并且能够正常解析,或者未注册的域名是否已进行域名绑定。

org.apache.http.client.CircularRedirectException

表示请求出现了循环重定向的情况(A -> B -> C -> A),或者跳转超过了10次(A1 -> A2 -> A3... -> A10 -> A11)。此时建议您取消302跳转配置后,再次执行压测查看原始请求信息,同时您可以结合Timing瀑布流查看跳转具体路径。
  • 取消302跳转:在场景配置页面关闭允许302跳转的开关。vr
  • 在Timing瀑布流查看跳转具体路径:您可以在压测报告的采样日志详情中查看Timing瀑布流。更多信息,请参见查看采样日志vr

org.apache.hc.core5.http.ProtocolException:Header 'key: value' is illegal for HTTP/2 messages

表示在服务端优先使用HTTP2协议的情况下,场景配置了HTTP2协议不支持的Header,请移除相应Header后重试。HTTP2不支持的常见Header有:Connection、Keep-Alive、Proxy-Connection、Transfer-Encoding、Host及Upgrade。

java.nio.channels.CancelledKeyException:null

表示在HTTP2协议下后端服务器主动断开了连接,此时您需要排查服务端是否有问题。

java.util.concurrent.TimeoutException:null

连接阶段超时,表示请求在与远端(被压测端)建立TCP连接时出现失败或者被远端拒绝。您可以结合Timing瀑布流查看连接阶段是否花费了较长时间。如下图所示,可以看到该Timing瀑布流中在连接阶段花费了较长时间。此时请检查服务端健康状况,或者网络连接层是否存在瓶颈。vt

org.apache.hc.core5.http2.H2StreamResetException:Timeout due to inactivity (5000 MILLISECONDS) * class

响应阶段超时,表示服务端请求响应超时。PTS默认请求超时时间为5s,如需延长该时间您可以在创建场景页面的高级设置页签中自定义请求超时时间。更多信息,请参见通用设置et

java.net.SocketTimeoutException:null

响应阶段超时,表示请求在等待响应或者读取中途(Idle)超时。请检查服务端健康状况或者压测API的请求超时时间设置是否合理,此外也有可能是服务端处理能力出现瓶颈导致该报错。

java.lang.RuntimeException: Could not find the TestPlan class!

JMeter脚本与PTS支持的JMeter版本不兼容,请使用JMeter 5.0版本编辑脚本。

java.lang.SecurityException: class "xxx"'s signer information does not match signer information of other classes in the same package

JMeter脚本中Java Sampler依赖的ApacheJMeter_core或ApacheJMeter_java版本与PTS支持的JMeter 5.0版本不兼容。请使用JMeter 5.0版本的依赖重新打包为Jar包后重试。

Attempt to resolve method: xxx() on undefined variable or class name:

JMeter脚本中BeanShell Sampler依赖的类没有上传,请上传相关Jar包后重试。

常见响应错误码

403(Forbidden)

403状态码通常是因为您没有该接口的访问权限,而服务器端收到了请求但拒绝提供服务导致的。

可能原因1

您的服务器后端鉴权设置导致请求无法被接受,这种情况下是后端业务导致的该报错。

解决方案:您需自行检查业务的鉴权机制。

可能原因2

服务端网关有强校验Header中的UA(User-Agent),对于带有不合法UA的请求,返回无权限信息。PTS发起的请求中默认的UA会带有特殊字样,以便部分业务来区分统计流量和限流规则。

解决方案
  1. 登录PTS控制台,在左侧导航栏选择性能测试 > 场景列表

  2. 选中您的压测场景,单击操作列的编辑,在场景配置页面的Header定义页签中添加一个通用的UA Header,如下所示。
    • key:User-Agent
    • Value:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36
    we
  3. 单击调试场景,在请求详情页面查看请求是否正常。若修改UA后请求正常,则可以判定是UA校验引起的该报错,此时您可以通过修改UA来继续压测。c

可能原因3

被WAF拦截,通常情况下因被WAF拦截导致出现403报错的可能性较小。

解决方案

如果需要有WAF白名单限制,请设置允许PTS流量通过的规则。具体操作,请参见PTS的压测流量因安全策略无法直接访问Web应用,怎么办?

可能原因4

压测域名未备案,或者域名解析到了未备案的其他域名。

解决方案:您可以根据返回结果判断域名是否备案。若出现403,且返回如下HTML信息,则是因为域名未备案导致的报错,此时您需要先对域名进行备案。
<html>
<head>
<meta http-equiv="Content-Type" content="textml;charset=UTF-8" />
   <style>body{background-color:#FFFFFF}</style>
<title>TestPage184</title>
  <script language="javascript" type="text/javascript">
         window.onload = function () {
           document.getElementById("mainFrame").src= "http://****.aliyun.com/alww.html";
            }
</script>
</head>
  <body>
    <iframe style="width:860px; height:500px;position:absolute;margin-left:-430px;margin-top:-250px;top:50%;left:50%;" id="mainFrame" src="" frameborder="0" scrolling="no"></iframe>
    </body>
</html>

405(Method Not Allowed)

出现405报错的可能原因有以下几种:
  1. POST类请求出现302跳转。由于302跳转时会更改请求方法,此时服务端可能无法识别,则会返回405错误。
  2. 请求服务端直接校验Method,对应Response Header中会有Allow =GET的信息字样。
  3. 负载均衡或者Web Server上做转发时,修改了请求Method导致后端无法识别。

406(Not Acceptable)

表示客户端错误,请求的资源其内容特性无法满足请求头中的条件,因而无法生成响应实体。

可能原因

在调试时,请求出现406报错,一般是由于请求构建的Header定义Accept字段设置错误导致的。fi
  • Accept:表示发送端(这里表示PTS)希望接受的数据类型。
  • Content-Type:表示发送端(这里表示PTS)发送的实体数据的数据类型。在PTS场景配置页面的Body定义中设置的Content-Type会自动同步到Header定义中。如果Header定义中的Accept不符合事先约定的内容,就会返回406错误。
ru

解决方案

您需要确认服务端能够验证通过的Accept类型。您可以通过尝试设置不同的Accept类型Value值来确认服务端能够验证通过的Accept类型。以下是Accept的格式类型和匹配顺序可供您参考。
表 1. Accept应用规则
格式类型 格式类型
text/html HTML格式
text/plain 纯文本格式
text/xml XML格式
image/gif GIF图片格式
image/jpeg JPG图片格式
image/png PNG图片格式
application/xhtml+xml XHTML格式
application/xml XML数据格式
application/atom+xml Atom XML聚合格式
application/json JSON数据格式
application/pdf PDF格式
application/msword Word文档格式
application/octet-stream 二进制流数据,例如常见的文件下载。
application/x-www-form-urlencoded <form encType="">中默认的encType,form表单数据被编码为key/value格式发送至服务器(表单默认的提交数据的格式)。
当Accept头有application/xml、text/html、application/json 将按照如下顺序进行produces的匹配:

application/xml > text/html > application/json

当Accept头有application/xml;q=0.3、application/json;q=0.8、text/html 将按照如下顺序进行produces的匹配:

text/html > application/json > application/xml

说明 application/xml参数为媒体类型的质量因子,数字越大则优先权越高(从0到1)。
当Accept头有*/*、text/*、text/html 将按照如下顺序进行produces的匹配:

text/html > text/* > */*

503(Service Unavailable)

可能原因1

后端服务器业务量过载,因而拒绝接收请求。

解决方案:查看后端服务器上是否有相关的错误日志。

可能原因2

如下图所示,您可以看到在PTS的采样日志详情中出现大量的503,但是后端服务器上却没有相关信息。fi
并且您的压测场景信息中同时满足以下几种情况,则说明该报错是SLB抛出的。
  • 接口是HTTP/HTTPS。
  • 压测环境入口是SLB(不区分公网SLB或者私网SLB)。
  • 后端服务并没有抛出503,甚至没有任何记录。
  • 503报错信息与下面内容相同:
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html>
    <head><title>503 Service Temporarily Unavailable</title></head>
    <body bgcolor="white">
    <h1>503 Service Temporarily Unavailable</h1>
    <p>The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.</body>
    </html>

此时可能是由于压测场景中发起压力的源IP有限,单IP触发了SLB集群的单Proxy限流导致该报错;或者由于请求客户端的Connection会默认长连,当IP较少时,导致SLB不能完全做到负载均衡。

说明 默认长连指PTS端和您的服务端默认会采用长连接的形式。

解决方案

其解决方案有几下几种:
  1. 升级PTS资源包。可能是您购买的PTS资源包版本可提供的源IP数量较少,无法满足您的业务需求。目前PTS提供的9.9元体验版资源包只有一个发起源IP,您可以升级资源包至其他版本以满足压测时所需的更多源IP数量。资源包版本的更多信息,请参见资源包计费版本
  2. 使用PTS提供的IP扩展功能。具体操作,请参见扩展施压机
  3. 设置更高的目标并发或者RPS。具体操作,请参见压力模型
  4. 在PTS场景配置页面的Header定义中配置Connection:close请求,配置完成后新增的API会默认该配置,您可以根据需要选择是否修改。qr

504(BadGateway Timeout)

可能原因

网关后挂载的服务器响应超时。

解决方案

请检查后端服务器是否正常提供服务,之后您可以延长网关处的超时时间或者在创建场景页面的高级设置页签中自定义施压机的请求超时时间。vr