程式員必須掌握的性能調優 X Y Z

来源:https://www.cnblogs.com/itlaobingge/archive/2019/12/27/12105722.html
-Advertisement-
Play Games

性能調優,是從開發崗躍遷至架構崗的攔路虎。升級思維的過程是痛苦的,尤其是在背負壓力下的被動升級,跳出原先的舒適區,進入更大的舒適區,這樣才能站上新平面。記得當時老兵哥我還有不少負面情緒,回顧過往才懂得要感謝當時的領導給我這份壓力,逼迫我高強度學習並突破了舊的思維,機會和挑戰是並存的。 ...


熱評博文:如何設計出優美的Web API?》,現閱讀量超 2500,小伙伴們不要錯過哦!

2003 ~ 2008 年,這五年老兵哥我在通信行業做實習生和開發崗,主要用 C / C++ / MFC 開發嵌入式 / 伺服器 / 桌面等應用程式,期間做過大量代碼重構優化,但很少涉及性能調優,要麼我負責的局部無需考慮併發訪問和海量數據,要麼網管平臺僅供客戶內部人員使用,不存在併發訪問和海量數據。2008 年底,老兵哥我跳槽到了移動互聯網做技術經理,隨後五年主要用 Java / C++ 開發 Web / 伺服器等互聯網應用。

當時,架構師這個崗位在業界還是很罕見的,不懂預估併發用戶、業務數據等規模,自然就預見不到後續併發訪問和海量數據會帶來巨大的性能挑戰。我們趕著工期把功能需求實現、業務流程跑通,然後就上線了,但移動互聯網爆發的那些年業務增長非常快,系統上線不久就遇到性能問題了,其現象就是原來耗時很短的操作現在動不動就超時,或者界面刷不出來數據等等,巨大的壓力跟著客戶投訴一起擺到了我面前。

性能調優任務不像普通開發任務,它需要背負業務、時間和難度等多種壓力。羅馬不是一天建成的,導致性能問題的原因錯綜複雜,當時老兵哥我也不知道從何處下手,找不到解決問題的切入點。好性能不是調優出來的,更多是設計出來的。只有經歷過性能調優,才能體會這句話的真諦。性能調優,其實就是對承載業務的現網系統做重構優化,就像是邊開車邊換輪胎,它所需要的技能跟代碼重構完全不在一個層級上。

現在老兵哥我知道,性能是系統性問題,性能調優離不開架構視角。不識廬山真面目,只緣身在此山中。當你陷在具體的、局部的問題當中,你是無法找到解決問題的思路的。你必須從實現細節跳脫出來,從更加巨集觀全局的視角來梳理業務流程,就像文末鏈接的系列文章《圖解 Spring Cloud:HTTP 請求的處理流程與機制》的剖析過程類似,然後以業務流程為線索分析每個環節存在的性能瓶頸原因,這樣你就不再困惑了。

當每個環節潛在問題梳理出來之後,根據資源、時間等外部限制,按照帕累托二八原則,你可以決定優先解決哪些問題,從而有條不紊地化解性能壓力了。隨著在性能調優上的經驗不斷豐富,你就越來越有信心掌控更大規模的系統了。更值得高興的是,當你費老牛勁把這些自己挖的巨坑填上後,你就記得下次不要再給自己挖坑了,也就懂得怎樣設計一個高性能的互聯網系統了,這不就是從開發躍遷至架構的契機嗎?

性能調優,是從開發崗躍遷至架構崗的攔路虎。升級思維的過程是痛苦的,尤其是在背負壓力下的被動升級,跳出原先的舒適區,進入更大的舒適區,這樣才能站上新平面。記得當時老兵哥我還有不少負面情緒,回顧過往才懂得要感謝當時的領導給我這份壓力,逼迫我高強度學習並突破了舊的思維,機會和挑戰是並存的。性能優化是一個不斷迭代、持續進行的過程,涉及軟體開發生命周期的所有階段,對於某款採用 Hibernate 作為持久層框架的 Java EE 典型應用程式,性能優化會涉及以下幾個方面:

性能調優

  • 業務規則調優,包括業務流程、交互設計等
  • 應用容器調優,包括啟動參數、連接數和線程數等
  • Spring 調優,包括事務管理、二級緩存等
  • Hibernate 調優,包括批量操作、抓取策略和緩存等
  • 資料庫調優,包括索引、SQL 語句和配置等
  • JVM 調優,包括記憶體、垃圾回收 GC等
  • 底層系統調優,包括操作系統、硬體等

如果對上述性能優化方向做些分類歸併,我們可以採用下列分類維度來看:

  • X 維度,即業務維度,技術始終是服務業務的,任何技術問題的原點就是業務需求。在啟動技術層面的性能優化之前,我們有必要先審視一下業務流程是否合理,交互設計上有沒有可以優化的空間等。
  • Y 維度,待業務維度優化完畢,接下來就是審視技術在實現當前業務流程或交互設計的全鏈路上有沒有可優化的地方,即 HTTP 請求處理全流程,從瀏覽器到應用容器,再到 Spring、Hibernate、資料庫等。

維度Y

  • Z 維度,除了沿著 HTTP 請求的橫向鏈路,我們還要審視支持應用系統的縱向技術棧,從上到下包括 JVM、操作系統和硬體等,這是整套應用系統運行的環境,許多性能問題都跟運行環境存在關係。

維度Z

