軟件性能測試分析與調優實踐之路-性能分析調優思想與調優技術總結


本文主要闡述軟件性能測試中的一些調優思想和技術,節選自作者新書《軟件性能測試分析與調優實踐之路》部分章節歸納。

一、  性能分析與調優思想

1、性能分析調優模型

性能測試除了為獲取性能指標外,更多是為了發現性能瓶頸和性能問題,然后對性能問題和瓶頸進行分析和調優,在當今互聯網高速發展的時代,性能調優的模型可以歸納總結如下圖所示。

 

 

系統模型中相關的組件描述如下表所示

組件

描述

網絡分發

網絡分發是高速發展的互聯網時代常用的降低網絡擁塞,快速響應用戶請求的一種技術手段,最常用的網絡分發就是CDN(Content Delivery Network,即內容分發網絡),依靠部署在世界各地的邊緣服務器,通過中心平台的負載均衡、源服務器內容分發、調度等功能模塊,使世界各地用戶就近獲取所需內容,而不用每次都到中心平台的源服務器獲取響應結果,比如南京的用戶直接訪問部署在南京的邊緣服務器,而不需要訪問部署在遙遠的北方的北京的服務器

Web服務器

Web服務器用於部署Web服務,Web服務器的作用就是負責請求的響應和分發以及靜態資源的處理

Web服務

Web服務指運行在Web服務器上的服務程序,最常見的Web服務就是Nginx和Apache

Web Cache

Web Cache指Web層的緩存,一般都是臨時緩存HTML、CSS、圖像等靜態資源文件

應用服務器

應用服務器用於部署應用程序,如Tomcat、WildFly、普通的Java應用程序(如jar包服務),IIS等

應用程序服務

應用程序服務指運行在應用服務器上的程序,比如Java應用,C/C++應用、Python應用,一般用於處理用戶的動態請求

應用緩存

應用緩存指應用程序層的緩存服務,常用的應用緩存技術有Redis、Memcached等,這些技術手段也是動態擴展的高並發分布式應用架構中經常使用的技術手段

數據庫(DB)

用於數據的存儲,可以包括關系型數據庫以及NoSql數據庫(非關系型數據庫),常見的關系型數據庫有Mysql、Oracle、Sqlserver、DB2等,常見的NoSql數據庫有Hbase、MongoDB、ElasticSearch等

外部系統

指當前系統依賴於其他的外部系統,需要從其他的外部系統中通過二次請求獲取數據,外部系統有時候可能會存在很多個

上圖中的系統模型是一個互聯網中常見的用戶請求的分層轉發和處理的過程,在性能調優時就是不斷采集系統中的性能指標以及系統模型中各層的資源消耗,從中發現性能瓶頸和性能問題,然后對瓶頸和問題進行分析診斷來確定性能調優方案,最后通過性能壓測進行驗證調優方案是否有效,如果無效繼續重復這個過程進行性能分析,直到調優方案有效,瓶頸和問題得到解決。這個過程一般是非常漫長,因為很多時候性能調優方案往往不是一次就能有效或者一次就能解決所有的瓶頸和問題,或者解決了當前的瓶頸和問題,但是繼續性能壓測又可能會出現新的瓶頸和問題。

轉載請注明出處:來源於博客園,作者:張永清,https://www.cnblogs.com/laoqing/p/13660768.html

2、性能分析與調優思想

2.1、分層分析

分層分析指的就是按照系統模型以及系統架構分層按照調用鏈進行監控分析和問題排查,如下圖所示。

 

 

  •          分層排查一般需要對系統的應用架構層次以及部署架構非常的熟悉,需要熟悉請求的處理鏈過程。
  •          分層排查一般需要對每一層建立checklist,然后按照每層的checklist逐一進行分析。
  •          分層排排查效率較低,但是往往能發現更多的性能問題。
  •          分層排查可以自上而下也可以自下而上。

2.2、科學論證

