鯨品堂|性能優化手記上篇之【原則】&【方法】

2022-06-01 47

1


背景


性能優化是軟件開發中老生常談的話題。性能問題重在平時良好的研發規范、設計規范的約束,思想認識的提高,敬畏之心的保持。但在實際產品研發活動過程中,無論項目的大小或多或少都會遇到性能問題。即便在項目伊始我們就定義性能保障的種種規章制度,往往也會受限于人力、時間等原因,在長期的需求迭代過程中存在放松的現象,導致性能問題的爆發。

同時隨著時間的流逝,系統在長期的運行過程中由于數據量、訪問量不斷增長,造成系統的邏輯越來越復雜、請求耗時越來越長。在此情況下一旦遇到促銷活動等大并發請求時,系統瓶頸問題就會凸顯。

當遇到性能問題時如果沒有思路、沒有方法就很容易眉毛胡子一把抓,不但不能快速定位和解決問題,還會走不少彎路甚至制造出新的問題出來。

本篇將從【原則】&【方法】兩個方面與大家探討軟件開發的性能優化。

2


優化原則


在對系統進行性能優化時既要最大程度地避免對原有邏輯和體驗的破壞,又要能夠快速定位、發現問題,因此我們應遵從一定的原則開展性能優化工作。以下的優化原則是筆者從實戰中總結的的指導思路。

  • 重構原則:性能優化時不能影響現有業務功能,盡可能地避免用戶體驗感知下降,不能影響周邊系統交互,盡量基于重構思想。


  • 最優先原則:產生性能問題瓶頸的原因多種多樣,往往存在多個點都可進行優化,這時我們需要分析出影響性能的最大瓶頸位置,并且作為最優先考慮優化的點。因為在其他點上的優化,往往也會受限于最大瓶頸處的限制,不能帶來性能提升或者提升效果不明顯。


  • 二八原則:在軟件系統中造成性能問題的往往是應用中的一個小模塊,因此在性能優化時不要盲目動手,應該通過工具和標準方法逐步找出瓶頸模塊。性能優化要做的就是對瓶頸按優先原則確定部分目標進行優化,通過對20%的性能問題進行處理,達到80%的效果,不宜全部并行處理。


  • 深度還原原則:性能問題時常是在某個特定場景下才會觸發,因此在進行性能優化時需要深度還原造成性能問題的場景,包括環境、配置、業務數據等各方面。通過深度還原能夠加快復現性能問題,分析問題產生原因。


  • 實事求是原則:性能優化是建立在客觀、實事求是的基礎之上,優化時以數據為主,推理驗證為輔,優化前后的所有數據準確無誤且有記可查,盡量用截圖或報表方式呈現。


3


優化方法


如果說原則是指導我們解決問題的理論基礎,那么在原則之上就必須要形成行之有效的方法了。筆者在過往的性能優化工作中,基于上述原則總結了6種優化方法,結合實戰案例,分析性能問題的真正原因,結合每種方法從現象入手,對性能問題進行剖析并予以解決。


圖片關鍵詞


空間換時間



空間換時間在性能優化中是使用頻率最高的一種方法,它主要通過增加數據副本縮短訪問路徑、提升訪問媒介效率、增加硬件資源等方式,以達到更快的訪問效率,快速獲取所需數據。具體的典型操作包括冗余數據、增加數據索引、增加本地緩存、增加分布式緩存、使用CDN等。在過往的項目優化中,合理地運用空間換時間方法會帶來意想不到的性能提升效果。

實戰案例:


現象:某產品發布上線后經過一段時間的運行,管理員在管理門戶上查詢訂單信息的操作耗時增加,影響操作體驗。


分析:分析訂單信息查詢功能,發現訂單信息展示時需要展示商品名稱,而商品名稱與訂單信息不是同一個數據庫,每次都需要根據商品ID調用服務去查詢商品名稱回來。在服務調用過程中當調用的服務次數多了,開銷就增加了。


解決方案:根據訂單信息第一屏中展示的內容,商品名稱是需要通過服務調用獲取的,因此采用空間換時間的方式將商品中心g_goods表的數據冗余一份到訂單中心。當進行訂單信息第一屏數據展示時,將訂單中心的o_order_item與g_goods關聯查詢,減少中心間服務調用。


同步轉異步



同步轉異步方法在性能優化使用頻率也比較高,該方法主要是確保業務主流程正常,將主流程以外的業務邏輯通過異步的方式進行處理。通常用在外部系統接口、消息通知、日志記錄、數據統計這類場景中。

實戰案例:


現象:現場有個客戶使用的小程序,從客戶點擊登錄按鈕到客戶信息展示的時間平均需要3S左右,無論在業務忙時還是在業務閑時耗時都差不多。


分析:對客戶登錄后的處理邏輯進行分析,發現展示的客戶信息很多是依賴于調用外部服務返回,并且服務使用同步的方式進行調用。當一個外部服務響應不及時,則會造成客戶登錄后信息加載緩慢,甚至出現空白頁面的情況。


解決方案:從客戶體驗出發將客戶信息進行分塊,系統內的客戶信息在客戶登錄后優先返回到前端進行渲染展示。對于調用外部服務獲取客戶其他信息的處理改為異步調用的方式,當外部服務返回信息后再加載到前端頁面進行展示。


優化后:客戶登錄后信息展示的耗時從3S提升到0.5S。


串行轉并行



