效能分析優化的道與術

老_張發表於2022-04-17

前言

之前有很多同學問我,效能測試中到底該如何去定位分析瓶頸並進行效能優化?感覺壓測場景設計做的很全面,分析工具也用了很多,但一直無法快速的定位分析並進行優化。

效能分析和優化一直是技術領域熱門的一個話題,無論是三高(高效能、高可用、高穩定),還是CAP(資料一致性、服務可用性、分割槽容錯性),都強調了服務的效能和可用。

那麼在工作中,該如何去測試並進行效能優化呢?這篇文章,我來談談我對於效能分析和優化的一些理解。

 

請求是如何被處理的?

“工欲善其事,必先利其器;欲利其器,必曉其理”。

在進行效能分析優化之前,先來看看一個請求處理的生命週期圖。

如上圖所示,是常見的一個微服務分散式架構下的請求處理過程。

我們經常談的效能快和慢,實際上是一個相對的數值,它更多的是我們對於使用者使用系統時訪問速度體驗的評估。

因此在進行效能定位分析之前,一定要清楚請求經過了哪些鏈路環節?它們的耗時分別是多少?是否是正常數值區間?如果數值異常,可能的原因是什麼?

通過快速排除法,最終將效能分析和優化的點聚焦在一定範圍內,這樣才能快速的定位排查原因。

 

常見的效能問題與原因

看了上面的請求處理生命週期流程圖,可以得到下面幾點影響效能的因素。

網路頻寬

網路對效能的影響不言而喻。

如果頻寬不足,單位時間內的請求過多,就會導致資料包的傳輸延遲較大。

如果網路不穩定,也會導致RT的曲線抖動較為劇烈,產生毛刺甚至丟包,這個時候P90/P99的數值也可能變大。

因此穩定和足夠的網路頻寬,對系統的效能來說是很重要的。

負載均衡

現在的SLB層已經優化的足夠好,但如果負載均衡出現問題,可能會導致流量分發不均勻,導致部分應用節點流量異常,健康檢查不通過從而被踢下線。

甚至服務註冊重試失敗或者彈性擴容不夠及時,還會導致可用的節點承受了較多的請求最終導致雪崩效應。

安全策略

現在的軟體系統,常見的安全防護策略有ddos高防以及WAF,一般都是部署在SLB和流量閘道器之間或者更上層。

安全防護策略常見的場景有異常檢測、輸入驗證、安全補丁、狀態管理以及基於規則和異常的保護功能。

這些安全策略能夠有效的保護系統不受到一些惡意的攻擊和侵入,但這些策略生效也是需要耗費時間的。

流量閘道器

上面提到的幾個部分都可以看做是網際網路時代的基礎通用層,而閘道器是伴隨著微服務和容器化出現的,作為使用者流量的系統入口,閘道器也承擔了較多的功能,比如:

  • 日誌
  • 身份鑑權
  • 灰度釋出
  • 限流熔斷
  • 可觀測性metrics
  • 應用限流apm tracing

上述的功能,無論是身份鑑權還是可觀測性的metrics的實現,都需要耗費一定時間。

特別是對於請求的RT比較敏感的業務,對流量閘道器功能的耗時要求更為嚴格。

相關文章基於Apache APISIX的全流量API閘道器統籌叢集流量

Web應用層

近幾年前後端分離的系統設計越來越多,web層更多的負責頁面的渲染展示和部分討好使用者的互動設計。

如何讓使用者更快的感知到他所感興趣的東西,這個時候CDN和快取就派上用場了。

利用CDN和快取的特性“就近載入”,讓使用者感知到的效能更快,也是效能優化領域很重要的一點。

APP應用層

前面講了web層負責頁面渲染展示和友好的互動,那App應用層(即我們常說的後端服務)則更多的負責邏輯計算。

邏輯計算是很吃資源的,當然和它的一些引數配置以及技術架構也有較大關聯。

常見的影響後端服務效能的因素如下:

  • 硬體資源:如CPU/Memory;
  • 引數配置:如Activethreads/TimeOut;
  • 快取配置:快取中的大Key及快取命中率;
  • 平行計算:請求下游依賴是序列還是並行?
  • 程式碼邏輯:最經典的例子——for迴圈無線套娃;
  • 日誌處理:特別是異常日誌的處理以及生產日誌級別;
  • 處理機制:同步還是非同步?如果是非同步,MQ容量及消費能力如何?