XYZ 維度分類是從不同層次梳理性能優化方向,有助於幫我們搭建起了性能優化的框架體系,這三個維度跟應用架構也是一一對應的。除了按照層次、縱橫分類之外,我們還可以按性能優化對象的粒度劃分,將優化範圍分為函數、模塊、框架、系統、鏈路和環境等等,從開發崗到架構師,我們就是要練就從小粒度到大粒度優化的能力,跳脫出原來的思維框架,站到更寬廣的視角來選擇優化路線。如果你沒有精心設計優化方案就開始上述調優,這將會是非常耗時的,而且很可能收效甚微。一個好的優化方案必然要為各種調優任務劃分優先順序,任何時候都不可能有足夠的時間和資金做全面優化,優先順序的判斷依據是投入產出比。在確定了優先順序之後,接下來我們就按照帕累托 Pareto 定律(即 80/20 法則)來選取調優任務,集中百分之八十的力量去改善應用程式中最影響性能的百分之二十的問題。

今天先分享到這裡,後續老兵哥我把這些調優經驗和架構視角梳理出來供大家參考。堅持技術寫作不容易,如果你覺得有價值,麻煩動動手指點下文 「 推薦 」按鈕,讓更多小伙伴可以看到,我也會更加有動力堅持分享。另外,老兵哥我後續還會分享職業規劃、應聘面試、技能提升、影響力打造等經驗,歡迎 關註 本專欄或歪信公主號 「 IT老兵哥 」

微信公眾號「 IT老兵哥 」

關註「 IT老兵哥 」,賦能程式人生

 

  • 軟技能-熱點文章:
  1. “花式”裁員套路深,你知道嗎?
  2. 遭遇裁員,如何渡過心理危機?
  3. 如何在寒冬中找到好工作?
  4. 2C 還是 2B,跟找工作有什麼關係?
  5. 大公司 vs 小公司,你會選哪個?
  6. 記住這一點,不怕找不到好工作!
  7. 跳槽,跳還是不跳,該怎麼跳?
  8. 程式員“求包養”攻略揭秘
  9. 很努力了,為什麼我還在原地踏步?

 

  • 硬技能-熱點文章:
  1. 圖解 Spring:HTTP 請求的處理流程與機制【1】
  2. 圖解 Spring:HTTP 請求的處理流程與機制【2】
  3. 圖解 Spring:HTTP 請求的處理流程與機制【3】
  4. 圖解 Spring:HTTP 請求的處理流程與機制【4】
  5. 圖解 Spring:HTTP 請求的處理流程與機制【5】
  6. 如何正確使用 Spring Cloud?【上】
  7. 如何正確使用 Spring Cloud?【中】
  8. 如何正確使用 Spring Cloud?【下】
  9. Spring 核心技術與產品理念剖析【上】
  10. Spring 核心技術與產品理念剖析【下】

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 關於Hook的定義官方文檔是這麼說的: Hook 是 React 16.8 的新增特性。它可以讓你在不編寫 class 的情況下使用 state 以及其他的 React 特性。 簡單來說,就是在使用函數式組件時能用上state,還有一些生命周期函數等其他的特性。 如果想瞭解Hook怎麼用, " ...
  • HTTP 400 錯誤 復現錯誤 ajax請求後臺數據時有時會報 HTTP 400 錯誤 - 請求無效 (Bad request);出現這個請求無效報錯說明請求沒有進入到後臺服務里;原因:1)前端提交數據的欄位名稱或者是欄位類型和後臺的實體類不一致,導致無法封裝; 2)前端提交的到後臺的數據應該是j ...
  • HTML DOM 允許 JavaScript 更改 HTML 元素的樣式。 改變 HTML 樣式 如需更改 HTML 元素的樣式,請使用此語法: document.getElementById(id).style.property = new style 下麵的例子更改了 <p> 元素的樣式: 實例 ...
  • 轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。 原文出處:https://blog.bitsrc.io/do-your-buttons-lead-or-mislead-your-users-d5d83531238b 按鈕是UI/UX最關鍵的組件之一,在不同 ...
  • ​API網關我的分析中會用到以下三種場景:1、Open API,2、微服務網關,3、API服務管理平臺 ...
  • 1.代碼生成器: [正反雙向](單表、主表、明細表、樹形表,快速開發利器)freemaker模版技術 ,0個代碼不用寫,生成完整的一個模塊,帶頁面、建表sql腳本、處理類、service等完整模塊2.多數據源:(支持同時連接無數個資料庫,可以不同的模塊連接不同數的據庫)支持N個數據源3.阿裡資料庫連 ...
  • 以Java為例: 餓漢: 懶漢: 先來看單例模式原理及要求,保證這個類在記憶體中只有一個對象,那麼就不能隨便給別人new,所以必須把構造函數改為private,然後整一個公共靜態方法供外部統一獲取實例。 再來看餓漢以及懶漢定義(原理)以及區別: 餓漢:一開始就吧吃的找好(對象new出來),隨時可以吃 ...
  • 馬蜂窩技術原創內容,更多乾貨請訂閱公眾號:mfwtech 廣告是互聯網變現的重要手段之一。 以馬蜂窩旅游 App 為例,當用戶打開我們的應用時,有可能會在首屏或是信息流、商品列表中看到推送的廣告。如果剛好對廣告內容感興趣,用戶就可能會點擊廣告瞭解更多信息,進而完成這條廣告希望完成的後續操作,如下載廣 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...