本文介紹在使用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瀑布流查看連接階段是否花費了較長時間。此時請檢查服務端健康狀況,或者網絡連接層是否存在瓶頸。
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控制臺將域名綁定至內網IP。
常見響應錯誤碼
403(Forbidden)
403狀態碼通常是因為您沒有該接口的訪問權限,而服務器端收到了請求但拒絕提供服務導致的。
選中您的壓測場景,單擊操作列的編輯,在場景配置頁面的Header定義頁簽中添加一個通用的UA,如下所示。
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>
可能原因1
您的服務器后端鑒權設置導致請求無法被接受,這種情況下是后端業務導致的該報錯。
解決方案:您需自行檢查業務的鑒權機制。
可能原因2
服務端網關有強校驗Header中的UA(User-Agent)
,對于帶有不合法UA的請求,返回無權限信息。PTS發起的請求中默認的UA會帶有特殊字樣,以便部分業務來區分統計流量和限流規則。
解決方案
登錄PTS控制臺,選擇 。
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
的格式類型和匹配順序可供您參考。
表 1. Accept
應用規則
格式類型 | 格式類型 |
| HTML格式 |
| 純文本格式 |
| XML格式 |
| GIF圖片格式 |
| JPG圖片格式 |
| PNG圖片格式 |
| XHTML格式 |
| XML數據格式 |
| Atom XML聚合格式 |
| JSON數據格式 |
| PDF格式 |
| Word文檔格式 |
| 二進制流數據,例如常見的文件下載。 |
|
|
當Accept頭有 | 將按照如下順序進行produces的匹配:
|
當Accept頭有 | 將按照如下順序進行produces的匹配:
說明 application/xml參數為媒體類型的質量因子,數字越大則優先權越高(從0到1)。 |
當Accept頭有 | 將按照如下順序進行produces的匹配:
|
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)
可能原因
網關后掛載的服務器響應超時。
解決方案
請檢查后端服務器是否正常提供服務,之后您可以延長網關處的超時時間或者在創建場景頁面的高級設置區域中自定義施壓機的請求超時時間。