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

2022-06-01 50

1


背景(jǐng)


性能優化是軟件開發中老生常談的話題。性能問題重在平(píng)時良好的研發規範、設計規範的約束,思想認識的提高,敬畏之心的保持。但在實際產品(pǐn)研發活動過程中,無論(lùn)項目的大小或多或(huò)少都(dōu)會遇到性能問題。即便在項目伊(yī)始我們就定義性能保障的種種(zhǒng)規章製度,往往也會受限於(yú)人力、時間等原因,在長期的需求(qiú)迭代過程中存在放鬆的現象,導致性能問題的爆發。

同時隨著時間的流逝,係統(tǒng)在長期的運行過程中由(yóu)於數據量、訪問量不斷增長,造成係統的邏輯越來越複雜、請求(qiú)耗時越來越長。在此情況下(xià)一旦遇到促銷活動(dòng)等大並發請求時,係統瓶頸問題就會凸顯。

當遇到(dào)性能問(wèn)題時如(rú)果沒有思路、沒有(yǒu)方法就很容易眉毛胡子一把抓,不但不能快速定位和解決問題,還會走不少彎路甚至製造出(chū)新的問題出來。

本篇將從【原則】&【方法】兩個方麵與大(dà)家探討軟件開發的(de)性能優化(huà)。

2


優化原則


在對係統進行性能優化時既要最大(dà)程度地避免(miǎn)對原有邏輯和體(tǐ)驗的破壞,又要能夠(gòu)快速(sù)定位、發現問題(tí),因此我們應遵從一(yī)定的原則開展性能優化(huà)工作。以下的優化原則是筆者從實戰中總結的的指導思路。

  • 重構原(yuán)則:性能(néng)優化時不能影響現有業務功能,盡可能(néng)地(dì)避(bì)免用戶體驗感知下降(jiàng),不能影響周邊係統交互,盡量基(jī)於重構(gòu)思想。


  • 最優先(xiān)原(yuán)則:產生性能問題瓶頸的原因多(duō)種多樣,往往存在多個點都可進行優化,這時我們需要分(fèn)析(xī)出影響性能(néng)的最大瓶頸位置,並且作為最優先(xiān)考慮優化的點。因為在其他點上(shàng)的優化(huà),往往也會(huì)受限於最大瓶頸處的限製(zhì),不能帶來(lái)性能提(tí)升或者提升效果不明顯。


  • 二八原則(zé):在軟件係統中造成性能問題的往(wǎng)往是應用中的一個小(xiǎo)模塊,因此在性(xìng)能優化時不要(yào)盲目動手,應該通過工(gōng)具和標準方法逐步找出瓶頸模塊。性能優(yōu)化要(yào)做的就(jiù)是對瓶頸按優先原則(zé)確定部分目標進行優化,通過對20%的性能問題進行處理,達到80%的效果,不宜全部並行處理。


  • 深度還(hái)原原則:性能問(wèn)題時常是在某個特定場景下才會觸發,因此在進行性(xìng)能優化時需(xū)要深度還原造成性能問題的場景,包括環境、配置、業務(wù)數據等各方麵。通過深度還原能夠加快(kuài)複現性能問題,分析問題產(chǎn)生原因。


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


3


優化方法


如(rú)果說原則是(shì)指導我們解決問題的理論基礎,那麽在原則之上就必須要形成行之有效(xiào)的方法了。筆者在(zài)過往的性能優化工作中,基於(yú)上述原則總結了6種優化方法,結合實戰案例,分析性能(néng)問題的真正原因,結合每種方法(fǎ)從現象入手,對性能問題進行剖析並予以解決。


圖片關鍵詞


空間換時間



空間換(huàn)時間在性能優化中是使用頻率最高的一種方(fāng)法,它主要(yào)通過增(zēng)加數據副本縮短訪問路徑、提升訪問媒(méi)介(jiè)效率(lǜ)、增加硬(yìng)件資源等方式,以達到更快的訪問效率(lǜ),快速獲(huò)取所需數據。具體的典型操作包括冗餘數據、增加(jiā)數據索引(yǐn)、增加本(běn)地(dì)緩存(cún)、增加分布式(shì)緩存、使用CDN等。在過往的項(xiàng)目優化中,合理地運用(yòng)空間換時間方法會帶來意想不到(dào)的性能提(tí)升效果。