科學論證一般包括發現問題、問題假設、預測、試驗論證、分析這5個步驟,如下圖所示。

 

 

  •          發現問題:指通過性能采集和監控,發現了性能瓶頸或者性能問題,比如並發用戶數增大后TPS並不增加、每台應用服務器的CPU消耗相差特別大等。
  •          問題假設:指根據自己的經驗判斷,假設是某個因素導致了出現瓶頸和問題。
  •          預測:指根據問題假設,預測可能出現的一些現象或者特征。
  •          試驗論證:根據預測,去檢查預期可能出現的現象或者特征
  •          分析:根據獲取到的實際現象或者特征進行分析,判斷假設是否正確,如果不正確,就重新按照這個流程進行分析論證。

科學論證法進行性能分析與調優的示例如下圖所示。

 

 

2.3、問題追溯與歸納總結

(1)、問題追溯分析指的是根據問題去追溯最近系統或者環境發生的變化,一般適用於生產已上線系統的版本發布或者環境變動導致的性能問題,問題追溯的步驟一般如下圖所示,問題追溯分析是通過在追溯和描述中去逐步排查可能導致問題的原因。

 

 

(2)、歸納總結指的根據經驗的總結,在出現某種性能瓶頸或者性能問題時根據以往總結的原因進行逐一排查。

 

二、  性能調優技術

1、緩存調優

互聯網高速發展的這個時代,緩存使用已經成為了很多大型系統或者電商網站使用的一個關鍵技術,合理的設計緩存直接關系到了一個系統或者網站的並發訪問能力和用戶體驗。網站按照存放地點的不同可以分為用戶端緩存和服務端緩存,如下圖所示。

 

 

 

緩存調優的關鍵點說明如下:

  •          如何讓緩存的命中率更高?
  •          如何注意防止緩存穿透?
  •          如何控制好緩存的失效時間?
  •          如何做好緩存的監控分析?比如slow log分析、連接數監控、內存使用監控。
  •          如何防止緩存雪崩?緩存雪崩指的是服務器在出現斷電等極端異常情況后,緩存中的數據全部丟失,導致大量的請求全部需要從數據庫中直接獲取數據從而數據庫壓力過大造成數據庫崩潰,防止緩存雪崩需要注意:

(1)       要處理好緩存數據全部丟失后,如何能快速把數據重新加載到緩存中。

(2)       緩存數據的分布式冗余備份,當出現數據丟失時,可以迅速切換使用備份數據。

2、同步轉異步推送

 同步:指的是系統收到一個請求后,在該請求沒有處理完成時,就一直不返回響應結果,直到處理完成了才返回響應結果,如下圖所示。

轉載請注明出處:來源於博客園,作者:張永清,https://www.cnblogs.com/laoqing/p/13660768.html

 

 

異步:與同步相比,異步指的是系統收到一個請求后,只立即返回請求調用方請求接收成功,在請求處理完成后,再異步推送處理結果給調用方,或者請求調用方在間隔一定時間再重新來獲取請求結果。如下圖所示。

 

 轉載請注明出處:來源於博客園,作者:張永清,https://www.cnblogs.com/laoqing/p/13660768.html

同步轉異步主要是解決同步請求時的阻塞等待,一直處於阻塞等待的請求,往往會造成連接不能快速釋放,從而導致高並發處理時,連接數不夠用,通過隊列異步接收請求后,請求處理方再進行分布式的並行處理,從而達到處理能力擴展,並且網絡連接也可以快速釋放。

3、拆分

拆分指的是將系統中的復雜的業務調用拆分為多個簡單的調用,如下圖所示,一般遵循的原則如下:

  •          對於高並發的業務請求調用都單獨拆分為單個的子系統應用。
  •          對於並發訪問量接近的業務,可以按照產品業務進行拆分,相同的產品業務都歸類到一個新的子系統中。

 

 

系統拆分帶來的好處就是高並發的業務不會對低並發業務的性能造成影響,而且系統在硬件擴展時,也可以有針對性的進行擴展,避免資源的浪費。

4、任務分解與並行計算

任務分解與並行計算指的是將一個任務拆分為多個子任務,然后將多個子任務並行進行計算處理,最后只需要再將並行計算的結果合並在一起返回即可。目的是通過並行計算的方式來增加處理性能,如圖所示。

 

 轉載請注明出處:來源於博客園,作者:張永清,https://www.cnblogs.com/laoqing/p/13660768.html

