日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

 

業務系統性能問題診斷和優化分析

 

作者:人月神話,新浪博客同名

簡介:多年SOA規劃建設,私有云PaaS平臺架構設計經驗,長期從事一線項目實踐

今天談下業務系統性能問題分析診斷和性能優化方面的內容。這篇文章重點還是談已經上線的業務系統后續出現性能問題后的問題診斷和優化重點。

系統性能問題分析流程

業務系統性能問題診斷和優化分析

 

我們首先來分析下如果一個業務系統上線前沒有性能問題,而在上線后出現了比較嚴重的性能問題,那么實際上潛在的場景主要來自于以下幾個方面。

  • 業務出現大并發的訪問,導致出現性能瓶頸
  • 上線后的系統數據庫數據日積月累,數據量增加后出現性能瓶頸
  • 其它關鍵環境改變,比如我們常說的網絡帶寬影響

正是由于這個原因,當我們發現性能問題的時候,首先就需要判斷是單用戶非并發狀態下本身就有性能問題,還是說在并發狀態才存在性能問題。對于單用戶性能問題往往比較容易測試和驗證,對于并發性能問題我們可以在測試環境進行加壓測試和驗證,以判斷并發下的性能。

如果是單用戶本身就存性性能問題,那么大部分問題都出在程序代碼和SQL需要進一步優化上面。如果是并發性能問題,我們就需要進一步分析數據庫和中間件本身的狀態,看是否需要對中間件進行性能調優。

在加壓測試過程中,我們還需要對CPU,內存和JVM進行監控,觀察是否存在類似內存泄漏無法釋放等情況,即并發下性能問題本身也可能是代碼本身原因導致性能異常。

性能問題影響因素分析

業務系統性能問題診斷和優化分析

 

對于性能問題影響因素,簡單來說包括了硬件環境,軟件運行環境和軟件程序三個方面的主要內容。下面分別再展開說明下。

硬件環境

硬件環境就是我們常說的計算,存儲和網絡資源。

對于服務器的計算能力,一般來說廠家都會提供TPMC參數作為一個參考數據,但是我們實際看到相同TPMC能力下的X86服務器能力仍然低于小型機的能力。

除了服務器的計算能力參數,另外一個重點就是我們說的存儲設備,影響到存儲的重點又是IO讀寫性能問題。有時候我們監控發現CPU和內存居高不下,而真正的瓶頸通過分析反而發現是由于IO瓶頸導致,由于讀寫性能跟不上,導致大量數據無法快速持久化并釋放內存資源。

業務系統性能問題診斷和優化分析

 

比如在Linux環境下,本身也提供了性能監控工具方便進行性能分析。比如常用的iostat,ps,sar,top,vmstat等,這些工具可以對CPU,內存,JVM,磁盤IO等進行性能監控和分析,以發現真正的性能問題在哪里。

比如我們常說的內存使用率持續告警,你就必須發現是高并發調用導致,還是JVM內存泄漏導致,還是本身由于磁盤IO瓶頸導致。

對于CPU,內存,磁盤IO性能監控和分析的一個思路可以參考:

業務系統性能問題診斷和優化分析

 

運行環境-數據庫和應用中間件

數據庫和應用中間件性能調優是另外一個經常出現性能問題的地方。

數據庫性能調優

拿Oracle數據庫來說,影響數據庫性能的因素包括:系統、數據庫、網絡。數據庫的優化包括:優化數據庫磁盤I/O、優化回滾段、優化Rrdo日志、優化系統全局區、優化數據庫對象。

業務系統性能問題診斷和優化分析

 

要調整首先就需要對數據庫性能進行監控

我們可以在init.ora參數文件中設置TIMED_STATISTICS=TRUE 和在你的會話層設置ALTER SESSION SET STATISTICS=TRUE 。運行svrmgrl 用 connect internal 注冊,在你的應用系統正常活動期間,運行utlbstat.sql 開始統計系統活動,達到一定的時間后,執行utlestat.sql 停止統計。統計結果將產生在report.txt 文件中。

數據庫性能優化應該是一個持續性的工作,一個方面是本身的性能和參數巡檢,另外一個方面就是DBA也會經常提取最占用內存的低效SQL語句給開發人員進一步分析,同時也會從數據庫本身的以下告警KPI指標中發現問題。

比如我們可能會發現Oracle數據庫出現內存使用率高的告警,而通過檢查會發現是產生了大量的Redo日志導致,那么我們就需要從程序上進一步分析為何會產生如此多的回滾。