實戰案例:


現象:某(mǒu)產品發布上線後經過一段(duàn)時間(jiān)的運行,管理員在管理門戶上查詢訂單信(xìn)息的操(cāo)作耗時增加(jiā),影響操作體驗(yàn)。


分析:分(fèn)析訂單信息查詢功(gōng)能,發現訂單信息展示時需要展(zhǎn)示商品(pǐn)名稱,而商品名稱與訂單信息不是同一個數據庫,每次都(dōu)需要根據商品ID調用服務(wù)去查詢商品名稱回來。在服務調用過程中當(dāng)調用的服務次數多了,開銷(xiāo)就增加(jiā)了。


解決方案:根據訂單信(xìn)息第一屏中展示(shì)的內容(róng),商品名稱是需要通過服務調用獲取的,因此采用空間換(huàn)時間的方式將商品(pǐn)中心g_goods表的數據冗餘一份到訂(dìng)單中心。當進行訂單信息第一屏數據展示時,將訂單中心的o_order_item與(yǔ)g_goods關聯查詢(xún),減少中心間服務調用(yòng)。


同步轉異步



同步(bù)轉異步方法(fǎ)在性能(néng)優化(huà)使用頻率也比較高(gāo),該方法主要是確保業務主流程正常,將主流程以外的業(yè)務邏輯通過異步的方式進行處理。通常用(yòng)在外部係統接口、消息通知、日(rì)誌記錄、數據統計這(zhè)類場景中。

實戰案例:


現象:現場有個客戶(hù)使用(yòng)的小程序,從客戶點擊登錄按鈕到客戶信息展示的(de)時間平(píng)均(jun1)需要3S左右,無論在業務忙時(shí)還是(shì)在業務閑(xián)時耗時都差不多。


分析:對客(kè)戶登(dēng)錄後的處理邏輯進行分析,發現展示的客戶(hù)信息很多(duō)是(shì)依賴(lài)於調(diào)用外部服務返回,並且服務使用同步的方式進行調用。當一個外部服務響應不(bú)及時,則會造成客(kè)戶(hù)登錄後信息加載緩慢,甚至出現空白頁麵的情況。


解決方案:從客戶體驗出發將客戶信息進行分塊,係統內的客戶信息在客戶登錄後優先返(fǎn)回到前端進(jìn)行渲染展示。對於調用外部服務獲取客戶其他信息的處(chù)理改為(wéi)異步(bù)調用的(de)方式,當(dāng)外部服務返回信息後再加載到前端頁(yè)麵進行展示。


優化後:客戶登錄(lù)後信息展示的耗時(shí)從3S提升到(dào)0.5S。


串行轉並行



串行轉並行是(shì)使用計算機的並行計(jì)算結構(如多(duō)核技(jì)術、多線程技術),把多(duō)個串行執行的命令或者(zhě)步驟,改(gǎi)為並行執行的方式。使用該方法前需要確定調(diào)整的邏輯是否有依賴(lài)關係,隻有無依賴關係(xì)的操作才(cái)能使(shǐ)用該方式。

實戰案例:


現象:客戶在平台上訂購權益商品(pǐn)後,客戶無法立即使用購買權益商品(pǐn)的(de)手(shǒu)機號碼登(dēng)錄平台使用(yòng),引發客戶投(tóu)訴。


分析:分析客戶無法立即使用權益的原因,發現是客戶訂購的權益商品沒有立即送往(wǎng)對應的權益(yì)提供商進行(háng)開通導致(zhì)。進一步分析發現沒(méi)有及時送的原因是平台生成權益商品訂(dìng)購單後,需要送多個外部係統,而且是按照順序一個(gè)個送。當其中一個係統出現問(wèn)題後其它係統將被堵住,而送權益提供商的處理恰巧排(pái)在最末。


解決方案:調(diào)整權益商品訂購單送外部係統的處理邏輯,將(jiāng)現有串行送外係的操作調整為並行同步給外係統,實現(xiàn)權益商品購買後能夠(gòu)立即(jí)送往權益提供商進行開通,各業務係統之間的操(cāo)作相互隔離(lí),互不影響。


化繁為簡



