1. 程式人生 > >如何學習Linux效能優化?

如何學習Linux效能優化?

  如何學習Linux效能優化?

  你是否也曾跟我一樣,看了很多書、學了很多 Linux 效能工具,但在面對 Linux 效能問題時,還是束手無策?實際上,效能分析和優化始終是大多數軟體工程師的一個痛點。但是,面對難題,我們真的就無解了嗎?

  固然,效能問題的複雜性增加了學習難度,但這並不能成為我們進階路上的“攔路虎”。在我看來,大多數人對效能問題“投降”,原因可能只有兩個。

  一個是你沒找到有效的方法學原理,一聽到“系統”、“底層”這些詞就發怵,覺得東西太難自己一定學不會,自然也就無法深入學下去,從而不能建立起效能的全域性觀。

  再一個就是你看到效能問題的根源太複雜,既不懂怎麼去分析,也不能抽絲剝繭找到瓶頸。

  你可能會想,反正程式出了問題,上網查就是了,用別人的方法,囫圇吞棗地多試幾次,有可能就解決了。於是,你懶得深究這些方法為啥有效,更不知道為什麼,很多方法在別人的環境有效,到你這兒就不行了。

  所以,相同的錯誤重複在犯,相同的狀況也是重複出現。

  其實,效能問題並沒有你想像得那麼難,只要你理解了應用程式和系統的少數幾個基本原理,再進行大量的實戰練習,建立起整體效能的全域性觀,大多數效能問題的優化就會水到渠成。

  我見過很多工程師,在分析應用程式所使用的第三方元件的效能時,並不熟悉這些元件所用的程式語言,卻依然可以分析出線上問題的根源,並能通過一些方法進行優化,比如修改應用程式對它們的呼叫邏輯,或者調整元件的配置選項等。

  還是那句話,你不需要了解每個元件的所有實現細節,只要能理解它們最基本的工作原理和協作方式,你也可以做到。

  效能指標是什麼?

  學習效能優化的第一步,一定是瞭解“效能指標”這個概念。

  當看到效能指標時,你會首先想到什麼呢?我相信“高併發”和“響應快”一定是最先出現在你腦海裡的兩個詞,而它們也正對應著效能優化的兩個核心指標——“吞吐”和“延時”。這兩個指標是從應用負載的視角來考察效能,直接影響了產品終端的使用者體驗。跟它們對應的,是從系統資源的視角出發的指標,比如資源使用率、飽和度等。

  我們知道,隨著應用負載的增加,系統資源的使用也會升高,甚至達到極限。而效能問題的本質,就是系統資源已經達到瓶頸,但請求的處理卻還不夠快,無法支撐更多的請求。

  效能分析,其實就是找出應用或系統的瓶頸,並設法去避免或者緩解它們,從而更高效地利用系統資源處理更多的請求。這包含了一系列的步驟,比如下面這六個步驟。

  選擇指標評估應用程式和系統的效能;

  為應用程式和系統設定效能目標;

  進行效能基準測試;

  效能分析定位瓶頸;

  優化系統和應用程式;

  效能監控和告警。

  瞭解了這些效能相關的基本指標和核心步驟後,該怎麼學呢?接下來,我來說說要學好 Linux 效能優化的幾個重要問題。

  學這個專欄需要什麼基礎

  首先你要明白,我們這個專欄的核心是效能的分析和優化,而不是最基本的 Linux 作業系統的使用方法。

  因而,我希望你最好用過 Ubuntu 或其他 Linux 作業系統,然後要具備一些程式設計基礎,比如

  瞭解 Linux 常用命令的使用方法;

  知道怎麼安裝和管理軟體包;

  知道怎麼通過程式語言開發應用程式等。

  這樣,在我講效能時,你就更容易理解效能背後的原理,特別是在結合專欄裡的案例實踐後,對效能分析能有更直觀的體會。

  這個專欄不會像教科書那樣,詳細教你作業系統、演算法原理、網路協議乃至各種程式語言的全部細節,但一些重要的系統原理還是必不可少的。我還會用實際案例一步步教你,貫穿從應用程式到作業系統的各個元件。

  學習的重點是什麼?

  想要學習好效能分析和優化,建立整體系統效能的全域性觀是最核心的話題。因而,

  理解最基本的幾個系統知識原理;

  掌握必要的效能工具;

  通過實際的場景演練,貫穿不同的元件。

  這三點,就是我們學習的重中之重。我會在專欄的每篇文章中,針對不同場景,把這三個方面給你講清楚,你也一定要花時間和心思來消化它們。

  其實說到效能工具,就不得不提效能領域的大師布倫丹·格雷格(Brendan Gregg)。他不僅是動態追蹤工具 DTrace 的作者,還開發了許許多多的效能工具。我相信你一定見過他所描繪的 Linux 效能工具圖譜:

 Linux 效能工具圖譜

  這個圖是 Linux 效能分析最重要的參考資料之一,它告訴你,在 Linux 不同子系統出現效能問題後,應該用什麼樣的工具來觀測和分析。

  比如,當遇到 I/O 效能問題時,可以參考圖片最下方的 I/O 子系統,使用 iostat、iotop、blktrace 等工具分析磁碟 I/O 的瓶頸。你可以把這個圖儲存下來,在需要的時候參考查詢。

  另外,我還要特別強調一點,就是效能工具的選用。有句話是這麼說的,一個正確的選擇勝過千百次的努力。雖然誇張了些,但是選用合適的效能工具,確實可以大大簡化整個效能優化過程。在什麼場景選用什麼樣的工具、以及怎麼學會選擇合適工具,都是我想教給你的東西。

  但是切記,千萬不要把效能工具當成學習的全部。工具只是解決問題的手段,關鍵在於你的用法。只有真正理解了它們背後的原理,並且結合具體場景,融會貫通系統的不同元件,你才能真正掌握它們。

  最後,為了讓你對效能有個全面的認識,我畫了一張思維導圖,裡面涵蓋了大部分效能分析和優化都會包含的知識,專欄中也基本都會講到。你可以儲存或者列印下來,每學會一部分就標記出來,記錄並把握自己的學習進度。