另外對於包含多個處理步驟的串行任務,也可以盡量按照如下圖所示的方式轉換為並行計算處理。

 

 5、索引與分庫分表

索引指應用程序在查詢時,盡量走數據庫索引查詢,數據庫表在創建時也盡量對查詢條件的字段建立合適的索引,這里強調一定是合適的索引,如果索引建立不合適,不僅對查詢效率沒有任何的幫助,反而會使數據庫表在插入數據時變的更慢,因為一旦建立了索引后,數據在插入時,索引也會自動更新,這樣就加大數據庫的插入時的資源消耗。比如數據庫表中有一個字段為“status”,而“status”的取值只有0、1、2 三個值,這時候如果對“status”建立索引,對查詢效率就沒有任何幫助,因為“status”字段的值只有1、2、3這三個值,建立索引后根據“status”去檢索時,需要掃描的數據還是非常的大,因為“status”字段的取值范圍太少,過濾出來的數據量還是非常的龐大。

正確的使用索引可以很好的提高查詢效率,但是如果一個表的數據量非常的龐大,比如達到了億萬級別了,此時索引查詢很慢了,並且新數據插入時也很慢,此時就需要對數據進行分表或者分庫了,分庫一般指的是一個數據庫的存儲已經很大了,查詢和插入時I/O消耗非常大,此時就需要將數據庫拆分成2個庫來減輕讀寫時I/O的壓力,如下圖所示。

 

 轉載請注明出處:來源於博客園,作者:張永清,https://www.cnblogs.com/laoqing/p/13660768.html

常見的分庫分表方式如下:

  •          按照冷熱數據分離的方式:一般將使用頻率非常高的數據稱之為熱數據,查詢頻率較低或者幾乎不被查詢的數據稱之為冷數據,冷熱數據分離后,熱數據單獨存儲,這樣數據量就會下降下來了,查詢的性能自然也就提升了,而且還可以更方便的單獨針對熱數據做I/O的性能調優了。
  •          按照時間維度的方式:比如可以按照實時數據和歷史數據分庫分表,也可以按照年份、月份等事件區間進行分庫分表,目的是盡可能的減少庫表中的數據量。
  •          按照一定的算法計算的方式:此種方式一般適用於數據都是熱數據的情況,比如數據無法做冷熱分離,所有的數據都經常被查詢,而且數據量又非常的大。此時就可以根據數據中的某個字段做算法計算(注意的是這個字段一般是數據查詢時的檢索條件字段),使得數據能均勻的落到不同的分表中去,查詢時再根據查詢條件字段做算法計算就可以快速的定位到是需要到哪個表中去進行查詢。

數據分庫分表后,帶來的另一個好處就是,如果單次查詢時,需要查詢多個分表,那么此時就可以通過多線程並行的方式去查詢每個分表,最后對每個分表的查詢結果做一次合並即可,這樣也可以使得查詢的效率更高。

關於軟件性能分析調優,可以加微信號yq597365581或者微信號hqh345932,進入專業的性能分析調優群進行交流溝通。

 

 

備注:作者的原創文章,轉載須注明出處。原創文章歸作者所有,歡迎轉載,但是保留版權。對於轉載了博主的原創文章,不標注出處的,作者將依法追究版權,請尊重作者的成果。

本文作者:張永清  文章選自 作者2020年初即將出版的《軟件性能測試、分析與調優實踐之路》一書。文章鏈接:https://www.cnblogs.com/laoqing/p/13660768.html

  

 

個人介紹:從事功能測試、自動化測試、性能測試、Java軟件開發、大數據開發、架構師等工作十多年,在自動化測試設計、性能測試設計、性能診斷、性能調優、分布式架構設計等方面積累了多年經驗,參與過的系統涉及公安、互聯網、移動互聯網、大數據、人工智能等領域。先后任職於江蘇飛搏軟件、蘇寧大數據研發中心、蘇寧研究院、蘇寧人工智能研發中心、紫金普惠研發中心等公司,歷任測試經理、技術經理、部門經理、高級架構師等職位,重點關注大數據、圖像處理、高性能分布式架構設計等領域,著有《robot framework 自動化測試框架核心指南》、《軟件性能測試、分析與調優實踐之路》,apache dolphinscheduler 貢獻者。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM