天天看點

基于 PTS 壓測輕松玩轉問題診斷

性能測試 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 将該條請求所涉及到的上下遊鍊路關聯起來,使用者可以看到從該條請求作為入口到本條請求結束所涉及到的完整調用鍊,同時,問題診斷會針對該調用鍊生成相應的應用拓撲視圖,可以讓使用者清晰地看到應用之間的調用關系。

基于 PTS 壓測輕松玩轉問題診斷

針對異常的接口,我們可以在調用鍊中看出對應的錯誤原因,同時,使用者可以根據具體的報錯堆棧對服務端的問題進行排查和優化。壓測過程中使用者可以實時的檢視指定請求的調用鍊,同時,壓測結束之後,也可以從壓測報告中對問題進行回溯。

核心優勢

1、零代碼侵入: 針對 Java 類型的服務,使用者側無需進行業務側代碼改造即可完成問題診斷的探針接入。

2、內建度高: 壓測、監控、問題診斷,內建在同一控制台,使用者了解和操作成本相對較低。

3、監控名額全: 在壓測過程中,除了較為基礎的監控名額外,同時針對每個服務,提供接口、機器、應用級别的監控。

4、門檻低: 僅需要簡單配置參數即可完成問題診斷探針接入,同時該探針還具備多協定 Mock、全鍊路壓測等功能。

快速玩轉問題診斷

接入問題診斷的基本流程圖如下所示:

基于 PTS 壓測輕松玩轉問題診斷

接入探針,并檢視是否接入成功

首先,我們将被壓場景所涉及到的應用梳理出來,将涉及到的所有應用按照【問題診斷】->【探針接入 [1] 】文檔中的步驟進行問題診斷探針接入。我們可以在 PTS 控制台的應用配置或者應用監控、接口監控、機器監控中任選一個來檢視應用探針是否接入成功。我們本次示範的壓測場景涉及到五個應用,分别是 petstore-web、petstore-user、petstore-order、petstore-catalog、petstore-cart,這以應用監控舉例來檢視應用是否成功接入。依次點選 PTS 控制台的【問題診斷】->【應用監控 [2] 】->選擇我們配置的 Region 以及 Namespace,如果看到壓測場景涉及到的所有應用均在該頁面,則代表應用接入成功。

基于 PTS 壓測輕松玩轉問題診斷

在壓測場景中打開問題診斷開關

然後,我們在 PTS 控制台的【壓測中心】->【建立場景 [3] 】中建立壓測場景,這裡可以選擇 PTS 場景或者 JMeter 場景等,這裡以 PTS 場景為例,因為本次示範主要是驗證問題診斷的能力,是以需要在場景配置中的【進階設定】中打開問題診斷開關。具體的監控采集規則,PTS 會為使用者推送預設采集開關打開的配置,同時,将采樣率設定為千分之一,使用者也可根據自己的需要進行自定義。

基于 PTS 壓測輕松玩轉問題診斷

開始壓測,檢視應用監控

完成了以上步驟,我們的壓測場景即具備了問題診斷的能力。當我們點選開始壓測之後,可以到應用監控、接口監控、機器監控中選擇我們關心的服務檢視對應的監控情況,這裡以應用監控 [2] 為例,其他類型的監控操作步驟類似,我們選擇 petstore-user 這個服務來檢視應用監控,如下圖所示:

基于 PTS 壓測輕松玩轉問題診斷

壓測結束後,檢視全場景錯誤資訊

壓測結束後,我們需要從壓測報告中針對被壓服務端的問題進行排查,打開對應場景的壓測報告,具體步驟:PTS 控制台->【壓測中心】->【報告清單 [4] 】,選擇對應的壓測報告,可以從概覽頁中看到全場景的資訊,具體如下圖所示:

基于 PTS 壓測輕松玩轉問題診斷

選擇探針采樣,檢視具體調用鍊情況

點選【檢視采樣日志】,采樣類型選擇”探針采樣“即可過濾出問題診斷探針所采集到的調用鍊,具體如下圖所示:

基于 PTS 壓測輕松玩轉問題診斷

檢視調用鍊具體錯誤堆棧資訊,定位服務端問題所在

篩選出來探針端采集的調用鍊之後,即可對存在問題的接口進行調用鍊分析,例如,商品清單的接口傳回的狀态碼為 500,點選檢視詳情看下具體原因,如下圖所示:

基于 PTS 壓測輕松玩轉問題診斷

從調用棧中可以看到具體的報錯原因,進而對服務端代碼進行優化和修複。同時,可以通過應用拓撲視圖和資料庫視圖檢視服務之間的調用情況以及資料庫使用情況,這裡以應用拓撲視圖舉例,如下圖所示:

基于 PTS 壓測輕松玩轉問題診斷

壓測報告常見錯誤碼總結

問題診斷錯誤碼總結

問題診斷調用鍊路中的常見錯誤碼進行總結,具體如下:

  • 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.com/#/diagnosis/probeAccess/pts

[2] 應用監控

https://pts.console.aliyun.com/#/ahas/appList?type=Summary

[3] 建立場景

https://pts.console.aliyun.com/#/create/scene

[4] 報告清單

​​https://pts.console.aliyun.com/#/report/list​​

繼續閱讀