作者:智雲
為什麼要做壓測的問題定位?
效能測試 PTS(Performance Testing Service)是具備強大的分散式壓測能力的 SaaS 壓測平臺,可模擬海量使用者的真實業務場景,全方位驗證業務站點的效能、容量和穩定性。
在不斷的對被壓服務端水位進行摸高的過程中,我們可以從壓測檢視或者壓測報告中看到較為全面的壓測指標,例如 QPS、RT、TPS 等,但是單純從這些指標上,是不能很快的定位到服務端具體問題所在的,例如,我們從全場景錯誤資訊中心可以看到錯誤碼對應的介面的響應體,但是具體在下游的哪一環節出錯,以及錯誤的堆疊是什麼,這裡單純從報告中是看不到的,而介面下游具體是哪裡出錯,錯誤堆疊是什麼,正是使用者所關心的問題。
藉助問題診斷,我們可以明確被壓介面的上下游的呼叫情況,同時,從鏈路檢視上,我們可以看到整條鏈路所經過的訊息元件(Kafka、RocketMQ 等)、快取(Redis、MongoDB 等)、資料庫(MySQL、Oracle 等)、RPC 呼叫(Feign、Dubbo、HttpClient 等),例如,某個介面出現狀態碼異常或者其他的錯誤,那麼,我們可以從呼叫鏈上看到到底是 Rpc 呼叫出現問題,還是資料庫讀寫出現問題,並且能夠從呼叫鏈上看到對應的報錯堆疊,在這些資訊的基礎上,問題應該去哪裡定位也就比較明確了。
問題診斷基本介紹和核心優勢
基本介紹
談到問題診斷,使用者主要關心接入問題診斷是否需要對應用側程式碼做一系列的改造,是否需要進行繁雜的配置等等。PTS 提供的問題診斷是基於 JavaAgent 的,無需使用者側做業務程式碼改造,對於基於 Tomcat 的部署方式,使用者只需在啟動指令碼中新增一些必要的引數即可接入問題診斷;對於 Kubernetes 使用者,使用者只需在 Yaml 配置檔案中新增一些必要的註解即可接入問題診斷。對於鏈路的採集規則,PTS 會提供預設的配置,使用者也可根據自己的需要自行更改。
PTS 整合的問題診斷在壓測過程中,針對每條請求,會在施壓引擎端生成 TraceId,通過 TraceId 將該條請求所涉及到的上下游鏈路關聯起來,使用者可以看到從該條請求作為入口到本條請求結束所涉及到的完整呼叫鏈,同時,問題診斷會針對該呼叫鏈生成相應的應用拓撲檢視,可以讓使用者清晰地看到應用之間的呼叫關係。
針對異常的介面,我們可以在呼叫鏈中看出對應的錯誤原因,同時,使用者可以根據具體的報錯堆疊對服務端的問題進行排查和優化。壓測過程中使用者可以實時的檢視指定請求的呼叫鏈,同時,壓測結束之後,也可以從壓測報告中對問題進行回溯。
核心優勢
1、零程式碼侵入: 針對 Java 型別的服務,使用者側無需進行業務側程式碼改造即可完成問題診斷的探針接入。
2、整合度高: 壓測、監控、問題診斷,整合在同一控制檯,使用者理解和操作成本相對較低。
3、監控指標全: 在壓測過程中,除了較為基礎的監控指標外,同時針對每個服務,提供介面、機器、應用級別的監控。
4、門檻低: 僅需要簡單配置引數即可完成問題診斷探針接入,同時該探針還具備多協議 Mock、全鏈路壓測等功能。
快速玩轉問題診斷
接入問題診斷的基本流程圖如下所示:
接入探針,並檢視是否接入成功
首先,我們將被壓場景所涉及到的應用梳理出來,將涉及到的所有應用按照【問題診斷】->【探針接入 [1] 】文件中的步驟進行問題診斷探針接入。我們可以在 PTS 控制檯的應用配置或者應用監控、介面監控、機器監控中任選一個來檢視應用探針是否接入成功。我們本次演示的壓測場景涉及到五個應用,分別是 petstore-web、petstore-user、petstore-order、petstore-catalog、petstore-cart,這以應用監控舉例來檢視應用是否成功接入。依次點選 PTS 控制檯的【問題診斷】->【應用監控 [2] 】->選擇我們配置的 Region 以及 Namespace,如果看到壓測場景涉及到的所有應用均在該頁面,則代表應用接入成功。
在壓測場景中開啟問題診斷開關
然後,我們在 PTS 控制檯的【壓測中心】->【建立場景 [3] 】中建立壓測場景,這裡可以選擇 PTS 場景或者 JMeter 場景等,這裡以 PTS 場景為例,因為本次演示主要是驗證問題診斷的能力,所以需要在場景配置中的【高階設定】中開啟問題診斷開關。具體的監控採集規則,PTS 會為使用者推送預設採集開關開啟的配置,同時,將取樣率設定為千分之一,使用者也可根據自己的需要進行自定義。
開始壓測,檢視應用監控
完成了以上步驟,我們的壓測場景即具備了問題診斷的能力。當我們點選開始壓測之後,可以到應用監控、介面監控、機器監控中選擇我們關心的服務檢視對應的監控情況,這裡以應用監控 [2] 為例,其他型別的監控操作步驟類似,我們選擇 petstore-user 這個服務來檢視應用監控,如下圖所示:
壓測結束後,檢視全場景錯誤資訊
壓測結束後,我們需要從壓測報告中針對被壓服務端的問題進行排查,開啟對應場景的壓測報告,具體步驟:PTS 控制檯->【壓測中心】->【報告列表 [4] 】,選擇對應的壓測報告,可以從概覽頁中看到全場景的資訊,具體如下圖所示:
選擇探針取樣,檢視具體呼叫鏈情況
點選【檢視取樣日誌】,取樣型別選擇”探針取樣“即可過濾出問題診斷探針所採集到的呼叫鏈,具體如下圖所示:
檢視呼叫鏈具體錯誤堆疊資訊,定位服務端問題所在
篩選出來探針端採集的呼叫鏈之後,即可對存在問題的介面進行呼叫鏈分析,例如,商品列表的介面返回的狀態碼為 500,點選檢視詳情看下具體原因,如下圖所示:
從呼叫棧中可以看到具體的報錯原因,從而對服務端程式碼進行優化和修復。同時,可以通過應用拓撲檢視和資料庫檢視檢視服務之間的呼叫情況以及資料庫使用情況,這裡以應用拓撲檢視舉例,如下圖所示:
壓測報告常見錯誤碼總結
問題診斷錯誤碼總結
問題診斷呼叫鏈路中的常見錯誤碼進行總結,具體如下:
- java.lang.NullPointerException:服務端空指標,具體可根據呼叫鏈中的錯誤堆疊對服務端的程式碼進行排查。
- com.microsoft.sqlserver.jdbc.SQLServerException:服務端 SQL 報錯,可根據呼叫鏈採集的堆疊資訊對服務端 SQL 語法等進行檢查。
壓測報告錯誤碼總結
這裡針對壓測報告中常見的錯誤進行列舉,我們可以從全場景錯誤資訊中看到相關的錯誤資訊,具體如下:
- class java.net.SocketTimeoutException:null 表示請求在等待響應或者讀取中途(idle)超時。請檢查服務端健康狀況或者 PTS 的壓測 API 超時時間的設定是否合理,另外還有可能是服務端處理能力出現瓶頸。
- class java.net.ConnectException:null 表示請求在與遠端(被壓測端)建立 TCP 連線時就出現失敗或者被遠端拒絕。請檢查服務端健康狀況,或者是網路連線層是否有瓶頸。
- class java.util.concurrent.TimeoutException:null 表示請求在與遠端(被壓測端)建立 TCP 連線時就出現失敗或者被遠端拒絕。請檢查服務端健康狀況,或者是網路連線層是否有瓶頸。
- class org.apache.http.ConnectionClosedException:Connection closed 表示連線異常關閉,服務端主動關閉了連線。
- class java.io.IOException:Connection reset by peer 表示連線被重置。若使用了 SLB,請檢視 SLB 的配置是否有問題。
- class org.apache.http.ConnectionClosedException:Connection closed unexpectedly 表示資料尚未接收完畢,連線就已關閉。可能服務端未及時響應或者提前終止除錯或壓測。
- class java.lang.RuntimeException:java.net.UnknownHostException 表示域名資訊無法解析。請檢查域名是否已經正常註冊並可以解析、未註冊的域名是否已進行域名繫結。
- class 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。
相關連結
[1] 探針接入
https://pts.console.aliyun.co...
[2] 應用監控
https://pts.console.aliyun.co...
[3] 建立場景
https://pts.console.aliyun.co...
[4] 報告列表
https://pts.console.aliyun.com/#/report/list