應用中間件性能分析和調優

應用中間件容器即我們常說的Weblogic, Tomcat等應用中間件容器或Web容器。應用中間件調優一個方面是本身的配置參數優化設置,一個方面就是JVM內存啟動參數調優。

對于應用中間件本身的參數設置,主要包括了JVM啟動參數設置,線程池設置,連接數的最小最大值設置等。如果是集群環境,還涉及到集群相關的配置調優。

對于JVM啟動參數調優,往往也是應用中間件調優的一個關鍵點,但是一般JVM參數調優會結合應用程序一起進行分析。

業務系統性能問題診斷和優化分析

 

比如我們常見的JVM堆內存溢出,如果程序代碼沒有內存泄漏問題的話,我就需要考慮調整JVM啟動時候堆內存設置。在32位操作系統下只能夠設置到4G,但是在64位操作系統下已經可以設置到8G甚至更大的值。

其中JVM啟動的主要控制參數說明如下:

  • -Xmx設置最大堆空間
  • -Xms設置最小堆空間
  • -XX:MaxNewSize設置最大新生代空間
  • -XX:NewSize設置最小新生代空間
  • -XX:MaxPermSize設置最大永久代空間(注:新內存模型已經替換為Metaspace)
  • -XX:PermSize設置最小永久代空間(注:新內存模型已經替換為Metaspace)
  • -Xss設置每個線程的堆棧大小

那么這些值究竟設置多大合適,具體來講:

業務系統性能問題診斷和優化分析

 

Java整個堆大小設置,Xmx 和 Xms設置為老年代存活對象的3-4倍,即FullGC之后的老年代內存占用的3-4倍。永久代 PermSize和MaxPermSize設置為老年代存活對象的1.2-1.5倍。

年輕代Xmn的設置為老年代存活對象的1-1.5倍。

老年代的內存大小設置為老年代存活對象的2-3倍。

注意在新的JVM內存模型下已經沒有PermSize而是變化為Metaspace,因此需要考慮Heap內存和Metaspace大小的配比,同時還需要考慮相關的垃圾回收機制是采用哪種類型等。

對于JVM內存溢出問題,我前面寫過一篇專門的分析文章可以參考。

從表象到根源-一個軟件系統JVM內存溢出問題分析解決全過程

業務系統性能問題診斷和優化分析

 

軟件程序性能問題分析

在這里首先要強調的一點就是,當我們發現性能問題后首先想到的就是擴展資源,但是大部分的性能問題本身并不是資源能力不夠導致,而是我們程序實現上出現明顯缺陷。

比如我們經常看到的大量循環創建連接,資源使用了不釋放,SQL語句低效執行等。

為了解決這些性能問題,最好的方法仍然是在事前控制。其中包括了事前的代碼靜態檢查工具的使用,也包括了開發團隊對代碼進行的Code Review來發現性能問題。

所有已知的問題都必須形成開發團隊的開發規范要求,避免重復再犯。

業務系統性能問題擴展思考

對于業務系統的性能優化,除了上面談到的標準分析流程和分析要素外,再談下其它一些性能問題引發的關鍵思考。

上線前的性能測試是否有用?

有時候大家可能覺得奇怪,為何我們系統上線前都做了性能測試,為何上線后還是會出現系統性能問題。那么我們可以考慮下實際上我們上線前性能測試可能存在的一些無法真實模擬生產環境的地方,具體為:

  1. 硬件能否完全模擬真實環境?最好的性能測試往往是直接在搭建完成的生產環境進行。
  2. 數據量能否模擬實際場景?真實場景往往是多個業務表都已經存在大數據量的積累而非空表。
  3. 并發能否模擬真實場景?一個是需要錄制復合業務場景,一個是需要多臺壓測機。

而實際上我們在做性能測試的時候以上幾個點都很難真正做到,因此要想完全模擬出生產真實環境是相當困難的,這也導致了很多性能問題是在真正上線后才發現。

系統本身水平彈性擴展是否完全解決性能問題?

第二個點也是我們經常談的比較多的點,就是我們的業務系統在進行架構設計的時候,特別是面對非功能性需求,我們都會談到系統本身的數據庫,中間件都采用了集群技術,能夠做到彈性水平擴展。那么這種彈性水平擴展能力是否又真正解決了性能問題?

實際上我們看到對于數據庫往往很難真正做到無限的彈性水平擴展,即使對于Oracle RAC集群往往也是最多擴展到單點的2到3倍性能。對于應用集群往往可以做到彈性水平擴展,當前技術也比較成熟。