推薦閱讀認清效能問題

資料儲存層

資料儲存層我們通常理解為資料庫。資料庫層面影響效能的因素應該是最常見也是最多的。比如:

  • 鎖:不合理的鎖使用導致的請求等待;
  • 索引:未加索引或索引未生效導致慢SQL;
  • 資料量:表資料量過大導致的讀寫變慢等問題;

針對業務擴張以及資料量變大的問題,常見的優化策略有分表、資料庫垂直拆分、讀寫分離等;

 

壓測不是發現問題的唯一手段

回到效能定位分析和優化的話題上,關於效能優化,如下三點是必須銘記的。

效能優化的目標

在保持和降低系統99%RT的前提下,不斷提高系統吞吐量,提高流量高峰時期的服務可用性。

效能優化的挑戰

  1. 日益增長的使用者量(帶來訪問量的提升,大資料量的儲存和處理);
  2. 越來越多樣的業務(業務的不斷迭代和發展,會使其複雜性指數提升);
  3. 越來越複雜的系統(為了支撐業務迭代發展,系統架構會變得很複雜);

效能優化的路徑

  1. 降低響應時間;
  2. 提高系統吞吐量;
  3. 提高服務可用性;

PS:三者關係在某些場景下互相矛盾衝突,不可兼得

效能優化的道法術器

基於上述關於效能優化的幾點內容,結合我個人的實踐經驗和看法,效能定位和分析分為下面四個境界。

  • 道:熟悉業務邏輯,瞭解系統架構;
  • 法:掌握技術原理,熟知問題定位和分析優化的軟體工程方法論;
  • 術:不斷實踐踩坑,總結歸納效能驗證、定位分析的方法和經驗;
  • 器:熟練使用效能測試、監控追蹤、問題分析和優化的各種工具並擅加利用;

 

如何讓系統執行的更快更穩定

時間空間

軟體系統的三高(高效能、高可用、高穩定)要求,歸根結底實際上需要在成本、收益、風險之間做取捨,我們很難做到用最低的成本達到最好的效果。

有個很早之前的優化理論,叫做“時間換空間,空間換時間”,講的就是在響應時間和硬體資源消耗之間做平衡。效能優化的關鍵在於平衡各部分元件的效能平衡點,

如果CPU資源有空閒,但是記憶體使用緊張,便可以使用時間換空間的策略,達到整體的效能優化;反之CPU資源緊張,記憶體資源有空閒,則可以使用空間換時間的策略,提升整體效能。

分層優化

請求的處理過程要經過多個鏈路環節,除了優化耗時最長難度和成本較低的環節之外,在每個環節都進行一定優化,則對整體效能的提升有很大幫助。下面是流量高峰時的一些優化或者說應對案例:

資料庫

  1. 擴容:DB是有狀態服務,計算層便於擴容,將DB節點放到容器中,有需要擴容;
  2. 災備:對於大流量讀場景可通過流量切換方式,將部分流量遷移到備份叢集分流;
  3. 巡檢:慢SQL是常見的問題,可通過自動監控和歷史資料分析,提供輔助式決策;

應用層(計算層)

  1. 限流:控制訪問應用的流量在系統承載範圍內
    1. 在業務請求入口(閘道器)限流,避免內部互相呼叫放大流量;
    2. 限流是個演進狀態,從連線池、IP、指定SQL到更細的層級粒度做限流;
    3. 每個呼叫層都做限流,每個應用先保證自己可用,對其他依賴呼叫要做到“零信任”;
  1. 降級:強依賴通過熔斷做緊急處理,弱依賴提前主動降級
    1. 主動降級:提前進行風險識別,然後針對性的降級,可降低已知的風險;
    2. 緊急降級:假設出現重大的問題,才需要決策是否啟用的方案(風險較大);
    3. 預案平臺:預案平臺的目的是留痕,方便後續把限流降級等配置恢復回來;
  1. 熔斷:熔斷下游強依賴的服務
    1. 雙十一零點的前半小時, 做一個動態推送,把日誌關掉;
    2. 真正流量來的時候,留一臺機器來觀察錯誤和異常的日誌;
  1. 隔離:核心和非核心業務做隔離

身份識別和業務隔離案例如下:

    1. RPC group分組:假設有100個節點,40個給核心業務(交易),60個給其他業務;
    2. 業務身份:中臺架構可通過業務身份把訂單秒殺等應用打上標記,便於隔離區分;

 

相關文章