如何學習Linux效能優化?

  怎麼學更高效?

  前面我給你講了 Linux 效能優化的學習重點,接下來我再跟你分享一下,我的幾個學習技巧。掌握這些技巧,可以讓你學得更輕鬆。

  技巧一:雖然系統的原理很重要,但在剛開始一定不要試圖抓住所有的實現細節。

  深陷到系統實現的內部,可能會讓你丟掉學習的重點,而且繁雜的實現邏輯,很可能會打退你學習的積極性。所以,我個人觀點是一定要適度。

  你可以先學會我給你講的這些系統工作原理,但不要去深究 Linux 核心是如何做到的,而是要把你的重點放到如何觀察和運用這些原理上,比如:

  有哪些指標可以衡量效能?

  使用什麼樣的效能工具來觀察指標?

  導致這些指標變化的因素等。

  技巧二:邊學邊實踐,通過大量的案例演習掌握 Linux 效能的分析和優化。

  只有通過在機器上練習,把我講的知識和案例自己過一遍,這些東西才能轉化成你的。我精心設計這些案例,正是為了讓你有更好的學習理解和操作體驗。

  所以我強烈推薦你去實際執行、分析這些案例,或者用學到的知識去分析你自己的系統,這樣你會有更直觀的感受,獲得更好的學習效果。

  技巧三:勤思考,多反思,善總結,多問為什麼。

  想真正學懂一門知識,最好的方法就是問問題。當你能提出好的問題時,就說明你已經深入瞭解了它。

  你可以隨時在留言區給我留言,寫下自己的疑問、思考和總結,和我還有其他的學習者一起討論切磋。你也可以寫下自己經歷過的效能問題,記錄你的分析步驟和優化思路,我們一起互動探討。學習之前,你的準備作為一個包含大量案例實踐的課程,我會在每篇文章中,使用一到兩臺 Ubuntu 18.04 虛擬機器,作為案例執行和分析的環境。如果你只是單純聽音訊的講解,卻從不動手實踐,學習的效果一定會大打折扣。

  所以,你是不是可以準備好一臺 Linux 機器,用於課程案例的實踐呢?任意的虛擬機器或物理機都可以,並不侷限於 Ubuntu 系統。