串行轉并行是使用計算機的并行計算結構(如多核技術、多線程技術),把多個串行執行的命令或者步驟,改為并行執行的方式。使用該方法前需要確定調整的邏輯是否有依賴關系,只有無依賴關系的操作才能使用該方式。

實戰案例:


現象:客戶在平臺上訂購權益商品后,客戶無法立即使用購買權益商品的手機號碼登錄平臺使用,引發客戶投訴。


分析:分析客戶無法立即使用權益的原因,發現是客戶訂購的權益商品沒有立即送往對應的權益提供商進行開通導致。進一步分析發現沒有及時送的原因是平臺生成權益商品訂購單后,需要送多個外部系統,而且是按照順序一個個送。當其中一個系統出現問題后其它系統將被堵住,而送權益提供商的處理恰巧排在最末。


解決方案:調整權益商品訂購單送外部系統的處理邏輯,將現有串行送外系的操作調整為并行同步給外系統,實現權益商品購買后能夠立即送往權益提供商進行開通,各業務系統之間的操作相互隔離,互不影響。


化繁為簡



在項目開發過程中,為了追求功能的靈活性、可擴展性以及復用性,實際執行的處理邏輯比業務所需的處理復雜得多,使整個邏輯處理做了很多無用功,導致耗時變長。這種情況可根據業務特點進行邏輯解耦、流程拆分等,將復雜邏輯細化成簡單可復用的原子組件,再使用原子組件拼裝出滿足業務需求的處理機制、流程。

實戰案例:


現象:某產品查詢客戶可訂購商品的功能,經過兩年的需求迭代,校驗規則越來越多,查詢效率越來越慢。


分析:借助Arthas工具分析商品查詢調用鏈上的每一步耗時,發現規則引擎執行耗時嚴重。進一步對規則引擎進行分析發現:

① 單個規格執行耗時很短,只需十幾毫秒,但存在300多個規則,導致總體規則執行經常超過4S;

② 每次請求都重新生成了多個規則引擎對象,導致規則對象內存占用高達幾G,從而頻繁觸發FullGC;

③ 業務邏輯對執行的規則缺少細分,所有規則都會執行。


解決方案通過優化規則執行方法:

① 梳理出簡單規則,簡單規則不使用規則引擎engine.eval,改為直接比較法進行判斷;

② 創建規則引擎池JsScriptEnginePool,減少規則引擎重復創建;

③ 業務規則增加狀態,只檢索有效的規則進行執行。


優化前:10個并發, tps在1.6左右,請求平均耗時7.5s(再增加并發量就大面積請求異常)。


優化后:100并發用戶時,平均tps為102,請求平均耗時在1s內。


化整為零



將系統壓力大的點通過分散壓力的方式實現性能提升。數據層面通常是將冷熱數據分離、分庫分表的方式進行分解壓力;服務訪問層面通常是擴充應用服務器、調整負載均衡和路由規則等方式平衡服務請求。

實戰案例:


現象:某項目近兩年的業務發展較快,每天新增訂單大約6W??蛻粼谶M行訂單查詢時耗時越來越長,每次查詢耗時達到3S以上。


分析:分析訂單查詢功能發現耗時長的主要原因是訂單的數據量多,造成查詢語句執行效率低。對業務場景進行分析發現1~2個月內的數據訪問率在92%以上,3~6個月的數據訪問率在7%左右,超過6個月的數據訪問率在1%以下。


解決方案:根據分析結果對訂單表oi_order_item進行瘦身,新增his_oi_order_item表用來存放超過半年的數據。同時對his_oi_order_item表的數據訪問提供新服務。通過將訂單表oi_order_item的數據化整為零,大幅提升訂單查詢效率,數據庫壓力下降明顯。訂單查詢耗時從原來3S下降到0.5S。


參數調優



在應用中會包含大量的配置參數,其中有操作系統參數、運行環境參數、數據庫參數、開源組件參數等等。在過往的性能問題優化中發現,有時只是對這些參數按照項目特性進行合理配置,就能達到理想的效果。

實戰案例:


現象:系統在已經上線運行超過半年,一直存在操作卡頓的現象,業務高峰期甚至5分鐘就出現一次。


分析:通過分析系統出現卡頓時的應用狀態,發現rights-intf應用在卡頓時所有的線程都出現響應不及時的情況,并且rights-intf應用也在頻繁觸發FullGC操作。在業務高峰期每5分鐘觸發一次FullGC。每次FullGC后老年代內存使用率從98%左右下降到50%左右。


解決方案:根據分析結果倒推,懷疑rights-intf應用的JVM Xms和Xmx設置太小,導致頻繁觸發FullGC操作。檢查rights-intf應用的JVM Xms和Xmx 配置的為1G。將1G改為3G后觀察rights-intf應用未發生FullGC操作,系統運行平穩,卡頓現象消失。


4


小結


在項目建設過程中性能優化往往作為一種事后補救手段,在處理時常常面臨著時間緊、分析定位困難、改造難度大,且容易造成客戶投訴等問題,因此性能問題重點在于日常工作的關注,功能設計時提前考慮,開發過程中提前規避,測試和運營時提前發現。




官方微信公眾號

浩鯨云計算科技股份有限公司 版權所有 2003-2023

蘇ICP備10224443號-6       蘇公網安備 32011402011374號

亚洲精品免费视频_热99re6久精品国产首页青柠_精品国产专区91在线_亚洲美洲欧洲偷拍片区