本文介绍在使用PTS过程中出现异常报错的可能原因以及解决方案。
常见报错信息
class java.net.ConnectException:null
表示请求在与远端(被压测端)建立TCP连接时出现失败或者被远端拒绝。请检查后端服务器的健康状况,或者网络连接层是否存在瓶颈。
org.apache.http.ConnectionClosedException:Connection closed
表示连接异常关闭,服务端主动关闭了连接。
org.apache.hc.core5.http.ConnectionClosedException:Connection is 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跳转的开关。
在Timing瀑布流查看跳转具体路径:您可以在压测报告的采样日志详情中查看Timing瀑布流。更多信息,请参见查看采样日志。
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瀑布流中在连接阶段花费了较长时间。此时请检查服务端健康状况,或者网络连接层是否存在瓶颈。
org.apache.hc.core5.http2.H2StreamResetException:Timeout due to inactivity (5000 MILLISECONDS) * class
响应阶段超时,表示服务端请求响应超时。PTS默认请求超时时间为5s,如需延长该时间您可以在创建场景页面的高级设置页签中自定义请求超时时间。更多信息,请参见通用设置。
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包后重试。
class java.lang.IllegalArgumentException:forbidden uri, uri host must match vpc cidr pattern 10.0.0.0/8, 172.16.0.0/12 or 192.168.0.0/16
表示您当前使用了VPC内网压测,但压测URL中的域名解析结果为非内网网段IP,这时您需要使用内网IP进行压测,或者登录PTS控制台配置DNS解析将域名映射至内网IP。
常见响应错误码
403(Forbidden)
403状态码通常是因为您没有该接口的访问权限,而服务器端收到了请求但拒绝提供服务导致的。
可能原因1
您的服务器后端鉴权设置导致请求无法被接受,这种情况下是后端业务导致的该报错。
解决方案:您需自行检查业务的鉴权机制。
可能原因2
服务端网关有强校验Header中的UA(User-Agent),对于带有不合法UA的请求,返回无权限信息。PTS发起的请求中默认的UA会带有特殊字样,以便部分业务来区分统计流量和限流规则。
解决方案
登录PTS控制台,在左侧导航栏选择 。
选中您的压测场景,单击操作列的编辑,在场景配置页面的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
单击调试场景,在请求详情页面查看请求是否正常。若修改UA后请求正常,则可以判定是UA校验引起的该报错,此时您可以通过修改UA来继续压测。
可能原因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报错的可能原因有以下几种:
POST类请求出现302跳转。由于302跳转时会更改请求方法,此时服务端可能无法识别,则会返回405错误。
请求服务端直接校验Method,对应Response Header中会有
Allow =GET
的信息字样。负载均衡或者Web Server上做转发时,修改了请求Method导致后端无法识别。
406(Not Acceptable)
表示客户端错误,请求的资源其内容特性无法满足请求头中的条件,因而无法生成响应实体。
可能原因
在调试时,请求出现406报错,一般是由于请求构建的Header定义中Accept字段设置错误导致的。
Accept:表示发送端(这里表示PTS)希望接受的数据类型。
Content-Type:表示发送端(这里表示PTS)发送的实体数据的数据类型。在PTS场景配置页面的Body定义中设置的Content-Type会自动同步到Header定义中。如果Header定义中的Accept不符合事先约定的内容,就会返回406错误。
解决方案
您需要确认服务端能够验证通过的Accept类型。您可以通过尝试设置不同的Accept类型Value值来确认服务端能够验证通过的Accept类型。以下是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 |
|
当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,但是后端服务器上却没有相关信息。
并且您的压测场景信息中同时满足以下几种情况,则说明该报错是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端和您的服务端默认会采用长连接的形式。
解决方案
504(BadGateway Timeout)
可能原因
网关后挂载的服务器响应超时。
解决方案
请检查后端服务器是否正常提供服务,之后您可以延长网关处的超时时间或者在创建场景页面的高级设置页签中自定义施压机的请求超时时间。