當中間件能夠做到完全彈性擴展的時候,實際上仍然可能存在性能問題,即隨著我們系統的運行和業務數據量的不斷積累增值。實際上你可以看到往往非并發狀態下的單用戶訪問本身就很慢,而不是說并發上來后滿。因此也是我們常說的要給點,即:

  • 單點訪問性能正常的時候可以擴展集群來應對大并發狀態下的同時訪問
  • 單點訪問本身性能就有問題的時候,要優先優化單節點訪問性能

業務系統性能診斷的分類

對于業務系統性能診斷,如果從靜態角度我們可以考慮從以下三個方面進行分類

  1. 操作系統和存儲層面
  2. 中間件層面(包括了數據庫,應用服務器中間件)
  3. 軟件層面(包括了數據庫SQL和存儲過程,邏輯層,前端展現層等)

那么一個業務系統應用功能出現問題了,我們當然也可以從動態層面來看實際一個應用請求從調用開始究竟經過了哪些代碼和硬件基礎設施,通過分段方法來定位和查詢問題。

比如我們常見的就是一個查詢功能如果出現問題了,首先就是找到這個查詢功能對應的SQL語句在后臺查詢是否很慢,如果這個SQL本身就慢,那么就要優化優化SQL語句。如果SQL本身快但是查詢慢,那就要看下是否是前端性能問題或者集群問題等。

軟件代碼的問題往往是最不能忽視的一個性能問題點

對于業務系統性能問題,我們經常想到的就是要擴展數據庫的硬件性能,比如擴展CPU和內存,擴展集群,但是實際上可以看到很多應用的性能問題并不是硬件性能導致的,而是由于軟件代碼性能引起的。對于軟件代碼常見的性能問題我在以往的博客文章里面也談過到,比較典型的包括了。

  1. 循環中初始化大的結構對象,數據庫連接等
  2. 資源不釋放導致的內存泄露等
  3. 沒有基于場景需求來適度通過緩存等方式提升性能
  4. 長周期事務處理耗費資源
  5. 處理某一個業務場景或問題的時候,沒有選擇最優的數據結構或算法

以上都是常見的一些軟件代碼性能問題點,而這些往往需要通過我們進行Code Review或代碼評審的方式才能夠發現出來。因此如果要做全面的性能優化,對于軟件代碼的性能問題排查是必須的。

通過IT資源監控或APM應用工具來發現性能問題

業務系統性能問題診斷和優化分析

圖片來源 OneAPM

對于性能問題的發現一般有兩條路徑,一個就是通過我們IT資源的監控,APM的性能監控和預警來提前發現性能問題,一個是通過業務用戶在使用過程中的反饋來發現性能問題。

APM應用性能管理主要指對企業的關鍵業務應用進行監測、優化,提高企業應用的可靠性和質量,保證用戶得到良好的服務,降低IT總擁有成本(TCO)。

資源池-》應用層-》業務層

這個可以理解為APM的一個關鍵點,原有的網管類監控軟件更多的是資源和操作系統層面,包括計算和存儲資源的使用和利用率情況,網絡本身的性能情況等。但是當要分析所有的資源層問題如何對應到具體的應用,對應到具體的業務功能的時候很難。

傳統模式下,當出現CPU或內存滿負荷的時候,如果要查找到具體是哪個應用,哪個進程或者具體哪個業務功能,哪個sql語句導致的往往并不是容易的事情。在實際的性能問題優化中往往也需要做大量的日志分析和問題定位,最終才可能找到問題點。

比如在我們最近的項目實施中,結合APM和服務鏈監控,我們可以快速的發現究竟是哪個服務調用出現了性能問題,或者快速的定位出哪個SQL語句有驗證的性能問題。這個都可以幫助我們快速的進行性能問題分析和診斷。

資源上承載的是應用,應用本身又包括了數據庫和應用中間件容器,同時也包括了前端;在應用之上則是對應到具體的業務功能。因此APM一個核心就是要將資源-》應用-》功能之間進行整合分析和銜接。

而隨著DevOps和自動化運維的思路推進,我們更加希望是通過APM等工具主動監控來發現性能問題,對于APM工具最大的好處就是可以進行服務全鏈路的性能分析,方便我們發現性能問題究竟發生在哪里。比如我們提交一個表單很慢,通過APM分析我們很容易發現究竟是調用哪個業務服務慢,或者是處理哪個SQL語句慢。這樣可以極大的提升我們性能問題分析診斷的效率。

 

分享到:
標簽:性能 業務 系統
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定