Linux 系統性能瓶頸分析 -超詳細-
前言
Linux 系統性能指標無非就是這幾個方面,CPU、內存、磁盤 I/O、文件系統、網絡等相關指標。不同的性能指標都有對應的具體命令工具進行查看與監控,接下來我們將介紹一些常見的 Linux 系統性能指標及其對應的命令工具(通過命令工具找出 Linux 系統性能瓶頸),而要優化 Linux 系統性能,首先就要對 Linux 性能指標的知識點進行整體掌握,否則一切都是空談。
一、性能指標
1.1 進程
1.1.1 進程定義
在計算機網絡領域中,進程是指正在運行的程序的實例。它是操作系統管理和分配資源的基本單位。每個進程都包含程序代碼、數據、內存、寄存器和系統資源的集合,它們在內存中獨立存在,相互隔離,互不干擾。
1.1.2 進程狀態
在操作系統中,進程可以處於不同的狀態,這些狀態表示了進程在其生命週期中的不同情況和條件。通常,進程可以分爲以下幾種主要狀態:
創建(Created):當一個新進程被創建但尚未被操作系統調度執行時,它處於創建狀態。在這個狀態下,進程的控制塊被初始化,但尚未分配 CPU 資源。
就緒(Ready):一旦進程被初始化並且滿足了運行的條件,它就會進入就緒狀態(其實就是進入了任務隊列)。在就緒狀態下,進程等待操作系統的調度以獲得 CPU 時間片來執行。
運行(Running):當操作系統調度進程並將其分配到 CPU 時,進程進入運行狀態。在運行狀態下,進程將會執行其指令和代碼。
阻塞(Blocked):
如果一個進程在執行過程中需要等待某些事件(例如 I/O 操作完成、等待資源釋放等),它就會進入阻塞狀態。在阻塞狀態下,進程不會消耗 CPU 時間,直到等待的事件發生。
其實我們經常說的可中斷睡眠進程和不可中斷睡眠進程就是處於阻塞的一種狀態,唯一的區別就是可中斷的等待狀態的進程一旦達到某種條件就會處於運行狀態或由於接收到信號被提前喚醒並進入運行狀態,而不可中斷的等待狀態的進程則不會對接收的信號進行響應(典型的例子就是等待磁盤 I/O 操作)。
終止(Terminated):當進程完成其任務或由於某種原因終止時,它會進入終止狀態。在終止狀態下,進程的所有資源被釋放,並且進程的控制塊被清除。
掛起(Suspended):有時操作系統可以將進程掛起,即使它是就緒或運行狀態。掛起狀態意味着進程被暫時停止,不會消耗 CPU 時間。通常,掛起狀態是爲了釋放資源或優化系統性能。
進程狀態之間的轉換通常如下:
-
進程可以從創建狀態轉換到就緒狀態。
-
進程可以從就緒狀態轉換到運行狀態,從運行狀態轉換到就緒狀態(例如,時間片用完),或者從運行狀態轉換到阻塞狀態(例如,等待 I/O 操作完成)。
-
進程可以從阻塞狀態轉換到就緒狀態(例如,等待的 I/O 操作完成),或者從阻塞狀態轉換到終止狀態(例如,因爲發生了錯誤)。
-
進程可以從就緒狀態轉換到掛起狀態或從掛起狀態轉換回就緒狀態。
-
進程可以從就緒狀態或阻塞狀態轉換到終止狀態。
進程狀態的管理和調度是操作系統的重要任務之一,以確保資源的有效分配和進程的合理執行順序。不同的操作系統和調度算法可能會有不同的狀態管理方式和規則。
1.1.3 進程優先級
首先要清楚,Linux 是一個多用戶多任務的操作系統,如何理解多用戶和多任務?
多用戶
- 即 Linux 系統允許多個用戶同時訪問和使用系統資源,每個用戶有自己的用戶賬戶(用於身份驗證和授權),且每個用戶賬戶通常有自己的家目錄,用於存儲個人文件和配置。
多任務
-
多任務是指操作系統能夠同時運行多個程序或進程,而不僅僅是一個程序在運行,這使得多個任務可以併發執行。在 Linux 系統中,每個任務通常是一個獨立的進程或線程。這些任務可以是用戶啓動的應用程序、系統服務、後臺進程等。所有的任務都放在一個隊列中,操作系統通過分時調度算法來分配 CPU 時間片,以便在多個任務之間切換,從而實現併發執行。
-
對於單 CPU 多任務操作系統而言,CPU 通過分配時間片以併發的方式來執行多任務(串行執行——即在某個時間點只能執行一個任務);而對於多 CPU 多任務操作系統而言,CPU 既可以過分配時間片以併發的方式來執行多任務,也可以在某個時間點並行執行多個任務,這就是多核 CPU 比單核 CPU 處理性能高的原因。
那在隊列中的這些任務誰先會被 CPU 執行呢?是隨機的嗎?於是這裏就涉及到了進程優先級與 nice 值的相關概念了。在操作系統中,通常存在兩種類型的進程優先級:動態優先級和靜態優先級。這兩種優先級概念用於進程調度和資源分配,但它們有不同的性質和影響。
靜態優先級(Static Priority):
-
靜態優先級是在進程創建時分配的,並且在進程的整個生命週期內保持不變。
-
靜態優先級通常由用戶或程序員明確設置,以反映進程的重要性或性能需求。這通常通過操作系統提供的 API 或命令來實現。
-
進程的靜態優先級在進程的整個生命週期中不會改變,除非明確修改。
動態優先級(Dynamic Priority):
-
動態優先級是在運行時根據系統負載和其他因素動態調整的優先級。
-
動態優先級的調整可以根據進程的行爲、CPU 利用率、等待時間等因素進行,以便更好地響應系統的需求。
-
操作系統的調度算法通常會考慮動態優先級來決定哪個進程在給定時刻獲得 CPU 時間。
那 nice 值又是個什麼東西呢?nice 值用於表示進程的優先級(靜態優先級),但是與一些其他操作系統不同的是,Linux 系統的 nice 值的範圍通常是 -20~19,而不是 0~139,較低的 nice 值表示較高的優先級,較高的 nice 值表示較低的優先級。因此在任務隊列中誰會先被 CPU 調度取決於該任務的優先級,若某些任務的優先級較高,則操作系統將更頻繁地分配 CPU 時間給這些進程,反之將較少地獲得 CPU 時間。那在 Linux 系統中,我們如何設置任務(進程)的 nice 值呢?具體方法如下:
設置 nice 值的基本語法
# 語法1 - 運行一個新任務(進程)時爲其指定nice值
nice -n <nice_value> <command>
# <nice_value>:是一個整數,表示要爲進程設置的nice值,範圍(-20~19)
# <command>:是要運行的程序及其參數(即程序啓動命令)
# 語法2 - 修改一個正在運行的進程的nice值
renice <nice_value> -p <PID>
# <nice_value>:是一個整數,表示要爲進程設置的nice值,範圍(-20~19)
# <PID>:正在運行的進程PID號
案例
nice -n -10 ./your_program
renice 5 -p <your_program_PID>
注意的是:nice 命令可允許普通用戶降低進程的優先級,但不能提高其優先級,提高優先級通常需要超級用戶權限。而且在 Linux 中,大多數進程的默認 nice 值爲 0,這表示它們具有標準的優先級。
1.1.4 進程與程序間的關係
進程(Process)和程序(Program)是計算機科學中相關但不同的概念,它們之間存在緊密的關係:
-
程序(Program): 程序是一組指令和代碼的集合,它是以某種編程語言編寫的、用於完成特定任務的軟件。程序是靜態的,它通常存儲在磁盤上,等待被執行。程序的典型示例包括編寫的源代碼文件、可執行二進制文件(已經編譯並可以運行的程序)、腳本文件等。
-
進程(Process): 進程是程序的實際執行實例。當程序在計算機上運行時,操作系統會爲它創建一個進程,分配資源(如內存、CPU 時間、文件描述符等),並在計算機上執行程序的指令。每個進程都是獨立的、有自己的內存空間和執行環境。多個進程可以同時運行,彼此獨立。
1.1.5 進程與進程間的關係
在操作系統中,不同進程之間可以有多種關係和交互方式。以下是一些常見的進程之間的關係:
父子進程關係:在某些操作系統中,一個進程可以創建其他進程(通過 fork() 系統調用來創建),這些創建的進程被稱爲子進程,而創建它們的進程稱爲父進程。子進程通常繼承父進程的一些屬性,如文件描述符、環境變量等。父子進程之間可以通過進程間通信機制來交換數據和信息。
父子進程中又會涉及到殭屍進程和孤兒進程的概念:
- 殭屍進程(Zombie Process)
殭屍進程是指一個子進程在執行完畢後,但其父進程尚未通過系統調用(通常是 wait() 或 waitpid())來獲取子進程的終止狀態信息。因爲操作系統需要保留子進程的一些信息(如退出狀態碼),直到父進程請求這些信息,所以這個子進程被稱爲 "殭屍"。殭屍進程不佔用系統資源,但在系統中存在時,會佔用進程號(PID)等資源。
解決殭屍進程的常見方法是父進程調用 wait() 或 waitpid() 等系統調用,來獲取子進程的退出狀態信息,然後將殭屍進程徹底清理掉。如果父進程沒有正確處理子進程的退出狀態,就會導致殭屍進程的堆積,最終可能會耗盡系統的進程號資源。
一句話:殭屍進程是子進程在終止後父進程未處理其退出狀態信息的情況,需要父進程調用 wait() 或 waitpid() 來清理。
- 孤兒進程(Orphan Process)
孤兒進程是指一個子進程的父進程在子進程終止後,自己提前退出或異常終止,導致子進程失去了父進程。這時候,孤兒進程會被操作系統的 init 進程(通常具有 PID 1)接管。init 進程會成爲孤兒進程的新父進程,負責收養和管理它們。
孤兒進程的存在是爲了確保進程不會變成殭屍進程。因爲 init 進程會定期檢查並處理它的子進程,一旦孤兒進程終止,init 進程會及時回收它的資源,包括終止狀態信息,從而避免了殭屍進程的問題。
一句話:孤兒進程是子進程的父進程提前終止,導致子進程失去了父進程。這些子進程會被操作系統的 init 進程接管,以避免它們變成殭屍進程。
如果父進程在子進程
-
兄弟進程關係: 兄弟進程是指由同一個父進程創建的多個子進程。這些兄弟進程通常是獨立運行的,但它們可以共享某些資源,如父進程創建的文件描述符或共享內存區域。
-
併發進程關係: 併發進程是指在系統中同時運行的多個獨立進程,它們可以在不同的處理器核心(比如多核服務器)上並行執行,以提高系統性能。
-
競爭條件和同步關係: 當多個進程試圖同時訪問共享資源時,可能會發生競爭條件。爲了避免數據損壞和不一致性,需要使用同步機制來確保進程之間的順序執行或互斥訪問共享資源。
-
進程間通信關係: 進程之間可以通過進程間通信(Inter-Process Communication,IPC)機制來交換數據和信息。常見的 IPC 方式包括管道、消息隊列、信號、套接字、共享內存等。
-
進程間協作關係: 進程可以協作來完成複雜的任務。這種協作可以通過共享數據、互相通知、等待其他進程完成某些操作等方式來實現。
-
進程間客戶端 - 服務器關係: 在分佈式系統中,進程之間可以扮演客戶端和服務器的角色。客戶端進程請求服務並與服務器進程通信,以實現分佈式應用程序的功能。
1.1.6 進程與線程的關係
進程(Process)和線程(Thread)都是操作系統中用於實現多任務處理的關鍵概念,它們之間存在緊密的關係,但也有一些重要的區別。
進程和線程的定義:
-
進程是程序的執行實例,它有獨立的內存空間、資源和執行環境。每個進程都有自己的地址空間和系統資源,進程之間相互獨立。
-
線程是進程內的一個執行單元,線程共享進程的內存空間和資源,因此多個線程可以在同一進程內併發執行。
資源分配和管理:
-
進程需要獨立的資源,如內存、文件描述符等,操作系統需要分配和管理這些資源,因此進程之間的資源隔離較強。
-
線程共享進程的資源,包括內存和文件句柄等。這使得線程之間的通信和數據共享更加容易,但也需要更小心地進行同步和互斥,以避免競態條件和數據訪問衝突。
創建和銷燬開銷:
-
創建和銷燬進程通常比較昂貴,因爲它們需要分配和釋放獨立的資源。
-
創建和銷燬線程的開銷相對較小,因爲它們共享進程的資源,不需要額外的資源分配。
併發性:
-
進程之間的併發性較低,因爲它們通常是相互獨立的,通信和同步需要較複雜的機制。
-
線程之間的併發性較高,因爲它們共享相同的內存空間,可以更容易地共享數據和通信。
故障容忍性:
-
進程之間的故障通常不會相互影響,一個進程的崩潰不會導致其他進程崩潰。
-
線程之間的故障容忍性較低,因爲它們共享相同的內存空間,一個線程的錯誤可能會影響整個進程的穩定性。
多核利用:
-
線程更容易在多核處理器上並行執行,因爲它們屬於同一進程,可以充分利用進程的多個核心。
-
進程在多核處理器上的並行執行可能需要更多的協調和通信開銷。
一句話:“進程是程序的一次動態執行,它對應着從代碼加載、執行至執行完畢的一個完整過程,是一個動態的實體,有自己的生命週期;而線程是進程的一個實體,是 CPU 調度和分派的基本單位,同一進程中的多個線程間可併發執行。而且一個線程(父線程)可以創建一個或多個子線程,這些子線程還可以繼續創建更多的子線程,以此類推。”
1.2 內存
1.2.1 物理內存與虛擬內存
每個進程在執行時都有自己的地址空間,這個地址空間其實就是 Linux 內核根據需要給進程分配的一個內存空間(區域)來作爲當前進程的工作區,也稱爲進程的內存空間。這個地址空間包括了程序的指令、數據、堆棧、共享庫和其他資源。操作系統負責分配和管理每個進程的地址空間,確保進程之間不會相互干擾。
當操作系統啓動一個進程時,它會將進程的可執行文件加載到進程的地址空間中,使進程能夠執行其中的指令。這包括將程序的代碼段加載到內存中,爲進程分配數據段和堆棧,以及加載所需的共享庫等。儘管進程的地址空間通常是隔離的,但操作系統也允許進程之間共享內存區域,以便進行進程間通信(IPC)。這種共享可以通過共享內存、內存映射文件等機制來實現。
然而內存又涉及到兩個概念,物理內存(Physical Memory)與虛擬內存(Virtual Memory)。所謂的物理內存就是計算機系統中實際存在的硬件內存,通常是 RAM(隨機訪問存儲器)的形式。它是計算機用於存儲和訪問數據、指令和程序的物理硬件。在 Linux 系統中還有一個邏輯內存的概念,邏輯內存是爲了滿足物理內存不足而提出的策略,它是利用磁盤空間虛擬出的一塊邏輯內存區域,被用作邏輯內存的這塊磁盤空間我們稱之爲交換空間(Swap Space)。
但在 Linux 系統中,不管是物理內存還是邏輯內存,都會被映射爲虛擬內存,這樣的話,應用程序在使用內存時,就需要向 Linux 內核申請一個特定大小的內存映射,並且會收到其申請的虛擬內存的映射。因此,應用程序申請到的這個虛擬內存不一定是全部是物理內存的映射,還可能是邏輯內存的映射。然而,這種虛擬內存管理機制對用戶和程序來說通常是不可見的(由底層自動實現),但我們還是需要理解 Linux 內存架構、地址佈局等。
1.2.2 頁高速緩存與頁寫回機制
頁是物理內存或虛擬內存中一組連續的線性地址,Linux 以頁爲單位處理內存,頁的大小通常是 4KB 或更大。
1、頁高速緩存(Page Cache)
頁高速緩存通常以頁面的單位來存儲數據,因此被稱爲 "頁" 高速緩存。頁高速緩存是操作系統在物理內存中維護的一個緩存,用於存儲磁盤上的文件數據的副本。Linux 系統中當一個文件的數據(內容)被讀取時,操作系統將數據從磁盤讀取到頁高速緩存中,以便後續的讀取操作可以更快速地訪問數據。
因此頁高速緩存提高了文件的讀取性能,因爲它允許頻繁訪問的數據保留在快速的內存中,而不是每次都從慢速的磁盤中讀取。
2、頁寫回機制(Page Writeback)
頁寫回機制是一種優化技術,用於減少文件寫入操作對性能的影響。當文件數據被修改並需要寫回磁盤時,操作系統通常不會立即將數據寫回磁盤,而是將數據標記爲 "髒",並將其保留在頁高速緩存中。操作系統通過一種策略,例如延遲寫回或按需寫回,決定何時將髒數據寫回磁盤。這允許操作系統將多個寫操作合併,以減少磁盤寫入的次數,提高性能。
頁寫回機制可以防止頻繁的磁盤寫入操作對系統性能造成明顯的影響,因爲它允許系統在更高效的時間進行磁盤寫入,而不是在每個寫操作之後立即進行。
小結:
-
頁高速緩存是一種用於提高文件讀取性能的技術,通過將磁盤數據緩存在物理內存中。
-
頁寫回機制是一種用於減少文件寫入操作對性能的影響的優化策略,它延遲了髒數據的磁盤寫入操作,以提高效率。
-
頁高速緩存與頁寫回機制這兩個概念通常用於操作系統的文件系統和虛擬內存管理中,以改善性能和響應時間。
1.2.3 Swap Space
前面說到了,用作 Linux 系統邏輯內存的磁盤空間我們稱之爲 Swap Space(即交換空間),其除了填補因物理內存不足的空缺外,還將會在適當的時候將物理內存中不經常讀寫的數據塊自動交換到 Swap 交換空間(這個交換的操作是由 Linux 內核來執行的),從而側面將經常讀寫的數據保留在了物理內存。說白了就是,它爲什麼叫交換空間,就是要實現數據的交換(即將不常用數據交換到作爲邏輯內存的磁盤空間,而保留常用數據在真正的物理內存空間中)。這個交換的策略由 Linux 系統內核定時執行,目的就是爲了保持儘可能多的空閒物理內存。
那什麼叫做在適當的時候會進行數據交換,我們所說的適當時間其實是 Linux 內核根據 “最近最經常使用” 算法(LRU 算法),定時地將一些不經常使用的頁面文件(其實就是文件數據,因爲我們說了,內存是以頁面存儲數據的)交換到 Swap。
有時候你會發現:Linux 物理內存還有很多,而 Swap 的數據佔用卻很大,這是什麼原因呢?其實,這是正常現象,你想想,如果一個內存佔用很大的進程正在運行,必然就會耗費大量的內存資源,此時 Linux 內核就會將一些不常用的頁面文件交換到 Swap Space 中,但當後來該內存佔用較大的進程終止時,Linux 就會釋放該進程佔用的大量內存資源,而此時被交換出去的頁面文件數據並不會自動又交換到物理內存中來(除非有這個必要),那此時你看到的就是物理內存空閒,Swap Space 佔用較大的現象了。
這裏要明白的是,當程序要讀虛擬內存中的某個頁面數據時,而恰好這個頁面數據位於 Swap Space 中。那此時的流程就是:交換空間(Swap Space)中的數據在被讀取時通常會首先被交換到物理內存,然後才能被程序訪問。因此,這裏又涉及到了兩個知識點:
1、頁面缺失(Page Fault)
當程序嘗試訪問一個在物理內存中不存在的內存頁時,會觸發一個頁面缺失。這可能是因爲該頁已經被交換到了交換空間中,或者是因爲程序首次訪問該頁。在任何情況下,操作系統會注意到頁面缺失。
2、頁面調度(Page Scheduling)
操作系統負責頁面調度,決定哪些頁面從交換空間加載到物理內存中以滿足程序的需求。通常,操作系統會使用一種頁面替換算法(例如 LRU - 最近最少使用)來選擇哪些頁從交換空間中加載,以便最大限度地減少性能開銷。
一旦數據加載到物理內存中,操作系統會更新進程的頁表,以指示這些頁面現在位於物理內存中,程序可以訪問它們。頁表是一個數據結構,用於映射虛擬地址到物理地址。
1.3 文件系統
1.3.1 文件系統分類
在 Linux 中,文件系統可以根據不同的分類標準進行歸類。以下是一些常見的文件系統分類:
本地文件系統(Local File Systems):
本地文件系統是直接掛載到計算機上的物理或虛擬存儲設備上的文件系統。這些文件系統用於存儲本地數據,如硬盤驅動器、固態驅動器、USB 驅動器等。常見的本地文件系統包括 EXT 家族(ext2、ext3、ext4)、Btrfs、XFS、F2FS 等。
網絡文件系統(Network File Systems):
網絡文件系統允許遠程計算機通過網絡訪問和共享文件。這些文件系統通過網絡協議(如 NFS、SMB/CIFS 等)提供文件共享數據。常見的網絡文件系統包括 NFS(Network File System)和 SMB/CIFS(Server Message Block / Common Internet File System)。
虛擬文件系統(Virtual File Systems):
虛擬文件系統是 Linux 內核中的一種抽象層,用於管理文件系統的抽象概念,而不是物理存儲。它允許操作系統訪問不同類型的文件系統,如本地文件系統、網絡文件系統和特殊文件系統,以統一的方式。如 procfs 文件系統(/proc,用於訪問進程和系統信息)、sysfs 文件系統(/sys,用於管理設備和內核參數)、tmpfs 文件系統(用於臨時文件系統)等。
特殊文件系統(Special File Systems):
特殊文件系統用於提供對系統和硬件資源的訪問,通常不存儲文件數據,而是提供對系統信息的訪問。這些文件系統通常位於 /proc 和 /sys 目錄下。例如,/proc 文件系統提供了有關正在運行的進程、系統信息和內核參數的信息。有時候面試會問你,/proc 目錄佔用磁盤空間嗎?顯然是不佔用的。
虛擬化文件系統(Virtualization File Systems):
這些文件系統用於虛擬化環境中,例如虛擬機管理器(如 KVM、VirtualBox)中,它們允許虛擬機訪問主機系統上的文件和資源。常見的虛擬化文件系統包括 9pfs(用於 QEMU 虛擬機)等。
日誌文件系統(Logging File Systems):
這些文件系統使用日誌記錄(journaling)來跟蹤文件系統的變化,以提高數據一致性和恢復性。ext3 和 ext4 是常見的日誌文件系統。
閃存文件系統(Flash File Systems):
閃存文件系統專門設計用於閃存存儲設備,如 SSD、USB 閃存驅動器和 SD 卡,如 F2FS 文件系統。
1.3.2 文件系統選擇
以上衆多眼花繚亂的文件系統分類中,我們應該怎麼選擇呢?實際上選擇文件系統應根據您的需求和硬件來決定,因爲每種文件系統都有其適用場景和特點。不同的文件系統可能在性能、可靠性、功能和兼容性方面有所不同。比如像 Linux 本地磁盤存儲文件系統,我們選擇 XFS 或 EXT4 完全夠用了。
1.3.3 優化思路
那在磁盤文件系統這一塊我們是怎麼優化的呢?——磁盤冗餘陣列(RAID)。如果程序訪問磁盤的方式是順序訪問的,那麼就更換一個更好的磁盤控制器,如果是隨機訪問,則增加更多的磁盤控制器,其實就是分佈式和集中式的訪問概念。
磁盤冗餘陣列(RAID)是一種用於提高數據存儲可靠性和性能的技術。RAID 將多個硬盤驅動器組合在一起,以創建一個單一的邏輯存儲單元,數據會分散存儲在這些驅動器上,不同的 RAID 級別提供不同級別的冗餘和性能。
以下是一些常見的 Linux 支持的 RAID 級別:
-
RAID 0:RAID 0 也稱爲條帶化(striping)陣列,它將數據塊分成多個條帶並將這些條帶分散存儲在多個硬盤上。RAID 0 提供了更高的性能,因爲數據可以並行讀取和寫入多個驅動器。然而,RAID 0 沒有冗餘,如果一個驅動器故障,所有數據都會丟失。因此,如果你的程序讀寫數據頻繁、且對數據安全性一般的話,就可採用 RAID 0
-
RAID 1:RAID 1 是鏡像(mirroring)陣列,它將相同的數據複製到兩個或更多硬盤上。因此 RAID 1 提供了數據冗餘,如果一個驅動器故障,數據仍然可用。RAID 1 通常用於重要數據的備份。RAID 1 需要至少兩個硬盤驅動器。
-
RAID 5:RAID 5 使用條帶化和奇偶校驗來提供數據冗餘和性能。數據被分成多個條帶,並且奇偶校驗信息分佈在不同的驅動器上。如果一個驅動器故障,可以通過奇偶校驗信息恢復數據。RAID 5 需要至少三個硬盤驅動器。
-
RAID 6:RAID 6 類似於 RAID 5,但提供更高級別的冗餘。它使用兩組奇偶校驗信息來保護數據,因此可以容忍兩個驅動器的故障。RAID 6 需要至少四個硬盤驅動器。
-
RAID 10:RAID 10 是 RAID 1+0 的組合,它將數據複製到多個驅動器上,並使用條帶化提供更高的性能。RAID 10 提供了很高的性能和冗餘,但需要至少四個硬盤驅動器。
要在 Linux 上設置 RAID,通常需要硬件支持或使用軟件 RAID。軟件 RAID 使用 Linux 內核中的軟件驅動程序來管理 RAID 陣列,而硬件 RAID 依賴於專用 RAID 控制器。在 Linux 中,可以使用工具如 mdadm(用於軟件 RAID 管理)或硬件 RAID 控制器的管理工具來創建、管理和監控 RAID 陣列。配置 RAID 陣列時,請確保備份重要數據,因爲 RAID 雖然提供了一定程度的數據冗餘,但並不是絕對可靠的備份解決方案。
1.4 磁盤 I/O
1.4.1 認識磁盤
在計算機存儲系統中,硬盤是主要的數據存儲設備之一,數據被存儲在硬盤的表面上,而硬盤表面被劃分爲許多扇區,每個扇區都是數據存儲和訪問的最小單位。但實際中操作系統讀取硬盤的時候,不會一個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取一個 "塊"(block)。這種由多個扇區組成的 "塊",是文件存取的最小單位。"塊" 的大小,最常見的是 4KB,即連續八個 sector 組成一個 block。以下是磁盤和扇區之間的關係的要點:
-
硬盤驅動器:硬盤驅動器是計算機中的存儲設備,它包含一個或多個磁盤盤片。這些盤片上有一個或多個磁性塗層,用於存儲數據。
-
磁道:磁盤表面被劃分爲一個個同心圓環,每個環被稱爲一個磁道(track)。數據通常存儲在這些磁道上。
-
扇區:每個磁道被分爲若干個扇區(sector),扇區是存儲數據的最小物理單位。通常,每個扇區的大小爲 512 字節或 4K 字節。
-
磁頭:硬盤驅動器上有多個讀 / 寫頭,它們位於磁盤的頂部和底部,用於讀取和寫入數據。磁頭可以移動到不同的磁道上,以讀取或寫入數據。
-
柱面:柱面(cylinder)是垂直堆疊在多個盤片上的同心圓磁道的集合。在磁盤驅動器上,讀 / 寫頭可以同時訪問相同柱面上的多個磁道。
數據在磁盤上的存儲和檢索過程通常涉及到讀 / 寫頭移動到正確的柱面和磁道上,然後在相應的扇區上進行數據傳輸。操作系統和文件系統管理這些硬件細節,以便應用程序可以讀取和寫入文件,而無需關心底層硬件的物理結構。
1.4.2 磁盤 I/O 調度策略
在 Linux 中,磁盤 I/O 調度策略用於決定磁盤上的 I/O 請求的執行順序,以最大程度地提高系統性能和吞吐量。不同的磁盤 I/O 調度策略採用不同的算法來管理 I/O 請求隊列。以下是一些常見的 Linux 磁盤 I/O 調度策略:
CFQ(Completely Fair Queuing)
CFQ 調度器旨在提供公平性,確保每個進程都能公平地訪問磁盤。它爲每個進程維護一個 I/O 請求隊列,並使用時間片輪轉的方式爲各個隊列提供服務。在 Linux 2.6 內核上默認採用的就是該調度策略。
Deadline
Deadline 調度器着重於 I/O 請求的響應時間。它將 I/O 請求分爲兩類:讀取請求和寫入請求,然後按照截止時間來排序。讀取請求通常具有較短的截止時間,以減少讀取延遲,而寫入請求通常具有較長的截止時間,以優化寫入性能。其核心就是在於保證每個 I/O 請求在一定時間內一定要被服務到,避免某個請求飢餓。在 Linux 3.x 內核上默認採用的就是該調度策略。
NOOP
NOOP 調度器是一個簡單的 FIFO(先進先出)隊列,不執行任何排序或優化。它通常用於高性能存儲設備,如固態硬盤(SSD),因爲這些設備通常具有較低的訪問延遲。
BFQ(Budget Fair Queueing)
BFQ 調度器旨在提供更好的磁盤 I/O 吞吐量和響應時間。它採用基於權重的算法,爲每個進程分配預算,然後根據預算來調度 I/O 請求。BFQ 適用於需要更好響應時間的多任務工作負載。
Kyber
Kyber 調度器是一個新的 I/O 調度器,旨在兼顧低延遲和高吞吐量。它使用一種稱爲 Kyber Deadline 的方式來管理 I/O 請求,儘量減少延遲並提高性能。
MQ-DEADLINE
MQ-DEADLINE 是一種多隊列版本的 Deadline 調度器,它在多核系統中更有效地管理 I/O 請求隊列。
如何查看 Linux 的磁盤 I/O 調度策略?
cat /sys/block/sda/queue/scheduler
# 字段解釋:
noop:表示當前使用的是noop調度策略
[deadline]:表示默認策略是deadline(但當前未激活)
1.4.3 磁盤與緩存機制
在當今的計算機系統中,處理器的運行速度是非常快的,但 RAM 和磁盤並沒有質的飛躍(尤其是磁盤讀寫速度),這就導致了系統整體性能並沒有因爲處理器速度的提升而提升。於是就使用到了緩存技術(其實就是內存緩存的技術),通過緩存機制解決了處理器和磁盤直接速度的不平衡,其實就是我們前面內存中講到的頁高速緩存與頁寫回機制。
1.5 網絡
其實這塊就是要考慮你的服務網絡體系結構(網絡拓撲圖是否合理)、網絡帶寬、網絡基礎硬件設施等,確保能發揮最大的網絡性能。在這些基礎設施都優化完畢後,接着就是優化我們 Linux 系統中關於網絡的內核參數了,如收發數據緩衝區大小、傳輸窗口、網絡等待等相關參數。
二、性能分析工具
2.1 CPU 性能分析工具
2.1.1 vmstat
1、定義
vmstat 是 Virtual Memory Statistics(即虛擬內存統計)的縮寫,很多 Linux 發行版都默認安裝了此命令工具,用於監控系統性能和虛擬內存統計的命令。它提供了關於 CPU、內存、磁盤 I/O 和系統上下文切換等方面的信息。
2、語法
vmstat[選項][間隔時間][計數]
選項:vmstat 命令可以接受以下選項
-
-a:顯示所有的統計信息,包括內存、進程、磁盤、系統和 CPU。
-
-d:顯示磁盤 I/O 統計信息,包括每個磁盤設備的讀寫操作和等待時間。
-
-p:顯示每個分區的磁盤 I/O 統計信息。
-
-s:顯示內存使用的摘要信息,包括物理內存、虛擬內存、頁面交換等。
-
-m:顯示內存統計信息,包括活動、非活動、緩衝區和緩存內存的使用情況。
-
-t:在輸出的第一行顯示時間戳。
-
-n:顯示內核線程的統計信息。
間隔時間:可選參數,用於指定 vmstat 命令執行的時間間隔(以秒爲單位)。如果未指定間隔時間,默認值是 1 秒。
計數:可選參數,用於指定 vmstat 命令按照時間間隔時間執行的次數。如果未指定計數,默認情況下命令將持續運行直到手動中止(否則按照指定的次數結束統計)。
3、案例
不添加任何選項
vmstat
每 2s 輸出(採集)一次系統數據
vmstat 2
每 2s 輸出(採集)一次系統數據,共採集 5 次
vmstat 2 5
4、性能分析
上圖中字段輸出解釋:
procs:顯示隊列和等待狀態
-
r 列:表示運行隊列中的進程數,即當前正在運行的進程數。如果這個值長期大於系統 CPU 個數,說明 CPU 緊張,需進行 CPU 升級(即增加系統 CPU)。
-
b 列:表示在等待資源的進程數,即處於不可中斷(blocked)狀態的進程數,通常是等待 I/O、內存交換完成的進程數。
memory:顯示物理內存狀態
-
swpd 列:表示交換(swap)的虛擬內存使用量,表示從實際物理內存已經交換到交換空間的數據量,我這裏的值爲 0,因爲我壓根就沒有啓用 Swap Space。如果你啓用了交換空間,發現 swpd 列下的值很大,且 swap 字段下的 si、so 列的值長期爲 0,這也不會影響系統性能。
-
free 列:表示當前可用的空閒物理內存。
-
buff 列:Buffers Cache,表示內存緩衝區緩存的數據量,一般對塊設備的讀寫才需要緩衝(即通常用於文件 I/O 緩存)。
-
cache 列:Page Cache,表示內存的頁高速緩存的數據量,一般作爲文件系統的緩存(即通常用於文件系統緩存),頻繁訪問的文件都會被緩存,如果 cache 列的值比較大,說明頁緩存的文件數較多,如果此時 io 字段中的 bi 列的值較小,說明文件系統效率較好。
swap:顯示交換分區讀寫情況
-
si 列:表示每秒從磁盤(即交換空間)交換到內存的數據量(swap in)(單位 KB/s)。
-
so 列:表示每秒從內存交換到磁盤(即交換空間)的數據量(swap out)(單位 KB/s)。
說明:如果 si、so 長期不爲 0,那我們的 Linux 系統的物理內存資源肯能不足了。爲什麼呢?你想一想,根據內存的相關機制,我們知道長期不爲 0,說明數據頻繁地在物理內存和交換空間中交換數據,如:需要使用內存的進程會在內存中運行,然後內存會將不常用的文件數據交換到 Swap Space,這樣的話 si、so 值勢必是不會爲 0 的,而且會存在頻繁波動。
io:顯示磁盤讀寫情況
-
bi 列:表示每秒從塊設備(磁盤)讀取的塊數量(blocks in)(單位 KB/s)。
-
bo 列:表示每秒寫入塊設備(磁盤)的塊數量(blocks out)(單位 KB/s)。
說明:如果 bi + bo 的值大於 1000KB/s,且 wa 值較大,則表示系統磁盤 I/O 有瓶頸,應該提高磁盤的讀寫性能。
system:顯示採集間隔內發生的中斷數
-
in 列:每秒中斷的數量,包括時鐘中斷、網絡中斷等。
-
cs 列:每秒上下文切換的數量,包括進程切換和內核線程切換。
說明:如果這兩個值越大,說明內核消耗的 CPU 時間會越多。
cpu:顯示 CPU 的使用狀態
-
us 列:用戶空間佔用 CPU 時間的百分比。如果長期大於 50%,就需要考慮優化程序或算法。
-
sy 列:內核空間佔用 CPU 時間的百分比。如果 us + sy 長期大於 80%,說明 CPU 資源不足。
-
id 列:CPU 空閒時間的百分比。
-
wa 列:等待 I/O 完成的 CPU 時間的百分比。wa 越高說明 IO 等待越嚴重,一般如果 wa 超過 20%,說明 IO 等待嚴重(可能是因爲磁盤大量的隨機讀寫造成)。
-
st 列:用於虛擬機監控程序(hypervisor)的 CPU 時間的百分比(僅在虛擬化環境中可見),因爲我使用的就是虛擬機,所以我有這一列。
因此,對於 CPU 的性能瓶頸分析重點關注 procs 字段的 r 列和 CPU 字段的值。
2.1.2 mpstat
1、定義
mpstat 是 Multiprocessor Statistics(即多處理器統計),它用於顯示多核 CPU 系統中每個 CPU 核心的性能統計信息。這個命令可以幫助系統管理員監控和分析系統的 CPU 使用情況,尤其是在多核 CPU 的環境中。一般地,有些 Linux 發行版默認沒有安裝次工具,需我們手動安裝。
yum install -y sysstat
該命令與 vmstat 命令類似,mpstat 是通過 /proc/stat 裏面的狀態信息進行統計的,mpstat 的好處在於,它可以查看多核 CPU 中每個 CPU 計算核的統計數據的情況,而 vmstat 只能查看系統整體 CPU 的情況。
2、語法
mpstat [選項] [間隔時間] [計數]
-
選項:vmstat 命令可以接受以下選項
-
-P:指定要顯示的 CPU 核心號碼,例如 -P 0 表示只顯示 CPU 核心 0 的信息。如果未指定核心號碼,默認情況下會顯示所有核心的信息。
-
-I:指定要顯示的中斷統計信息。
-
間隔時間:可選參數,用於指定 vmstat 命令執行的時間間隔(以秒爲單位)。如果未指定間隔時間,默認值是 1 秒。
-
計數:可選參數,用於指定 vmstat 命令按照時間間隔時間執行的次數。如果未指定計數,默認情況下命令將持續運行直到手動中止(否則按照指定的次數結束統計)。
3、案例
不添加任何選項
mpstat
每 2s 輸出(採集)一次系統數據
mpstat 2
每 2s 輸出(採集)一次系統數據,共採集 5 次,並指定採集具體 CPU
mpstat -P 1 2 5
# 即採集CPU編號爲1的CPU狀態信息
4、性能分析
上圖中字段輸出解釋:
-
Linux 3.10.0-1160.el7.x86_64 (base):顯示操作系統版本和主機名。
-
10/08/2023:顯示當前日期。
-
x86_64:顯示系統架構(在此示例中爲 x86_64,表示 64 位系統)。
-
(2 CPU):顯示 CPU 核心數量,本例中有 2 個 CPU 核心。
-
07:41:22 AM:顯示統計信息的時間戳。
-
CPU:處理器的 ID 號,採集時不指定則默認爲系統整體 CPU 情況(all 表示系統整體 CPU 情況,其他如 CPU 0、CPU 1 等)。
-
%usr:用戶空間佔用 CPU 時間的百分比。
-
%nice:優先級較高的用戶空間佔用 CPU 時間的百分比。
-
%sys:內核空間佔用 CPU 時間的百分比。
-
%iowait:CPU 等待 I/O 操作完成的百分比。
-
%irq:CPU 處理硬件中斷的百分比。
-
%soft:CPU 處理軟件中斷的百分比。
-
%steal:CPU 被虛擬機監控程序(hypervisor)"偷取" 的百分比。
-
%guest:運行虛擬機中的操作系統時,CPU 花費在虛擬機中的百分比。
-
%gnice:虛擬機中運行的優先級較高的用戶空間佔用 CPU 時間的百分比。
-
%idle:CPU 空閒時間的百分比。
-
Average:平均值,如果指定了採集次數,系統爲自動爲我們計算出相關字段的平均值。
在實際開發中,可能有些不使用多線程體系結構的應用程序可能會運行在一個多核 CPU 的服務器上(比如 2 個 CPU),從而不使用所有處理器(而只使用其中一個 CPU),最終導致一個 CPU 過載,而另一個 CPU 空閒,此時通過 mpstat 命令就能很好地診斷這類問題(而此時 vmstat 去無法看出是哪個 CPU 過載,哪個 CPU 空閒),因此我們一般會將 vmstat 和 mpstat 配合使用。
2.1.3 uptime
uptime 命令用於顯示系統的當前運行時間以及平均負載信息。
uptime
輸出字段解釋:
-
15:56:28:這是當前的系統時間,顯示小時:分鐘:秒。
-
up 5:07:這是系統的運行時間。它表示系統自上次啓動以來已經運行了 5 小時 7 分鐘。
-
1 users:這是當前登錄到系統的用戶數量。
-
load average: 0.00, 0.01, 0.05:這是系統的平均負載信息,它提供了系統的負載狀態。平均負載是一個三個數字的列表,分別表示過去 1 分鐘、5 分鐘和 15 分鐘內的系統負載情況。負載是指等待 CPU 資源的進程數量,所以這三個負載值一般不要長期超過系統的 CPU 核數,否則負載較高,影響系統性能(但不是絕對的,偶爾大於系統 CPU 核數也是每問題的)。
在上圖這個例子中,負載就非常低,因爲它們接近於零(而我 CPU 核數是 2)。
2.2 內存性能分析工具
2.2.1 free
1、定義
free 命令用於顯示 Linux 系統上的內存使用情況。它提供了有關物理內存(RAM)和交換空間(swap)的信息,包括已使用、空閒、緩衝區和緩存內存等。
2、語法
free [選項]
選項:free 命令可以接受以下選項
-
-b:以字節(bytes)爲單位顯示內存使用情況。
-
-k:以千字節(kilobytes)爲單位顯示內存使用情況(缺省值)。
-
-m:以兆字節(megabytes)爲單位顯示內存使用情況。
-
-g:以吉字節(gigabytes)爲單位顯示內存使用情況。
-
-t:在輸出的末尾顯示總內存和總交換空間的彙總信息。
-
-h:人性化顯示 => 直觀。
3、案例
不添加任何選項
free
# 不帶參數時默認選項爲-k
人性化顯示
free -h
4、性能分析
上圖中字段輸出解釋:
-
total:物理內存的總量,包括實際可用內存和內核保留的內存。
-
used:已使用的物理內存量,包括用於進程和系統的內存。
-
free:空閒的物理內存量,尚未分配給任何進程。
-
shared:被共享的內存量,通常用於共享內存段的進程(如進程間通信機制)。
-
buff/cache:用於緩衝區和緩存的內存量。這包括 Linux 內核用於緩存文件系統數據的內存,以及用於文件 I/O 的內存緩衝區。
-
available:可用內存量,表示系統當前可供新進程使用的內存,包括緩衝區和緩存。
-
Mem:物理內存的相關信息,包括總內存空間、使用、剩餘等相關信息。
-
Swap:交換空間的信息,包括總交換空間、已使用的交換空間和空閒交換空間。
通常,total = used + free + buff/cache ,available 是在 buff/cache 基礎上減去 shared 和 buffer 內存損耗剩下的資源,因此查看服務器的內存資源是否充足,看 available 部分即可,一般地 20% < available < 70%,則系統內存資源基本能滿足應用需求,暫時不影響系統性能。
2.2.2 smem
1、定義
smem 是一個用於查看 Linux 系統中進程內存使用情況的工具。它提供了詳細的內存統計信息,包括物理內存、虛擬內存、共享內存、緩衝區和緩存等各種內存指標。smem 命令的功能比標準的 ps 或 top 命令更加詳細,可以幫助我們更好地瞭解各個進程佔用內存的情況。
該命令需要額外安裝,具體安裝方式如下:
yum install -y epel* # 需安裝擴展源(因爲本地軟件倉庫中沒有找到smem軟件包)或下載源碼進行編譯安裝
yum install -y smem
2、語法
smem [選項]
選項:smem 命令可以接受以下選項
-
-r:按照內存使用量的逆序(從高到低)排序顯示進程列表。
-
-u:以用戶模式顯示內存使用情況,按照用戶分類顯示內存使用情況。
-
-U:顯示虛擬內存(VIRT)的信息。
-
-P:顯示共享內存(SHR)的信息。
-
-c:顯示緩衝區的信息。
-
-C:顯示緩存的信息。
-
-k:指定按 KB 顯示。
-
-p:指定按百分比顯示。
-
-P:指定具體的進程。
-
-s:指定排序規則(如 -s uss,表示對 USS 列進行排序 - 默認爲升序)
默認情況下,smem 命令以物理內存(RES)的信息排序,並顯示前 10 個進程。
3、案例
不添加任何選項
smem
顯示內存單位並指定字段進行排序
smem -k -s uss
# 顯示每個進程佔用的系統內存大小
以百分比顯示並指定字段進行排序
smem -p -s uss
# 顯示每個進程佔用系統內存的百分比
查看每個用戶使用內存的情況
smem -u
查看指定進程使用系統內存的情況
smem -k -P dockerd
# 查看dockerd進程使用系統內存的情況
4、性能分析
上圖中字段輸出解釋:
-
PID:進程 ID。
-
User:進程所屬用戶。
-
Command:進程的命令行。
-
Swap:進程佔用的交換空間。
-
USS:唯一內存使用(Unique Set Size),表示進程獨佔的內存。
-
PSS:共享內存使用(Proportional Set Size),表示進程獨佔內存加上共享內存的平均值。
-
RSS:物理內存使用(Resident Set Size),表示進程當前實際佔用的物理內存。
因此,通過該命令可清楚地獲取每個進程佔用的內存資源,以此判斷這些進程是否異常,內存分配是否合理。
2.3 磁盤性能分析工具
2.3.1 iotop
1、定義
iotop 是一個 Linux 命令行工具,用於監視系統中磁盤 I/O 活動的實時信息。它可以幫助你查看哪些進程正在讀取或寫入磁盤,以及它們的磁盤 I/O 活動的相關信息。iotop 通常不會預裝在大多數 Linux 發行版中,所以我們需要先安裝它。
yum install -y iotop
2、語法
iotop [選項]
選項:
-
-o, --only:只顯示有磁盤 I/O 活動的進程。
-
-b, --batch:以批處理模式運行,直接顯示結果而不需要交互。
-
-n, --iter=<次數>:指定要顯示的迭代次數,然後退出。默認情況下,iotop 會持續顯示 I/O 活動,使用此選項可以設置顯示的次數。
-
-d, --delay=<秒>:設置更新間隔,即多長時間刷新一次顯示。默認情況下,每秒更新一次。
-
-p, --processes=<進程 ID>:只顯示指定進程 ID 的磁盤 I/O 活動。你可以指定多個進程 ID,用逗號分隔。
-
-u, --user=<用戶名>:只顯示指定用戶名的進程的磁盤 I/O 活動。
-
-P, --process=<進程名稱>:只顯示指定進程名稱的進程的磁盤 I/O 活動。
-
-a, --accumulated:顯示自 iotop 啓動以來的積累磁盤 I/O 活動,而不是瞬時值。
-
-q, --quiet:靜默模式,減少輸出信息,通常用於腳本。
-
-k:以千字節顯示(默認爲 B 字節顯示)。
-
-h, --help:顯示幫助信息。
3、案例
基礎交互操作
iotop
按鍵盤 O 鍵顯示當前有 I/O 輸出的進程
按鍵盤 < > 鍵進指定排序字段(默認基於 IO 字段來排序)
比如下圖我們選擇以 DISK READ 這一列來排序
按鍵盤 P 鍵進行進程 / 線程的切換(默認顯示的進程 PID 相關信息)
如下圖已經切換爲線程了(TID)
以千字節顯示
iotop -k
查看指定進程的 I/O 情況
iotop -k -p 1047
4、性能分析
上圖中字段輸出解釋:
-
TID:線程或進程的唯一標識符(Thread/Task ID),表示正在進行磁盤 I/O 操作的進程或線程的 ID。
-
PRIO:進程的優先級(Priority),通常用於指示進程的執行優先級。
-
USER:執行磁盤 I/O 操作的用戶的用戶名。
-
DISK READ:磁盤讀取速率,表示進程正在從磁盤讀取數據的速度。以字節 / 秒(Bytes per Second)爲單位顯示。
-
DISK WRITE:磁盤寫入速率,表示進程正在向磁盤寫入數據的速度。以字節 / 秒爲單位顯示。
-
SWAPIN:表示進程從交換空間中讀取數據的速率,通常用於虛擬內存操作。以字節 / 秒爲單位顯示。
-
IO>:磁盤 I/O 操作的總和,包括讀取和寫入。以百分比形式表示,表示磁盤 I/O 佔用的總帶寬。
-
COMMAND:正在進行磁盤 I/O 操作的進程或線程的命令名稱。
學會這幾個選項夠用了,使用 iotop 就可以隨時監控消耗 I/O 資源多的進程了,重點關注一下磁盤讀寫。
2.3.2 iostat
1、定義
iostat 命令是一個用於監視 Linux 系統中磁盤和 CPU 使用情況的命令行工具。它可以提供有關係統的磁盤 I/O 和 CPU 使用的詳細統計信息。iotop 通常不會預裝在大多數 Linux 發行版中,所以我們需要先安裝它。
yum install -y sysstat
2、語法
iostat [選項] [間隔時間] [次數]
選項:
-
-c:用於顯示 CPU 統計信息。
-
-d:用於顯示磁盤統計信息。
時間間隔:
- 2:表示 2 秒
次數:
- 5:輸出 5 組數據
3、案例
顯示 CPU 使用情況
iostat -c
# 這將顯示 CPU 使用情況的統計信息,包括用戶空間、內核空間、等待 I/O、空閒等百分比。
顯示磁盤 I/O 使用情況
iostat -d
# 這將顯示磁盤 I/O 使用情況的統計信息,包括每秒傳輸的 I/O 操作次數、每秒讀取和寫入的數據量等。
指定間隔時間和次數
iostat -c 2 5
4、性能分析
上圖中字段輸出解釋:
-
Device:磁盤設備的名稱,表示正在監視的磁盤或分區。
-
tps:每秒傳輸的 I/O 操作次數(Total I/O Transactions Per Second)。這個值表示每秒完成的讀取和寫入磁盤的總操作數。
-
kB_read/s:每秒從磁盤讀取的數據量(Kilobytes Read Per Second)。這個值表示每秒從磁盤讀取的數據量,以千字節(KB)爲單位。
-
kB_wrtn/s:每秒寫入磁盤的數據量(Kilobytes Written Per Second)。這個值表示每秒寫入磁盤的數據量,以千字節(KB)爲單位。
-
kB_read:自系統啓動以來從磁盤讀取的總數據量(Kilobytes Read)。這個值表示自系統啓動以來累積的總讀取數據量,以千字節(KB)爲單位。
-
kB_wrtn:自系統啓動以來寫入磁盤的總數據量(Kilobytes Written)。這個值表示自系統啓動以來累積的總寫入數據量,以千字節(KB)爲單位。
通過 kB_read/s、kB_wrtn/s 就可判斷磁盤讀寫性能及磁盤讀寫是否頻繁的問題。如果 kB_wrtn/s 很大,說明磁盤寫操作很頻繁,可考慮磁盤或程序優化;如果 kB_read/s 很大,說明程序對磁盤的讀操作較頻繁,可考慮將讀取的數據放入內存中操作,提高讀性能。
2.4 網絡性能分析工具
2.4.1 ping
1、定義
ping 命令是一個用於測試網絡連接的常見命令行工具,通常用於檢查目標主機是否可達以及測量網絡往返時間(RTT)。
2、語法
ping [選項] 目標主機
選項:
-
-c:用於指定發送的 ICMP 報文數量。
-
-i:用於設置報文發送的時間間隔。
-
-s:用於設置發送的數據包大小等。
3、案例
基本測試
ping www.baidu.com
這會向 www.baidu.com 發送 ICMP 報文,測試是否能夠到達目標主機。ping 將連續發送報文,直到你手動中斷測試。
指定發送報文數量
ping -c 5 www.baidu.com
這會向 www.baidu.com 發送 5 個 ICMP 報文,然後停止測試。你可以更改數字來指定發送的報文數量。
4、性能分析
上圖中字段輸出解釋:
-
PING:這是 ping 命令的第一行,顯示正在執行的 ping 命令以及目標主機的 IP 地址或主機名。
-
bytes:每個 ICMP 報文的大小,通常默認爲 64 字節。
-
icmp_seq:ICMP 報文的序列號,從 0 開始遞增。
-
ttl:生存時間(Time to Live),表示報文在網絡上能夠存活的跳數(路由器數量)。
-
time:每個 ICMP 報文的往返時間(Round-Trip Time,RTT),以毫秒爲單位。這是從發送 ICMP 報文到接收響應所經過的時間。
-
--- www.a.shifen.com ping statistics ---:表示一個 ICMP 報文的往返時間統計結束並顯示 ping 統計信息的標題。
-
packets transmitted:發送的 ICMP 報文數量,表示發送的次數。
-
packets received:接收的 ICMP 響應報文數量,表示成功收到的次數。
-
packet loss:丟失的 ICMP 報文數量,表示未收到響應的次數,通常以百分比形式顯示。
-
time:用於顯示 RTT 的統計信息,通常包括最小、最大和平均 RTT 時間。
這裏重點關注 packet loss,如果該值越大,說明丟包嚴重,表明源與目的之間的網絡延時很大,此時就需要檢查你的本地網絡。
2.4.2 traceroute
1、定義
traceroute 是一個用於追蹤數據包從源到目標的網絡路徑的命令行工具。它在 Linux 和類似的操作系統上常用於診斷網絡問題,查找數據包在網絡中的路由路徑,以及確定網絡延遲的來源。traceroute 通常不會預裝在大多數 Linux 發行版中,所以我們需要先安裝它。
yum install -y traceroute
2、語法
traceroute [選項] 目標主機
選項:
-
-n:用於禁用域名解析。
-
-q:用於指定發送數據包的數量。
-
-w:用於設置超時。
通過該命令,你可以查看數據包從發出到響應經歷的路由節點數,以及每個節點之間的網絡延時情況,從而判斷在整條通信鏈路中是那個節點網絡出問題。
2.4.3 mtr
1、語法
mtr(My Traceroute)是一個網絡診斷工具,結合了 traceroute 和 ping 的功能,用於追蹤網絡路徑和測量網絡往返時間(RTT)。mtr 不僅可以顯示路由路徑,還能實時監控網絡路徑中每個跳的性能指標。mtr 通常不會預裝在大多數 Linux 發行版中,所以我們需要先安裝它。
yum install -y mtr
2、語法
mtr [選項] 目標主機
選項:
-
-n:用於禁用域名解析。
-
-c:用於指定發送數據包的次數。
-
-i:用於設置報文發送的時間間隔。
3、案例
基本 mtr 測試
mtr www.baidu.com
這會啓動 mtr 並追蹤到達 www.baidu.com 的網絡路徑,並實時顯示每個路由器的 IP 地址、主機名、以及每個路由器的 RTT 時間。
4、性能分析
上圖中字段輸出解釋:
-
Host:顯示路由路徑上每個跳的主機名或 IP 地址,其中最後一行顯示了目標主機(在本例中是 14.119.104.254)。
-
Loss%:損失率,表示到達每個跳的數據包丟失的百分比。在這個例子中,192.168.* 跳的損失率都是 0%,這意味着我本地沒有數據包丟失,我本地網絡正常,而中間網絡就存在丟包了,說明中間路由網絡是有延遲的。
-
Snt:發送的數據包數量,表示發送給每個跳的數據包總數。
-
Last:最後一個數據包的往返時間(RTT),以毫秒爲單位。這是從源主機到達每個跳的最後一個數據包的時間。
-
Avg:平均往返時間,以毫秒爲單位。這是從源主機到達每個跳的所有數據包的平均時間。
-
Best:最短往返時間,以毫秒爲單位。這是從源主機到達每個跳的最快數據包的時間。
-
Wrst:最長往返時間,以毫秒爲單位。這是從源主機到達每個跳的最慢數據包的時間。
-
StDev:往返時間的標準差,以毫秒爲單位。它表示 RTT 變化的程度,越小越好。
因此,通過 mtr 我們可以很明顯的感知我們網絡性能的問題,依次來分析我們本地網絡訪問外部網絡慢的原因。通常網絡出問題我們都會使用 ping 命令,但是該命令只是簡單的網絡連通性測試,卻無法確定網絡是在哪裏出了問題,此時就會使用 traceroute 來查看數據包途徑路由,或使用 nslookup 來查看 DNS 解析狀態是否正常。而我們的 mtr 命令正好集成了這三個命令的功能,從而實現了我們的需求。
一般情況下 mtr 前幾跳都是本地 ISP,後幾跳屬於服務商(如本次案例的百度),中間跳數則是中間網絡互聯節點,如果前幾跳異常,需聯繫本地 ISP,如果後幾跳出現問題,則需聯繫服務商(百度),如果中間幾跳出現問題,則兩邊都無完全解決問題。
2.5 系統性能綜合分析工具
2.5.1 top
1、定義
top 命令是一個用於實時監視 Linux 系統中進程的命令行工具,它提供了有關係統性能和進程活動的實時信息。top 可以幫助我們監視系統資源的使用情況,識別性能問題,並查看正在運行的進程的相關信息。
2、語法
top
top 命令沒有參數,直接運行它將顯示實時的系統性能信息和進程列表。默認情況下,top 會按 CPU 利用率降序排列進程。
3、案例
這裏就不過多解釋,其實我們前面已經說過了,所謂綜合分析工具,就是該工具能幫我們查看 Linux 系統 CPU、內存、負載等很多數據。讓我們可整體掌握服務器的資源使用情況,便於做進一步優化。
2.5.2 htop
1、定義
htop 可看成是 top 的一個升級版,相比傳統的 top,htop 更加人性化,它可讓用戶交互式操作,支持顏色主題、鼠標操作等多種操作。htop 通常不會預裝在大多數 Linux 發行版中,所以我們需要先安裝它。
um install -y epel*
yum install -y htop
2、語法
htop
# 想要查看那個區的具體指標,鼠標點點點即可
如何自定義顯示字段?
- 設置(F2)
- 選擇 Columns 字段,並按照下圖添加即可,最右邊的列爲可選列
- 此時你會發現已經添加完成了
3、分析
上圖可分爲 5 大區:
- CPU 狀態區
展示每個每個 CPU 邏輯核的使用百分比,並通過不同顏色條進行區分,藍色表示 low-prority 使用,綠色表示 normal 使用情況,紅色表示 Kernel 使用情況,青色表示 vistualiz 使用情況,上圖案例中共有 2 個邏輯核。、
- 內存狀態區
展示物理內存和 Swap Space 的狀態,同樣也使用不同的顏色條來區分,其中綠色表示已使用內存情況,藍色表示用於緩衝的內存情況,黃色表示用於緩存的內存情況。
- 整體狀態區
Task 表示當前系統進程總數和當前正在運行的進程數;
Load average 表示過去 1、5、15 分鐘的系統平均負載;
Uptime 表示系統運行時長。
- 進程狀態區
PID:進程 ID(Process ID),表示每個正在運行的進程的唯一標識符。
USER:進程的所有者(用戶),顯示啓動進程的用戶帳戶。
PRI:進程的優先級(Priority),通常是一個負整數。較低的數值表示更高的優先級。
NI:進程的 Nice 值(Nice Value),用於調整進程的優先級。負值表示較高的優先級,正值表示較低的優先級。
VIRT:虛擬內存大小(Virtual Memory),表示進程已分配但未必使用的虛擬內存大小,以千字節(KB)爲單位。
RES:常駐內存大小(Resident Set Size),表示進程實際佔用的物理內存大小,以千字節(KB)爲單位。
SHR:共享內存大小(Shared Memory),表示多個進程之間共享的內存大小,以千字節(KB)爲單位。
S:進程的狀態,可以是以下之一:
-
R:運行中(Running)
-
S:睡眠中(Sleeping)
-
D:不可中斷的休眠狀態(Uninterruptible Sleep)
-
Z:殭屍進程(Zombie)
-
T:已停止(Stopped)
-
t:跟蹤 / 停止(Tracing/Stopped)
-
W:等待內存交換(Paging)
-
X:死掉(Dead)
-
K:內核線程(Kernel Thread)
%CPU:進程的 CPU 利用率,表示進程使用 CPU 的百分比。
%MEM:進程的內存使用率,表示進程使用系統內存的百分比。
TIME+:進程已運行的累計 CPU 時間,以小時: 分鐘: 秒的格式表示。
COMMAND:進程的命令名稱,顯示啓動進程的完整命令。
這些字段提供了關於系統中運行的進程和它們使用的系統資源的詳細信息。你可以使用 htop 的交互式命令來對進程列表進行篩選、排序和管理,以及查看更多信息,如線程和性能圖表。htop 提供了更多的功能和用戶友好的界面,相對於標準的 top 命令,使其成爲了一個強大的系統監視和管理工具。
總結
性能分析工具其實還有很多,以上只是一些常用的分析工具,其實會使用一兩個工具已經夠用了,我們重點是要能夠通過數據分析這些性能的瓶頸,而分析的前提就是你得知道這些性能指標能對 Linux 系統產生哪些影響(如 CPU、內存、磁盤 I/O、網絡等)。
CPU 性能瓶頸分析
-
若只想查看整體 CPU 的使用情況,可使用 vmstat;
-
若想查看具體 CPU 的使用情況,可使用 mpstat。
內存性能分析
-
若只想查看 Linux 系統內存的整體使用情況,可使用 free;
-
若想查看具體進程佔用的具體內存情況,可使用 seme。
磁盤性能分析
-
若只想查看 Linux 系統磁盤的整體 I/O 情況,可使用 iostat;
-
若想查看具體進程具體的對磁盤 I/O 情況,可使用 iotop。
網絡性能分析
-
若只是簡單的網絡連通性測試,可使用 ping;
-
若想查看具體的網絡性能(如經歷的各個路由、延遲等),可使用 mtr。
系統綜合分析
-
若想整體掌握系統性能通過 top 即可;
-
若想更深入地查看系統中具體的進程對系統資源的佔用,可使用 htop。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/uORu-mIoKLa0Qjb9bu65Zw