使用開源工具識(shí)別 Linux 的性能瓶頸
不久前,識(shí)別硬件瓶頸還需要深厚的專業(yè)知識(shí)。今天的開源 GUI 性能監(jiān)視器使它變得相當(dāng)簡單。
計(jì)算機(jī)是一個(gè)集成的系統(tǒng),它的性能取決于最慢的硬件組件。如果一個(gè)組件的能力比其他組件差,性能落后而不能跟上,它就會(huì)拖累你的整個(gè)系統(tǒng)。這就是一個(gè) 性能瓶頸。消除一個(gè)嚴(yán)重的瓶頸可以使你的系統(tǒng)飛起來。
本文解釋了如何識(shí)別 Linux 系統(tǒng)中的硬件瓶頸。這些技術(shù)同時(shí)適用于個(gè)人的電腦和服務(wù)器。我強(qiáng)調(diào)的是個(gè)人電腦 —— 我不會(huì)涉及局域網(wǎng)管理或數(shù)據(jù)庫系統(tǒng)等領(lǐng)域的服務(wù)器特定的瓶頸。這些通常涉及專門的工具。
我也不會(huì)多談解決方案。這對(duì)本文來說是個(gè)太大的話題。相反,我將寫一篇關(guān)于性能調(diào)整的后續(xù)文章。
我將只使用開源的圖形用戶界面(GUI)工具來完成這項(xiàng)工作。大多數(shù)關(guān)于 Linux 瓶頸的文章都相當(dāng)復(fù)雜。它們使用專門的命令,并深入研究神秘的細(xì)節(jié)。
開源提供的 GUI 工具使得識(shí)別許多瓶頸變得簡單。我的目標(biāo)是給你一個(gè)快速、簡單的方法,你可以在任何地方使用。
從哪里開始
一臺(tái)計(jì)算機(jī)由六個(gè)關(guān)鍵的硬件資源組成。
- 處理器
- 內(nèi)存
- 存儲(chǔ)器
- USB 端口
- 互聯(lián)網(wǎng)連接
- 圖形處理器
如果任何一個(gè)資源表現(xiàn)不佳,就會(huì)產(chǎn)生一個(gè)性能瓶頸。為了識(shí)別瓶頸,你必須監(jiān)測這六種資源。
開源提供了大量的工具來完成這項(xiàng)工作。我會(huì)使用 GNOME 系統(tǒng)監(jiān)視器。它的輸出很容易理解,而且你可以在大多數(shù)軟件庫中找到它。
啟動(dòng)它并點(diǎn)擊“資源”標(biāo)簽。你可以馬上發(fā)現(xiàn)許多性能問題。
圖 1. 系統(tǒng)監(jiān)控器發(fā)現(xiàn)問題。(Howard Fosdick, CC BY-SA 4.0)
在“資源”面板上顯示三個(gè)部分:CPU 歷史、內(nèi)存和交換歷史,以及網(wǎng)絡(luò)歷史。一眼就能看出你的處理器是否不堪負(fù)荷了,還是你的電腦沒有內(nèi)存了,抑或你的網(wǎng)絡(luò)帶寬被用光了。
我將在下面探討這些問題?,F(xiàn)在,當(dāng)你的電腦速度變慢時(shí),首先檢查系統(tǒng)監(jiān)視器。它可以立即為你提供最常見的性能問題的線索。
現(xiàn)在讓我們來探討一下如何識(shí)別特定方面的瓶頸。
如何識(shí)別處理器的瓶頸
要發(fā)現(xiàn)瓶頸,你必須首先知道你有什么硬件。開源為這個(gè)目的提供了幾個(gè)工具。我喜歡 HardInfo,因?yàn)樗钠聊伙@示很容易閱讀,而且廣泛流行。
啟動(dòng) HardInfo。它的“計(jì)算機(jī)->摘要”面板可以識(shí)別你的 CPU 并告訴你它的核心數(shù)、線程數(shù)和速度。它還能識(shí)別你的主板和其他計(jì)算機(jī)部件。
圖 2. HardInfo 顯示了硬件細(xì)節(jié)。(Howard Fosdick, CC BY-SA 4.0)
HardInfo 顯示,這臺(tái)計(jì)算機(jī)有一個(gè)物理 CPU 芯片。該芯片包含兩個(gè)處理器(或稱為核心)。每個(gè)核心支持兩個(gè)線程(或稱為邏輯處理器)。這就是總共四個(gè)邏輯處理器 —— 正是圖 1 中系統(tǒng)監(jiān)控器的 CPU 歷史部分所顯示的。
當(dāng)處理器不能在其時(shí)間內(nèi)對(duì)請(qǐng)求做出反應(yīng)時(shí),就會(huì)出現(xiàn) 處理器瓶頸,說明它們已經(jīng)很忙了。
當(dāng)系統(tǒng)監(jiān)控器顯示邏輯處理器的利用率持續(xù)在 80% 或 90% 以上時(shí),你就可以確定這一點(diǎn)。這里有一個(gè)例子,四個(gè)邏輯處理器中有三個(gè)被淹沒在 100% 的利用率中。這是一個(gè)瓶頸,因?yàn)樗鼪]有留下多少 CPU 用于其他工作。
圖 3. 一個(gè)處理器的瓶頸。(Howard Fosdick, CC BY-SA 4.0)
哪個(gè)程序?qū)е铝诉@個(gè)問題?
你需要找出是哪個(gè)程序在消耗所有的 CPU。點(diǎn)擊系統(tǒng)監(jiān)視器的“進(jìn)程”標(biāo)簽。然后點(diǎn)擊“CPU 百分比”標(biāo)頭,根據(jù)它們消耗的 CPU 的多少對(duì)進(jìn)程進(jìn)行排序。你將看到哪些應(yīng)用程序正在扼殺你的系統(tǒng)。
圖 4. 識(shí)別違規(guī)的進(jìn)程。(Howard Fosdick, CC BY-SA 4.0)
前三個(gè)進(jìn)程各消耗了 總 CPU 資源的 24%。由于有四個(gè)邏輯處理器,這意味著每個(gè)進(jìn)程消耗了一整個(gè)處理器。這就像圖 3 所示。
在“進(jìn)程”面板上,一個(gè)名為“analytical_AI”的程序被確定為罪魁禍?zhǔn)?。你可以在面板上右鍵單擊它,以查看其資源消耗的更多細(xì)節(jié),包括內(nèi)存使用、它所打開的文件、其輸入/輸出細(xì)節(jié),等等。
如果你的登錄會(huì)話有管理員權(quán)限,你可以管理這個(gè)進(jìn)程。你可以改變它的優(yōu)先級(jí),并停止、繼續(xù)、結(jié)束或殺死它。因此,你可以在這里立即解決你的瓶頸問題。
圖 5. 右鍵點(diǎn)擊一個(gè)進(jìn)程來管理它。(Howard Fosdick, CC BY-SA 4.0)
如何解決處理瓶頸問題?除了實(shí)時(shí)管理違規(guī)的進(jìn)程外,你也可以防止瓶頸的發(fā)生。例如,你可以用另一個(gè)應(yīng)用程序來代替違規(guī)進(jìn)程,繞過它,改變你使用該應(yīng)用程序的行為,將該應(yīng)用程序安排在非工作時(shí)間,解決潛在的內(nèi)存問題,對(duì)該應(yīng)用程序或你的系統(tǒng)軟件進(jìn)行性能調(diào)整,或升級(jí)你的硬件。這里涉及的內(nèi)容太多,所以我將在下一篇文章中探討這些方式。
常見的處理器瓶頸
在用系統(tǒng)監(jiān)控器監(jiān)控你的 CPU 時(shí),你會(huì)遇到幾種常見的瓶頸問題。
有時(shí)一個(gè)邏輯處理器出現(xiàn)瓶頸,而其他所有的處理器都處于低利用率。這意味著你有一個(gè)應(yīng)用程序,它的代碼不夠智能,無法利用一個(gè)以上的邏輯處理器,而且它已經(jīng)把正在使用的那個(gè)處理器耗盡了。這個(gè)應(yīng)用程序完成的時(shí)間將比使用更多的處理器要長。但另一方面,至少它能讓你的其他處理器騰出手來做別的工作,而不會(huì)接管你的電腦。
你也可能看到一個(gè)邏輯處理器永遠(yuǎn)停留在 100% 的利用率。要么它非常忙,要么是一個(gè)進(jìn)程被掛起了。判斷它是否被掛起的方法是,是看該進(jìn)程是否從不進(jìn)行任何磁盤活動(dòng)(正如系統(tǒng)監(jiān)視器“進(jìn)程”面板所顯示的那樣)。
最后,你可能會(huì)注意到,當(dāng)你所有的處理器都陷入瓶頸時(shí),你的內(nèi)存也被完全利用了。內(nèi)存不足的情況有時(shí)會(huì)導(dǎo)致處理器瓶頸。在這種情況下,你要解決的是根本的內(nèi)存問題,而不是體現(xiàn)出癥狀的 CPU 問題。
如何識(shí)別內(nèi)存瓶頸
鑒于現(xiàn)代 PC 中有大量的內(nèi)存,內(nèi)存瓶頸比以前要少得多。然而,如果你運(yùn)行內(nèi)存密集型程序,特別是當(dāng)你的計(jì)算機(jī)沒有很多的隨機(jī)存取內(nèi)存(RAM)時(shí),你仍然可能遇到這些問題。
Linux 使用內(nèi)存 既用于程序,也用于緩存磁盤數(shù)據(jù)。后者加快了磁盤數(shù)據(jù)的訪問速度。Linux 可以在它需要的任何時(shí)候回收這些內(nèi)存供程序使用。
系統(tǒng)監(jiān)視器的“資源”面板顯示了你的總內(nèi)存和它被使用的程度。在“進(jìn)程”面板上,你可以看到單個(gè)進(jìn)程的內(nèi)存使用情況。
下面是系統(tǒng)監(jiān)控器“資源”面板中跟蹤總內(nèi)存使用的部分。
圖 6. 一個(gè)內(nèi)存瓶頸。(Howard Fosdick, CC BY-SA 4.0)
在“內(nèi)存”的右邊,你會(huì)注意到 交換空間。這是 Linux 在內(nèi)存不足時(shí)使用的磁盤空間。它將內(nèi)存寫入磁盤以繼續(xù)操作,有效地將交換空間作為你的內(nèi)存的一個(gè)較慢的擴(kuò)展。
你要注意的兩個(gè)內(nèi)存性能問題是:
- 內(nèi)存被大量使用,而且你看到交換空間的活動(dòng)頻繁或不斷增加。
- 內(nèi)存和交換空間都被大量使用。
情況一意味著更慢的性能,因?yàn)榻粨Q空間總是比內(nèi)存更慢。你是否認(rèn)為這是一個(gè)性能問題,取決于許多因素(例如,你的交換空間有多活躍、它的速度、你的預(yù)期,等等)。我的看法是,對(duì)于現(xiàn)代個(gè)人電腦來說,交換空間任何超過象征性的使用都是不可接受的。
情況二是指內(nèi)存和交換空間都被大量使用。這是一個(gè) 內(nèi)存瓶頸。計(jì)算機(jī)變得反應(yīng)遲鈍。它甚至可能陷入一種“咆哮”的狀態(tài),在這種狀態(tài)下,除了內(nèi)存管理之外,它幾乎不能完成其他任務(wù)。
上面的圖 6 顯示了一臺(tái)只有 2GB 內(nèi)存的舊電腦。當(dāng)內(nèi)存使用量超過 80% 時(shí),系統(tǒng)開始向交換空間寫入,響應(yīng)速度下降了。這張截圖顯示了內(nèi)存使用量超過了 90%,而且這臺(tái)電腦已經(jīng)無法使用。
解決內(nèi)存問題的最終答案是要么少用內(nèi)存,要么多買內(nèi)存。我將在后續(xù)文章中討論解決方案。
如何識(shí)別存儲(chǔ)瓶頸
如今的存儲(chǔ)有固態(tài)和機(jī)械硬盤等多個(gè)品種。設(shè)備接口包括 PCIe、SATA、雷電和 USB。無論有哪種類型的存儲(chǔ),你都要使用相同的程序來識(shí)別磁盤瓶頸。
從系統(tǒng)監(jiān)視器開始。它的“進(jìn)程”面板顯示各個(gè)進(jìn)程的輸入/輸出率。因此,你可以快速識(shí)別哪些進(jìn)程做了最多的磁盤 I/O。
但該工具并不顯示每個(gè)磁盤的總數(shù)據(jù)傳輸率。你需要查看特定磁盤上的總負(fù)載,以確定該磁盤是否是一個(gè)存儲(chǔ)瓶頸。
要做到這一點(diǎn),使用 atop 命令。它在大多數(shù) Linux 軟件庫中都有。
只要在命令行提示符下輸入 atop
即可。下面的輸出顯示,設(shè)備 sdb
達(dá)到 busy 101%
。很明顯,它已經(jīng)達(dá)到了性能極限,限制了你的系統(tǒng)完成工作的速度。
圖 7. atop 命令識(shí)別了一個(gè)磁盤瓶頸。(Howard Fosdick, CC BY-SA 4.0)
注意到其中一個(gè) CPU 有 85% 的時(shí)間在等待磁盤完成它的工作(cpu001 w 85%
)。這是典型的存儲(chǔ)設(shè)備成為瓶頸的情況。事實(shí)上,許多人首先看 CPU 的 I/O 等待時(shí)間來發(fā)現(xiàn)存儲(chǔ)瓶頸。
因此,要想輕松識(shí)別存儲(chǔ)瓶頸,請(qǐng)使用 atop
命令。然后使用系統(tǒng)監(jiān)視器上的“進(jìn)程”面板來識(shí)別導(dǎo)致瓶頸的各個(gè)進(jìn)程。
如何識(shí)別 USB 端口的瓶頸
有些人整天都在使用他們的 USB 端口。然而,他們從不檢查這些端口是否被最佳地使用。無論你是插入外部磁盤、U 盤,還是其他東西,你都要確認(rèn)你是否從 USB 連接的設(shè)備中獲得了最大性能。
這個(gè)圖表顯示了原因。潛在的 USB 數(shù)據(jù)傳輸率差異 很大。
圖 8. USB 速度變化很大。(Howard Fosdick,根據(jù) Tripplite 和 Wikipedia 提供的數(shù)字,CC BY-SA 4.0)
HardInfo 的“USB 設(shè)備”標(biāo)簽顯示了你的計(jì)算機(jī)支持的 USB 標(biāo)準(zhǔn)。大多數(shù)計(jì)算機(jī)提供不止一種速度。你怎么知道一個(gè)特定端口的速度呢?供應(yīng)商對(duì)它們進(jìn)行顏色編碼,如圖表中所示。或者你可以在你的計(jì)算機(jī)的文檔中查找。
要看到你得到的實(shí)際速度,可以使用開源的 GNOME 磁盤 程序進(jìn)行測試。只要啟動(dòng) GNOME 磁盤,選擇它的“磁盤基準(zhǔn)”功能,然后運(yùn)行一個(gè)基準(zhǔn)測試。這將告訴你在一個(gè)端口插入特定設(shè)備時(shí),你將得到的最大實(shí)際速度。
你可能會(huì)得到不同的端口傳輸速度,這取決于你將哪個(gè)設(shè)備插入它。數(shù)據(jù)速率取決于端口和設(shè)備的特定組合。
例如,一個(gè)可以以 3.1 速度運(yùn)行的設(shè)備如果使用 2.0 端口就會(huì)以 2.0 的速度運(yùn)行。(而且它不會(huì)告訴你它是以較慢的速度運(yùn)行的!)相反,如果你把一個(gè) USB 2.0 設(shè)備插入 3.1 端口,它能工作,但速度是 2.0 的速度。所以要獲得快速的 USB,你必須確保端口和設(shè)備都支持它。GNOME 磁盤為你提供了驗(yàn)證這一點(diǎn)的方法。
要確定 USB 的處理瓶頸,使用你對(duì)固態(tài)和硬盤所做的同樣程序。運(yùn)行 atop
命令來發(fā)現(xiàn) USB 存儲(chǔ)瓶頸。然后,使用系統(tǒng)監(jiān)視器來獲取違規(guī)進(jìn)程的詳細(xì)信息。
如何識(shí)別互聯(lián)網(wǎng)帶寬瓶頸
系統(tǒng)監(jiān)控器的“資源”面板會(huì)實(shí)時(shí)告訴你互聯(lián)網(wǎng)連接速度(見圖 1)。
有 很好的 Python 工具 可以測試你的最大網(wǎng)速,但你也可以在 Speedtest、Fast.com 和 Speakeasy 等網(wǎng)站進(jìn)行測試。為了獲得最佳結(jié)果,關(guān)閉所有東西,只運(yùn)行 速度測試;關(guān)閉你的虛擬私有網(wǎng)絡(luò);在一天中的不同時(shí)間運(yùn)行測試;并比較幾個(gè)測試網(wǎng)站的結(jié)果。
然后將你的結(jié)果與你的供應(yīng)商聲稱的下載和上傳速度進(jìn)行比較。這樣,你就可以確認(rèn)你得到的是你所付費(fèi)的速度。
如果你有一個(gè)單獨(dú)的路由器,在有和沒有它的情況下進(jìn)行測試。這可以告訴你,你的路由器是否是一個(gè)瓶頸。如果你使用 WiFi,在有 WiFi 和沒有 WiFi 的情況下進(jìn)行測試(通過將你的筆記本電腦直接與調(diào)制解調(diào)器連接)。我經(jīng)??吹饺藗儽г顾麄兊幕ヂ?lián)網(wǎng)供應(yīng)商,而實(shí)際上他們只是有一個(gè) WiFi 瓶頸,可以自己解決。
如果某些程序正在消耗你的整個(gè)互聯(lián)網(wǎng)連接,你想知道是哪一個(gè)。通過使用 nethogs
命令找到它。它在大多數(shù)軟件庫中都有。
有一天,我的系統(tǒng)監(jiān)視器突然顯示我的互聯(lián)網(wǎng)訪問量激增。我只是在命令行中輸入了 nethogs
,它立即確定帶寬消耗者是 Clamav 防病毒更新。
圖 9. Nethogs 識(shí)別帶寬用戶。(Howard Fosdick, CC BY-SA 4.0)
如何識(shí)別圖形處理瓶頸
如果你把顯示器插在臺(tái)式電腦后面的主板上,你就在使用 板載顯卡。如果你把它插在后面的卡上,你就有一個(gè)專門的圖形子系統(tǒng)。大多數(shù)人稱它為 視頻卡 或 顯卡。對(duì)于臺(tái)式電腦來說,附加顯卡通常比主板上的顯卡更強(qiáng)大、更昂貴。筆記本電腦總是使用板載顯卡。
HardInfo 的“PCI 設(shè)備”面板告訴你關(guān)于你的圖形處理單元(GPU)。它還顯示你的專用視頻內(nèi)存的數(shù)量(尋找標(biāo)有“可預(yù)取”的內(nèi)存)。
圖 10. HardInfo提供圖形處理信息。(Howard Fosdick, CC BY-SA 4.0)
CPU 和 GPU 非常密切地 一起工作。簡而言之,CPU 為 GPU 準(zhǔn)備渲染的幀,然后 GPU 渲染這些幀。
當(dāng)你的 CPU 在等待 100% 繁忙的 GPU 時(shí),就會(huì)出現(xiàn) GPU 瓶頸。
為了確定這一點(diǎn),你需要監(jiān)控 CPU 和 GPU 的利用率。像 Conky 和 Glances 這樣的開源監(jiān)控器,如果它們的擴(kuò)展插件支持你的圖形芯片組,就可以做到這一點(diǎn)。
看一下 Conky 的這個(gè)例子。你可以看到,這個(gè)系統(tǒng)有很多可用的 CPU。GPU 只有 25% 的使用率。想象一下,如果這個(gè) GPU 的數(shù)量接近 100%。那么你就會(huì)知道 CPU 在等待 GPU,你就會(huì)有一個(gè) GPU 的瓶頸。
圖 11. Conky 顯示 CPU 和 GPU 的利用率。 (圖片來源:AskUbuntu論壇)
在某些系統(tǒng)上,你需要一個(gè)供應(yīng)商專屬的工具來監(jiān)控你的 GPU。它們可以從 GitHub 上下載,并在 GPU 監(jiān)控和診斷命令行工具 這篇文章中有所描述。
總結(jié)
計(jì)算機(jī)由一系列集成的硬件資源組成。如果它們中的任何一個(gè)在工作量上遠(yuǎn)遠(yuǎn)落后于其他資源,就會(huì)產(chǎn)生性能瓶頸。這可能會(huì)拖累你的整個(gè)系統(tǒng)。你需要能夠識(shí)別和糾正瓶頸,以實(shí)現(xiàn)最佳性能。
不久前,識(shí)別瓶頸需要深厚的專業(yè)知識(shí)。今天的開源 GUI 性能監(jiān)控器使它變得相當(dāng)簡單。