你好,我是倪朋飛,微軟 Azure 的資深工程師,同時也是 項目維護者,主要負責開源容器編排系統 在 Azure 的落地實踐。
一直以來,我都在云計算領域工作。對于服務器性能的關注,可以追溯到我剛參加工作那會兒。為什么那么早就開始探索性能問題呢?其實是源于一次我永遠都忘不了的“事故”。
那會兒我在盛大云工作,忙活了大半夜把產品發布上線后,剛剛躺下打算休息,卻突然收到大量的告警。匆忙爬起來登錄到服務器之后,我發現有一些系統進程的 CPU 使用率高達 100%。
當時我完全是兩眼一抹黑,可以說是只能看到癥狀,卻完全不知道該從哪兒下手去排查和解決它。直到最后,我也沒能想到好辦法,這次發布也成了我心中之痛。
從那之后,我開始到處查看各種相關書籍,從操作系統原理、到 Linux 內核,再到硬件驅動程序等等。可是,學了那么多知識之后,我還是不能很快解決類似的性能問題。
于是,我又通過網絡搜索,或者請教公司的技術大拿,學習了大量性能優化的思路和方法,這期間嘗試了大量的 Linux 性能工具。在不斷的實踐和總結后,我終于知道,怎么把觀察到的性能問題跟系統原理關聯起來,特別是把系統從應用程序、庫函數、系統調用、再到內核和硬件等不同的層級貫穿起來。
這段學習可以算得上是我的“黑暗”經歷了。我想,不僅是我一個人,很多人應該都有過這樣的挫折。比如說:
流量高峰期,服務器 CPU 使用率過高報警,你登錄 Linux 上去 top 完之后,卻不知道怎么進一步定位,到底是系統 CPU 資源太少,還是程序并發部分寫的有問題?
系統并沒有跑什么吃內存的程序,但是敲完 free 命令之后,卻發現系統已經沒有什么內存了,那到底是哪里占用了內存?為什么?
一大早就收到 告警,你發現某臺存放監控數據的數據庫主機的 較高,這個時候該怎么辦?
這些問題或者場景,你肯定或多或少都遇到過。
實際上,性能優化一直都是大多數軟件工程師頭上的“緊箍咒”,甚至許多工作多年的資深工程師,也無法準確地分析出線上的很多性能問題。
性能問題為什么這么難呢?我覺得主要是因為性能優化是個系統工程,總是牽一發而動全身。它涉及了從程序設計、算法分析、編程語言,再到系統、存儲、網絡等各種底層基礎設施的方方面面。每一個組件都有可能出問題,而且很有可能多個組件同時出問題。
毫無疑問,性能優化是軟件系統中最有挑戰的工作之一,但是換個角度看,它也是最考驗體現你綜合能力的工作之一。如果說你能把性能優化的各個關鍵點吃透,那我可以肯定地說,你已經是一個非常優秀的軟件工程師了。
那怎樣才能掌握這個技能呢?你可以像我前面說的那樣,花大量的時間和精力去鉆研,從內功到實戰一一苦練。當然,那樣可行,但也會走很多彎路,而且可能你啃了很多大塊頭的書,終于拿下了最難的底層體系,卻因為缺乏實戰經驗,在實際開發工作中仍然沒有頭緒。
其實,對于我們大多數人來說,最好的學習方式一定是帶著問題學習,而不是先去啃那幾本厚厚的原理書籍,這樣很容易把自己的信心壓垮。
我認為,學習要會抓重點。其實只要你了解少數幾個系統組件的基本原理和協作方式,掌握基本的性能指標和工具六點定位原理該怎么理解,學會實際工作中性能優化的常用技巧,你就已經可以準確分析和優化大多數的性能問題了。在這個認知的基礎上,再反過來去閱讀那些經典的操作系統或者其它圖書,你才能事半功倍。
所以,在這個專欄里,我會以案例驅動的思路,給你講解 Linux 性能的基本指標、工具,以及相應的觀測、分析和調優方法。
具體來看,我會分為 5 個模塊。前 4 個模塊我會從資源使用的視角出發,帶你分析各種 Linux 資源可能會碰到的性能問題,包括 CPU 性能、磁盤 I/O 性能、內存性能以及網絡性能。每個模塊還由淺入深劃分為四個不同的篇章。
基礎篇,介紹 Linux 必備的基本原理以及對應的性能指標和性能工具。比如怎么理解平均負載,怎么理解上下文切換,Linux 內存的工作原理等等。
案例篇,這里我會通過模擬案例,幫你分析高手在遇到資源瓶頸時,是如何觀測、定位、分析并優化這些性能問題的。
套路篇,在理解了基礎,親身體驗了模擬案例之后,我會幫你梳理出排查問題的整體思路,也就是檢查性能問題的一般步驟,這樣,以后你遇到問題,就可以按照這樣的路子來。
答疑篇,我相信在學習完每一個模塊之后,你都會有很多的問題,在答疑篇里,我會拿出提問頻次較高的問題給你系統解答。
第 5 個綜合實戰模塊,我將為你還原真實的工作場景,手把手帶你在“高級戰場”中演練,這樣你能把前面學到的所有知識融會貫通,并且看完專欄,馬上就能用在工作中。
整個專欄,我會把內容盡量寫得通俗易懂,并幫你劃出重點、理出知識脈絡,再通過案例分析和套路總結六點定位原理該怎么理解,讓你學得更透、用得更熟。
明天就要正式開課了,開始之前,我要把何炅說過的那句我特別認同的雞湯送給你,“想要得到你就要學會付出,要付出還要堅持;如果你真的覺得很難,那你就放棄,如果你放棄了就不要抱怨。人生就是這樣,世界是平衡的,每個人都是通過自己的努力,去決定自己生活的樣子。”
不為別的,就希望你能和我堅持下去,一直到最后一篇文章。這中間,有想不明白的地方,你要先自己多琢磨幾次;還是不懂的,你可以在留言區找我問;有需要總結提煉的知識點,你也要自己多下筆。你還可以寫下自己的經歷,記錄你的分析步驟和思路,我都會及時回復你。
最后,你可以在留言區給自己立個 Flag,哪怕只是在留言區打卡你的學習天數,我相信都是會有效果的。3 個月后,我們一起再來驗收。
總之,讓我們一起攜手,為你交付“Linux 性能優化”這個大技能!
Linux 知識地圖 2.0 典藏版,現貨發售 2000 份,把 5 米長的圖譜裝進背包,1 分鐘定位 80% 的高頻問題。