如何學習Linux性能優化?
如何學習Linux性能優化?
你是否也曾跟我一樣,看了很多書、學了很多 Linux 性能工具,但在面對 Linux 性能問題時,還是束手無策?實際上,性能分析和優化始終是大多數軟件工程師的一個痛點。但是,面對難題,我們真的就無解了嗎?
固然,性能問題的復雜性增加了學習難度,但這並不能成為我們進階路上的“攔路虎”。在我看來,大多數人對性能問題“投降”,原因可能只有兩個。
一個是你沒找到有效的方法學原理,一聽到“系統”、“底層”這些詞就發怵,覺得東西太難自己一定學不會,自然也就無法深入學下去,從而不能建立起性能的全局觀。
再一個就是你看到性能問題的根源太復雜,既不懂怎麽去分析,也不能抽絲剝繭找到瓶頸。
你可能會想,反正程序出了問題,上網查就是了,用別人的方法,囫圇吞棗地多試幾次,有可能就解決了。於是,你懶得深究這些方法為啥有效,更不知道為什麽,很多方法在別人的環境有效,到你這兒就不行了。
所以,相同的錯誤重復在犯,相同的狀況也是重復出現。
其實,性能問題並沒有你想像得那麽難,只要你理解了應用程序和系統的少數幾個基本原理,再進行大量的實戰練習,建立起整體性能的全局觀,大多數性能問題的優化就會水到渠成。
我見過很多工程師,在分析應用程序所使用的第三方組件的性能時,並不熟悉這些組件所用的編程語言,卻依然可以分析出線上問題的根源,並能通過一些方法進行優化,比如修改應用程序對它們的調用邏輯,或者調整組件的配置選項等。
還是那句話,你不需要了解每個組件的所有實現細節,只要能理解它們最基本的工作原理和協作方式,你也可以做到。
性能指標是什麽?
學習性能優化的第一步,一定是了解“性能指標”這個概念。
當看到性能指標時,你會首先想到什麽呢?我相信“高並發”和“響應快”一定是最先出現在你腦海裏的兩個詞,而它們也正對應著性能優化的兩個核心指標——“吞吐”和“延時”。這兩個指標是從應用負載的視角來考察性能,直接影響了產品終端的用戶體驗。跟它們對應的,是從系統資源的視角出發的指標,比如資源使用率、飽和度等。
我們知道,隨著應用負載的增加,系統資源的使用也會升高,甚至達到極限。而性能問題的本質,就是系統資源已經達到瓶頸,但請求的處理卻還不夠快,無法支撐更多的請求。
性能分析,其實就是找出應用或系統的瓶頸,並設法去避免或者緩解它們,從而更高效地利用系統資源處理更多的請求。這包含了一系列的步驟,比如下面這六個步驟。
選擇指標評估應用程序和系統的性能;
為應用程序和系統設置性能目標;
進行性能基準測試;
性能分析定位瓶頸;
優化系統和應用程序;
性能監控和告警。
了解了這些性能相關的基本指標和核心步驟後,該怎麽學呢?接下來,我來說說要學好 Linux 性能優化的幾個重要問題。
學這個專欄需要什麽基礎
首先你要明白,我們這個專欄的核心是性能的分析和優化,而不是最基本的 Linux 操作系統的使用方法。
因而,我希望你最好用過 Ubuntu 或其他 Linux 操作系統,然後要具備一些編程基礎,比如
了解 Linux 常用命令的使用方法;
知道怎麽安裝和管理軟件包;
知道怎麽通過編程語言開發應用程序等。
這樣,在我講性能時,你就更容易理解性能背後的原理,特別是在結合專欄裏的案例實踐後,對性能分析能有更直觀的體會。
這個專欄不會像教科書那樣,詳細教你操作系統、算法原理、網絡協議乃至各種編程語言的全部細節,但一些重要的系統原理還是必不可少的。我還會用實際案例一步步教你,貫穿從應用程序到操作系統的各個組件。
學習的重點是什麽?
想要學習好性能分析和優化,建立整體系統性能的全局觀是最核心的話題。因而,
理解最基本的幾個系統知識原理;
掌握必要的性能工具;
通過實際的場景演練,貫穿不同的組件。
這三點,就是我們學習的重中之重。我會在專欄的每篇文章中,針對不同場景,把這三個方面給你講清楚,你也一定要花時間和心思來消化它們。
其實說到性能工具,就不得不提性能領域的大師布倫丹·格雷格(Brendan Gregg)。他不僅是動態追蹤工具 DTrace 的作者,還開發了許許多多的性能工具。我相信你一定見過他所描繪的 Linux 性能工具圖譜:
這個圖是 Linux 性能分析最重要的參考資料之一,它告訴你,在 Linux 不同子系統出現性能問題後,應該用什麽樣的工具來觀測和分析。
比如,當遇到 I/O 性能問題時,可以參考圖片最下方的 I/O 子系統,使用 iostat、iotop、blktrace 等工具分析磁盤 I/O 的瓶頸。你可以把這個圖保存下來,在需要的時候參考查詢。
另外,我還要特別強調一點,就是性能工具的選用。有句話是這麽說的,一個正確的選擇勝過千百次的努力。雖然誇張了些,但是選用合適的性能工具,確實可以大大簡化整個性能優化過程。在什麽場景選用什麽樣的工具、以及怎麽學會選擇合適工具,都是我想教給你的東西。
但是切記,千萬不要把性能工具當成學習的全部。工具只是解決問題的手段,關鍵在於你的用法。只有真正理解了它們背後的原理,並且結合具體場景,融會貫通系統的不同組件,你才能真正掌握它們。
最後,為了讓你對性能有個全面的認識,我畫了一張思維導圖,裏面涵蓋了大部分性能分析和優化都會包含的知識,專欄中也基本都會講到。你可以保存或者打印下來,每學會一部分就標記出來,記錄並把握自己的學習進度。
怎麽學更高效?
前面我給你講了 Linux 性能優化的學習重點,接下來我再跟你分享一下,我的幾個學習技巧。掌握這些技巧,可以讓你學得更輕松。
技巧一:雖然系統的原理很重要,但在剛開始一定不要試圖抓住所有的實現細節。
深陷到系統實現的內部,可能會讓你丟掉學習的重點,而且繁雜的實現邏輯,很可能會打退你學習的積極性。所以,我個人觀點是一定要適度。
你可以先學會我給你講的這些系統工作原理,但不要去深究 Linux 內核是如何做到的,而是要把你的重點放到如何觀察和運用這些原理上,比如:
有哪些指標可以衡量性能?
使用什麽樣的性能工具來觀察指標?
導致這些指標變化的因素等。
技巧二:邊學邊實踐,通過大量的案例演習掌握 Linux 性能的分析和優化。
只有通過在機器上練習,把我講的知識和案例自己過一遍,這些東西才能轉化成你的。我精心設計這些案例,正是為了讓你有更好的學習理解和操作體驗。
所以我強烈推薦你去實際運行、分析這些案例,或者用學到的知識去分析你自己的系統,這樣你會有更直觀的感受,獲得更好的學習效果。
技巧三:勤思考,多反思,善總結,多問為什麽。
想真正學懂一門知識,最好的方法就是問問題。當你能提出好的問題時,就說明你已經深入了解了它。
你可以隨時在留言區給我留言,寫下自己的疑問、思考和總結,和我還有其他的學習者一起討論切磋。你也可以寫下自己經歷過的性能問題,記錄你的分析步驟和優化思路,我們一起互動探討。學習之前,你的準備作為一個包含大量案例實踐的課程,我會在每篇文章中,使用一到兩臺 Ubuntu 18.04 虛擬機,作為案例運行和分析的環境。如果你只是單純聽音頻的講解,卻從不動手實踐,學習的效果一定會大打折扣。
所以,你是不是可以準備好一臺 Linux 機器,用於課程案例的實踐呢?任意的虛擬機或物理機都可以,並不局限於 Ubuntu 系統。
如何學習Linux性能優化?