本文介紹在使用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-AgentValue: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)
可能原因
網關後掛載的伺服器響應逾時。
解決方案
請檢查後端伺服器是否正常提供服務,之後您可以延長網關處的逾時時間或者在建立情境頁面的進階設定地區中自訂施壓機的請求逾時時間。
