你是否也曾跟我一樣骏庸,看了很多書(shū)毛甲、學(xué)了很多 Linux 性能工具,但在面對(duì) Linux 性能問(wèn)題時(shí)具被,還是束手無(wú)策玻募?實(shí)際上,性能分析和優(yōu)化始終是大多數(shù)軟件工程師的一個(gè)痛點(diǎn)一姿。但是七咧,面對(duì)難題,我們真的就無(wú)解了嗎叮叹?
固然艾栋,性能問(wèn)題的復(fù)雜性增加了學(xué)習(xí)難度,但這并不能成為我們進(jìn)階路上的“攔路虎”蛉顽。在我看來(lái)蝗砾,大多數(shù)人對(duì)性能問(wèn)題“投降”,原因可能只有兩個(gè)。
一個(gè)是你沒(méi)找到有效的方法學(xué)原理遥诉,一聽(tīng)到“系統(tǒng)”拇泣、“底層”這些詞就發(fā)怵,覺(jué)得東西太難矮锈,自己一定學(xué)不會(huì),自然也就無(wú)法深入學(xué)下去睁蕾,從而不能建立起性能的全局觀苞笨。
再一個(gè)就是,你看到性能問(wèn)題的根源太復(fù)雜子眶,既不懂怎么去分析瀑凝,也不能抽絲剝繭找到瓶頸。
你可能會(huì)想臭杰,反正程序出了問(wèn)題粤咪,上網(wǎng)查就是了,用別人的方法渴杆,囫圇吞棗地多試幾次寥枝,有可能就解決了。于是磁奖,你懶得深究這些方法為啥有效囊拜,更不知道為什么,很多方法在別人的環(huán)境有效比搭,到你這兒就不行了冠跷。
所以,相同的錯(cuò)誤重復(fù)在犯身诺,相同的狀況也是重復(fù)出現(xiàn)蜜托。
其實(shí),性能問(wèn)題并沒(méi)有你想像得那么難霉赡,只要你理解了應(yīng)用程序和系統(tǒng)的少數(shù)幾個(gè)基本原理橄务,再進(jìn)行大量的實(shí)戰(zhàn)練習(xí),建立起整體性能的全局觀同廉,大多數(shù)性能問(wèn)題的優(yōu)化就會(huì)水到渠成仪糖。
我見(jiàn)過(guò)很多工程師,在分析應(yīng)用程序所使用的第三方組件的性能時(shí)迫肖,并不熟悉這些組件所用的編程語(yǔ)言锅劝,卻依然可以分析出線上問(wèn)題的根源,并能通過(guò)一些方法進(jìn)行優(yōu)化蟆湖,比如修改應(yīng)用程序?qū)λ鼈兊恼{(diào)用邏輯故爵,或者調(diào)整組件的配置選項(xiàng)等。
還是那句話,你不需要了解每個(gè)組件的所有實(shí)現(xiàn)細(xì)節(jié)诬垂,只要能理解它們最基本的工作原理和協(xié)作方式劲室,你也可以做到。
性能指標(biāo)是什么结窘?
學(xué)習(xí)性能優(yōu)化的第一步很洋,一定是了解“性能指標(biāo)”這個(gè)概念。
當(dāng)看到性能指標(biāo)時(shí)隧枫,你會(huì)首先想到什么呢喉磁?我相信“高并發(fā)”和“響應(yīng)快”一定是最先出現(xiàn)在你腦海里的兩個(gè)詞,而它們也正對(duì)應(yīng)著性能優(yōu)化的兩個(gè)核心指標(biāo)——“吞吐”和“延時(shí)”官脓。這兩個(gè)指標(biāo)是從應(yīng)用負(fù)載的視角來(lái)考察性能协怒,直接影響了產(chǎn)品終端的用戶體驗(yàn)。跟它們對(duì)應(yīng)的卑笨,是從系統(tǒng)資源的視角出發(fā)的指標(biāo)孕暇,比如資源使用率、飽和度等赤兴。
我們知道妖滔,隨著應(yīng)用負(fù)載的增加,系統(tǒng)資源的使用也會(huì)升高搀缠,甚至達(dá)到極限铛楣。而性能問(wèn)題的本質(zhì),就是系統(tǒng)資源已經(jīng)達(dá)到瓶頸艺普,但請(qǐng)求的處理卻還不夠快簸州,無(wú)法支撐更多的請(qǐng)求。
性能分析歧譬,其實(shí)就是找出應(yīng)用或系統(tǒng)的瓶頸岸浑,并設(shè)法去避免或者緩解它們,從而更高效地利用系統(tǒng)資源處理更多的請(qǐng)求瑰步。這包含了一系列的步驟矢洲,比如下面這六個(gè)步驟。
了解了這些性能相關(guān)的基本指標(biāo)和核心步驟后缩焦,該怎么學(xué)呢读虏?接下來(lái),我來(lái)說(shuō)說(shuō)要學(xué)好 Linux 性能優(yōu)化的幾個(gè)重要問(wèn)題袁滥。
學(xué)這個(gè)專欄需要什么基礎(chǔ)
首先你要明白盖桥,我們這個(gè)專欄的核心是性能的分析和優(yōu)化,而不是最基本的 Linux 操作系統(tǒng)的使用方法题翻。
因而揩徊,我希望你最好用過(guò) Ubuntu 或其他 Linux 操作系統(tǒng),然后要具備一些編程基礎(chǔ),比如:
這樣塑荒,在我講性能時(shí)熄赡,你就更容易理解性能背后的原理,特別是在結(jié)合專欄里的案例實(shí)踐后齿税,對(duì)性能分析能有更直觀的體會(huì)彼硫。
這個(gè)專欄不會(huì)像教科書(shū)那樣,詳細(xì)教你操作系統(tǒng)凌箕、算法原理乌助、網(wǎng)絡(luò)協(xié)議乃至各種編程語(yǔ)言的全部細(xì)節(jié),但一些重要的系統(tǒng)原理還是必不可少的陌知。我還會(huì)用實(shí)際案例一步步教你,貫穿從應(yīng)用程序到操作系統(tǒng)的各個(gè)組件掖肋。
學(xué)習(xí)的重點(diǎn)是什么仆葡?
想要學(xué)習(xí)好性能分析和優(yōu)化,建立整體系統(tǒng)性能的全局觀是最核心的話題志笼。因而沿盅,
這三點(diǎn),就是我們學(xué)習(xí)的重中之重纫溃。我會(huì)在專欄的每篇文章中腰涧,針對(duì)不同場(chǎng)景,把這三個(gè)方面給你講清楚紊浩,你也一定要花時(shí)間和心思來(lái)消化它們窖铡。
其實(shí)說(shuō)到性能工具,就不得不提性能領(lǐng)域的大師布倫丹·格雷格(Brendan Gregg)坊谁。他不僅是動(dòng)態(tài)追蹤工具 DTrace 的作者费彼,還開(kāi)發(fā)了許許多多的性能工具。我相信你一定見(jiàn)過(guò)他所描繪的 Linux 性能工具圖譜:
(圖片來(lái)自)
這個(gè)圖是 Linux 性能分析最重要的參考資料之一口芍,它告訴你箍铲,在 Linux 不同子系統(tǒng)出現(xiàn)性能問(wèn)題后,應(yīng)該用什么樣的工具來(lái)觀測(cè)和分析鬓椭。
比如,當(dāng)遇到 I/O 性能問(wèn)題時(shí),可以參考圖片最下方的 I/O 子系統(tǒng)厦滤,使用 iostat箱舞、iotop、blktrace 等工具分析磁盤 I/O 的瓶頸氧映。你可以把這個(gè)圖保存下來(lái)春畔,在需要的時(shí)候參考查詢。
另外,我還要特別強(qiáng)調(diào)一點(diǎn)律姨,就是性能工具的選用振峻。有句話是這么說(shuō)的,一個(gè)正確的選擇勝過(guò)千百次的努力择份。雖然夸張了些扣孟,但是選用合適的性能工具,確實(shí)可以大大簡(jiǎn)化整個(gè)性能優(yōu)化過(guò)程荣赶。在什么場(chǎng)景選用什么樣的工具凤价、以及怎么學(xué)會(huì)選擇合適工具,都是我想教給你的東西拔创。
但是切記利诺,千萬(wàn)不要把性能工具當(dāng)成學(xué)習(xí)的全部。工具只是解決問(wèn)題的手段剩燥,關(guān)鍵在于你的用法慢逾。只有真正理解了它們背后的原理,并且結(jié)合具體場(chǎng)景灭红,融會(huì)貫通系統(tǒng)的不同組件侣滩,你才能真正掌握它們。
最后变擒,為了讓你對(duì)性能有個(gè)全面的認(rèn)識(shí)君珠,我畫了一張思維導(dǎo)圖,里面涵蓋了大部分性能分析和優(yōu)化都會(huì)包含的知識(shí)娇斑,專欄中也基本都會(huì)講到策添。你可以保存或者打印下來(lái),每學(xué)會(huì)一部分就標(biāo)記出來(lái)悠菜,記錄并把握自己的學(xué)習(xí)進(jìn)度舰攒。
怎么學(xué)更高效?
前面我給你講了 Linux 性能優(yōu)化的學(xué)習(xí)重點(diǎn)悔醋,接下來(lái)我再跟你分享一下摩窃,我的幾個(gè)學(xué)習(xí)技巧。掌握這些技巧芬骄,可以讓你學(xué)得更輕松猾愿。
技巧一:雖然系統(tǒng)的原理很重要,但在剛開(kāi)始一定不要試圖抓住所有的實(shí)現(xiàn)細(xì)節(jié)账阻。
深陷到系統(tǒng)實(shí)現(xiàn)的內(nèi)部蒂秘,可能會(huì)讓你丟掉學(xué)習(xí)的重點(diǎn),而且繁雜的實(shí)現(xiàn)邏輯淘太,很可能會(huì)打退你學(xué)習(xí)的積極性姻僧。所以规丽,我個(gè)人觀點(diǎn)是一定要適度。
你可以先學(xué)會(huì)我給你講的這些系統(tǒng)工作原理撇贺,但不要去深究 Linux 內(nèi)核是如何做到的赌莺,而是要把你的重點(diǎn)放到如何觀察和運(yùn)用這些原理上,比如:
技巧二:邊學(xué)邊實(shí)踐松嘶,通過(guò)大量的案例演習(xí)掌握 Linux 性能的分析和優(yōu)化艘狭。
只有通過(guò)在機(jī)器上練習(xí),把我講的知識(shí)和案例自己過(guò)一遍翠订,這些東西才能轉(zhuǎn)化成你的巢音。我精心設(shè)計(jì)這些案例,正是為了讓你有更好的學(xué)習(xí)理解和操作體驗(yàn)尽超。
所以我強(qiáng)烈推薦你去實(shí)際運(yùn)行官撼、分析這些案例,或者用學(xué)到的知識(shí)去分析你自己的系統(tǒng)似谁,這樣你會(huì)有更直觀的感受歧寺,獲得更好的學(xué)習(xí)效果。
技巧三:勤思考棘脐,多反思,善總結(jié)龙致,多問(wèn)為什么蛀缝。
想真正學(xué)懂一門知識(shí),最好的方法就是問(wèn)問(wèn)題目代。當(dāng)你能提出好的問(wèn)題時(shí)屈梁,就說(shuō)明你已經(jīng)深入了解了它。
你可以隨時(shí)在留言區(qū)給我留言榛了,寫下自己的疑問(wèn)在讶、思考和總結(jié),和我還有其他的學(xué)習(xí)者一起討論切磋霜大。你也可以寫下自己經(jīng)歷過(guò)的性能問(wèn)題构哺,記錄你的分析步驟和優(yōu)化思路,我們一起互動(dòng)探討战坤。
學(xué)習(xí)之前曙强,你的準(zhǔn)備
作為一個(gè)包含大量案例實(shí)踐的課程,我會(huì)在每篇文章中途茫,使用一到兩臺(tái) Ubuntu 18.04 虛擬機(jī)碟嘴,作為案例運(yùn)行和分析的環(huán)境。如果你只是單純聽(tīng)音頻的講解囊卜,卻從不動(dòng)手實(shí)踐娜扇,學(xué)習(xí)的效果一定會(huì)大打折扣错沃。
所以,你是不是可以準(zhǔn)備好一臺(tái) Linux 機(jī)器雀瓢,用于課程案例的實(shí)踐呢枢析?任意的虛擬機(jī)或物理機(jī)都可以,并不局限于 Ubuntu 系統(tǒng)致燥。