在項目開發過程中,為了追求功能的靈活性、可擴展性以(yǐ)及複(fù)用性,實際執行的處理邏輯比業務所需的處理複雜得多(duō),使整(zhěng)個邏(luó)輯處(chù)理做了很多無用功,導致(zhì)耗時變長。這種情(qíng)況可根據業務特點進行邏輯解耦、流程(chéng)拆分等,將複雜邏輯(jí)細化成簡單可複用的原子組(zǔ)件,再使(shǐ)用原子組件拚裝出(chū)滿足(zú)業務需求的處理機製、流程。

實戰案例:


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


分析(xī):借助Arthas工具分析商品查詢調用鏈上的每(měi)一步耗時,發現規則(zé)引擎執行耗時嚴重。進一步(bù)對(duì)規則引擎進行分析發現:

① 單個規格執(zhí)行耗時很短(duǎn),隻需十幾毫秒,但存在300多個規則,導致總體規則執行經常超過4S;

② 每次請求都重新(xīn)生成了多(duō)個規則(zé)引擎對象(xiàng),導致規則對象內存占用高達幾G,從(cóng)而頻繁觸發FullGC;

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


解(jiě)決方案通過優(yōu)化規則執行方法:

① 梳理出簡單規(guī)則,簡單規則不使用規則引擎engine.evals,改(gǎi)為直接比較(jiào)法進行判斷;

② 創建(jiàn)規則引擎池JsScriptEnginePool,減少規則引擎重複創建;

③ 業務規則增加狀態,隻(zhī)檢索有效的規則進行執(zhí)行。


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


優化後:100並發(fā)用戶時,平均tps為102,請求平均耗(hào)時在1s內。


化整為零



將係統壓力大的點通過分散壓力的方式實現性能提升。數據層麵通常是將冷熱數據分(fèn)離、分庫分表的方式進行分解壓力;服務訪問層麵(miàn)通常是擴(kuò)充應用服務器、調(diào)整負載均衡和路由規則等方式平衡服務請求。

實戰(zhàn)案例:


現象:某項目近兩年的業務發展較快,每天新增訂單大約6W。客戶在進行(háng)訂(dìng)單查詢(xún)時(shí)耗時越來越長,每次查詢耗時達到3S以上。


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


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


參數調優



在應用中會包含(hán)大量的配置(zhì)參數,其中有操作係統參數、運行環境(jìng)參(cān)數、數據庫參數(shù)、開源組件參數(shù)等等。在過往的性能問(wèn)題優化中發現(xiàn),有時隻是對這些參數按照項目特性進行合理配置,就能(néng)達到理想的效果。

實戰案例:


現象:係(xì)統在已經上線(xiàn)運行(háng)超過半年,一直存在操作卡(kǎ)頓的(de)現象,業務高峰期甚至5分鍾就出(chū)現一次。


分析:通過分析係統(tǒng)出現卡頓時的應用狀態,發現rights-intf應用在卡頓時所(suǒ)有的線程都出現響應不及時的情況,並且(qiě)rights-intf應(yīng)用(yòng)也在頻繁觸發FullGC操作。在業務高峰期每5分(fèn)鍾觸發(fā)一次FullGC。每次FullGC後老年代內存使用率從98%左右下降到50%左(zuǒ)右。


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


4


小(xiǎo)結


在項目建設過程中性(xìng)能優化往往作為一種事後補救手段,在處(chù)理時常常麵臨著時間緊、分析定位困難、改造難度大,且容易造成客戶投訴等問題(tí),因此性能問題重點在於日常(cháng)工作的關注,功能(néng)設計時提前考(kǎo)慮,開發過程中提(tí)前規避,測試和運營時提前發(fā)現。




官方微信公眾號

国产亚洲熟妇在线视频雲計算科技股份有(yǒu)限公司 版權所有 2003-2023

蘇ICP備10224443號-6       蘇公網安(ān)備 32011402011374號

国产亚洲熟妇在线视频-亚洲熟妇AV乱码在线观看-亚州国产AV一区二区三区伊在-中文字幕无码人妻少妇免费视频-欧美 日韩 人妻 高清 中文-熟妇人妻中文字幕无码老熟妇-丰满熟女人妻一区二区三-亚洲精品字幕