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 時間。通常,掛起狀態是爲了釋放資源或優化系統性能。

進程狀態之間的轉換通常如下:

進程狀態的管理和調度是操作系統的重要任務之一,以確保資源的有效分配和進程的合理執行順序。不同的操作系統和調度算法可能會有不同的狀態管理方式和規則。

1.1.3 進程優先級

首先要清楚,Linux 是一個多用戶多任務的操作系統,如何理解多用戶和多任務?

多用戶

多任務

那在隊列中的這些任務誰先會被 CPU 執行呢?是隨機的嗎?於是這裏就涉及到了進程優先級與 nice 值的相關概念了。在操作系統中,通常存在兩種類型的進程優先級:動態優先級和靜態優先級。這兩種優先級概念用於進程調度和資源分配,但它們有不同的性質和影響。

靜態優先級(Static Priority):

動態優先級(Dynamic Priority):

那 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)是計算機科學中相關但不同的概念,它們之間存在緊密的關係:

1.1.5 進程與進程間的關係

在操作系統中,不同進程之間可以有多種關係和交互方式。以下是一些常見的進程之間的關係:

父子進程關係:在某些操作系統中,一個進程可以創建其他進程(通過 fork() 系統調用來創建),這些創建的進程被稱爲子進程,而創建它們的進程稱爲父進程。子進程通常繼承父進程的一些屬性,如文件描述符、環境變量等。父子進程之間可以通過進程間通信機制來交換數據和信息。

父子進程中又會涉及到殭屍進程和孤兒進程的概念:

殭屍進程是指一個子進程在執行完畢後,但其父進程尚未通過系統調用(通常是 wait() 或 waitpid())來獲取子進程的終止狀態信息。因爲操作系統需要保留子進程的一些信息(如退出狀態碼),直到父進程請求這些信息,所以這個子進程被稱爲 "殭屍"。殭屍進程不佔用系統資源,但在系統中存在時,會佔用進程號(PID)等資源。

解決殭屍進程的常見方法是父進程調用 wait() 或 waitpid() 等系統調用,來獲取子進程的退出狀態信息,然後將殭屍進程徹底清理掉。如果父進程沒有正確處理子進程的退出狀態,就會導致殭屍進程的堆積,最終可能會耗盡系統的進程號資源。

一句話:殭屍進程是子進程在終止後父進程未處理其退出狀態信息的情況,需要父進程調用 wait() 或 waitpid() 來清理。

孤兒進程是指一個子進程的父進程在子進程終止後,自己提前退出或異常終止,導致子進程失去了父進程。這時候,孤兒進程會被操作系統的 init 進程(通常具有 PID 1)接管。init 進程會成爲孤兒進程的新父進程,負責收養和管理它們。

孤兒進程的存在是爲了確保進程不會變成殭屍進程。因爲 init 進程會定期檢查並處理它的子進程,一旦孤兒進程終止,init 進程會及時回收它的資源,包括終止狀態信息,從而避免了殭屍進程的問題。

一句話:孤兒進程是子進程的父進程提前終止,導致子進程失去了父進程。這些子進程會被操作系統的 init 進程接管,以避免它們變成殭屍進程。

如果父進程在子進程

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 級別:

  1. RAID 0:RAID 0 也稱爲條帶化(striping)陣列,它將數據塊分成多個條帶並將這些條帶分散存儲在多個硬盤上。RAID 0 提供了更高的性能,因爲數據可以並行讀取和寫入多個驅動器。然而,RAID 0 沒有冗餘,如果一個驅動器故障,所有數據都會丟失。因此,如果你的程序讀寫數據頻繁、且對數據安全性一般的話,就可採用 RAID 0

  2. RAID 1:RAID 1 是鏡像(mirroring)陣列,它將相同的數據複製到兩個或更多硬盤上。因此 RAID 1 提供了數據冗餘,如果一個驅動器故障,數據仍然可用。RAID 1 通常用於重要數據的備份。RAID 1 需要至少兩個硬盤驅動器。

  3. RAID 5:RAID 5 使用條帶化和奇偶校驗來提供數據冗餘和性能。數據被分成多個條帶,並且奇偶校驗信息分佈在不同的驅動器上。如果一個驅動器故障,可以通過奇偶校驗信息恢復數據。RAID 5 需要至少三個硬盤驅動器。

  4. RAID 6:RAID 6 類似於 RAID 5,但提供更高級別的冗餘。它使用兩組奇偶校驗信息來保護數據,因此可以容忍兩個驅動器的故障。RAID 6 需要至少四個硬盤驅動器。

  5. 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。以下是磁盤和扇區之間的關係的要點:

  1. 硬盤驅動器:硬盤驅動器是計算機中的存儲設備,它包含一個或多個磁盤盤片。這些盤片上有一個或多個磁性塗層,用於存儲數據。

  2. 磁道:磁盤表面被劃分爲一個個同心圓環,每個環被稱爲一個磁道(track)。數據通常存儲在這些磁道上。

  3. 扇區:每個磁道被分爲若干個扇區(sector),扇區是存儲數據的最小物理單位。通常,每個扇區的大小爲 512 字節或 4K 字節。

  4. 磁頭:硬盤驅動器上有多個讀 / 寫頭,它們位於磁盤的頂部和底部,用於讀取和寫入數據。磁頭可以移動到不同的磁道上,以讀取或寫入數據。

  5. 柱面:柱面(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 命令可以接受以下選項

間隔時間:可選參數,用於指定 vmstat 命令執行的時間間隔(以秒爲單位)。如果未指定間隔時間,默認值是 1 秒。

計數:可選參數,用於指定 vmstat 命令按照時間間隔時間執行的次數。如果未指定計數,默認情況下命令將持續運行直到手動中止(否則按照指定的次數結束統計)。

3、案例

不添加任何選項

vmstat

每 2s 輸出(採集)一次系統數據

vmstat 2

每 2s 輸出(採集)一次系統數據,共採集 5 次

vmstat 2 5

4、性能分析

上圖中字段輸出解釋:

procs:顯示隊列和等待狀態

memory:顯示物理內存狀態

swap:顯示交換分區讀寫情況

說明:如果 si、so 長期不爲 0,那我們的 Linux 系統的物理內存資源肯能不足了。爲什麼呢?你想一想,根據內存的相關機制,我們知道長期不爲 0,說明數據頻繁地在物理內存和交換空間中交換數據,如:需要使用內存的進程會在內存中運行,然後內存會將不常用的文件數據交換到 Swap Space,這樣的話 si、so 值勢必是不會爲 0 的,而且會存在頻繁波動。

io:顯示磁盤讀寫情況

說明:如果 bi + bo 的值大於 1000KB/s,且 wa 值較大,則表示系統磁盤 I/O 有瓶頸,應該提高磁盤的讀寫性能。

system:顯示採集間隔內發生的中斷數

說明:如果這兩個值越大,說明內核消耗的 CPU 時間會越多。

cpu:顯示 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 [選項] [間隔時間] [計數]

3、案例

不添加任何選項

mpstat

每 2s 輸出(採集)一次系統數據

mpstat 2

每 2s 輸出(採集)一次系統數據,共採集 5 次,並指定採集具體 CPU

mpstat -P 1 2 5

# 即採集CPU編號爲1的CPU狀態信息

4、性能分析

上圖中字段輸出解釋:

在實際開發中,可能有些不使用多線程體系結構的應用程序可能會運行在一個多核 CPU 的服務器上(比如 2 個 CPU),從而不使用所有處理器(而只使用其中一個 CPU),最終導致一個 CPU 過載,而另一個 CPU 空閒,此時通過 mpstat 命令就能很好地診斷這類問題(而此時 vmstat 去無法看出是哪個 CPU 過載,哪個 CPU 空閒),因此我們一般會將 vmstat 和 mpstat 配合使用。

2.1.3 uptime

uptime 命令用於顯示系統的當前運行時間以及平均負載信息。

uptime

輸出字段解釋:

在上圖這個例子中,負載就非常低,因爲它們接近於零(而我 CPU 核數是 2)。

2.2 內存性能分析工具

2.2.1 free

1、定義

free 命令用於顯示 Linux 系統上的內存使用情況。它提供了有關物理內存(RAM)和交換空間(swap)的信息,包括已使用、空閒、緩衝區和緩存內存等。

2、語法

free [選項]

選項:free 命令可以接受以下選項

3、案例

不添加任何選項

free 
# 不帶參數時默認選項爲-k

人性化顯示

free -h

4、性能分析

上圖中字段輸出解釋:

通常,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 命令可以接受以下選項

默認情況下,smem 命令以物理內存(RES)的信息排序,並顯示前 10 個進程。

3、案例

不添加任何選項

smem

顯示內存單位並指定字段進行排序

smem -k -s uss

# 顯示每個進程佔用的系統內存大小

以百分比顯示並指定字段進行排序

smem -p -s uss

# 顯示每個進程佔用系統內存的百分比

查看每個用戶使用內存的情況

smem -u

查看指定進程使用系統內存的情況

smem -k -P dockerd

# 查看dockerd進程使用系統內存的情況

4、性能分析

上圖中字段輸出解釋:

因此,通過該命令可清楚地獲取每個進程佔用的內存資源,以此判斷這些進程是否異常,內存分配是否合理。

2.3 磁盤性能分析工具

2.3.1 iotop

1、定義

iotop 是一個 Linux 命令行工具,用於監視系統中磁盤 I/O 活動的實時信息。它可以幫助你查看哪些進程正在讀取或寫入磁盤,以及它們的磁盤 I/O 活動的相關信息。iotop 通常不會預裝在大多數 Linux 發行版中,所以我們需要先安裝它。

yum install -y iotop

2、語法

iotop [選項]

選項:

3、案例

基礎交互操作

iotop

按鍵盤 O 鍵顯示當前有 I/O 輸出的進程

按鍵盤 < > 鍵進指定排序字段(默認基於 IO 字段來排序)

比如下圖我們選擇以 DISK READ 這一列來排序

按鍵盤 P 鍵進行進程 / 線程的切換(默認顯示的進程 PID 相關信息)

如下圖已經切換爲線程了(TID)

以千字節顯示

iotop -k

查看指定進程的 I/O 情況

iotop -k -p 1047

4、性能分析

上圖中字段輸出解釋:

學會這幾個選項夠用了,使用 iotop 就可以隨時監控消耗 I/O 資源多的進程了,重點關注一下磁盤讀寫。

2.3.2 iostat

1、定義

iostat 命令是一個用於監視 Linux 系統中磁盤和 CPU 使用情況的命令行工具。它可以提供有關係統的磁盤 I/O 和 CPU 使用的詳細統計信息。iotop 通常不會預裝在大多數 Linux 發行版中,所以我們需要先安裝它。

yum install -y sysstat

2、語法

iostat [選項] [間隔時間] [次數]

選項:

時間間隔:

次數:

3、案例

顯示 CPU 使用情況

iostat -c

# 這將顯示 CPU 使用情況的統計信息,包括用戶空間、內核空間、等待 I/O、空閒等百分比。

顯示磁盤 I/O 使用情況

iostat -d

# 這將顯示磁盤 I/O 使用情況的統計信息,包括每秒傳輸的 I/O 操作次數、每秒讀取和寫入的數據量等。

指定間隔時間和次數

iostat -c 2 5

4、性能分析

上圖中字段輸出解釋:

通過 kB_read/s、kB_wrtn/s 就可判斷磁盤讀寫性能及磁盤讀寫是否頻繁的問題。如果 kB_wrtn/s 很大,說明磁盤寫操作很頻繁,可考慮磁盤或程序優化;如果 kB_read/s 很大,說明程序對磁盤的讀操作較頻繁,可考慮將讀取的數據放入內存中操作,提高讀性能。

2.4 網絡性能分析工具

2.4.1 ping

1、定義

ping 命令是一個用於測試網絡連接的常見命令行工具,通常用於檢查目標主機是否可達以及測量網絡往返時間(RTT)。

2、語法

ping [選項] 目標主機

選項:

3、案例

基本測試

ping www.baidu.com

這會向 www.baidu.com 發送 ICMP 報文,測試是否能夠到達目標主機。ping 將連續發送報文,直到你手動中斷測試。

指定發送報文數量

ping -c 5 www.baidu.com

這會向 www.baidu.com 發送 5 個 ICMP 報文,然後停止測試。你可以更改數字來指定發送的報文數量。

4、性能分析

上圖中字段輸出解釋:

這裏重點關注 packet loss,如果該值越大,說明丟包嚴重,表明源與目的之間的網絡延時很大,此時就需要檢查你的本地網絡。

2.4.2 traceroute

1、定義

traceroute 是一個用於追蹤數據包從源到目標的網絡路徑的命令行工具。它在 Linux 和類似的操作系統上常用於診斷網絡問題,查找數據包在網絡中的路由路徑,以及確定網絡延遲的來源。traceroute 通常不會預裝在大多數 Linux 發行版中,所以我們需要先安裝它。

yum install -y traceroute

2、語法

traceroute [選項] 目標主機

選項:

通過該命令,你可以查看數據包從發出到響應經歷的路由節點數,以及每個節點之間的網絡延時情況,從而判斷在整條通信鏈路中是那個節點網絡出問題。

2.4.3 mtr

1、語法

mtr(My Traceroute)是一個網絡診斷工具,結合了 traceroute 和 ping 的功能,用於追蹤網絡路徑和測量網絡往返時間(RTT)。mtr 不僅可以顯示路由路徑,還能實時監控網絡路徑中每個跳的性能指標。mtr 通常不會預裝在大多數 Linux 發行版中,所以我們需要先安裝它。

yum install -y mtr

2、語法

mtr [選項] 目標主機

選項:

3、案例

基本 mtr 測試

mtr www.baidu.com

這會啓動 mtr 並追蹤到達 www.baidu.com 的網絡路徑,並實時顯示每個路由器的 IP 地址、主機名、以及每個路由器的 RTT 時間。

4、性能分析

上圖中字段輸出解釋:

因此,通過 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

# 想要查看那個區的具體指標,鼠標點點點即可

如何自定義顯示字段?

3、分析

上圖可分爲 5 大區:

展示每個每個 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:進程的狀態,可以是以下之一:

%CPU:進程的 CPU 利用率,表示進程使用 CPU 的百分比。

%MEM:進程的內存使用率,表示進程使用系統內存的百分比。

TIME+:進程已運行的累計 CPU 時間,以小時: 分鐘: 秒的格式表示。

COMMAND:進程的命令名稱,顯示啓動進程的完整命令。

這些字段提供了關於系統中運行的進程和它們使用的系統資源的詳細信息。你可以使用 htop 的交互式命令來對進程列表進行篩選、排序和管理,以及查看更多信息,如線程和性能圖表。htop 提供了更多的功能和用戶友好的界面,相對於標準的 top 命令,使其成爲了一個強大的系統監視和管理工具。

總結

性能分析工具其實還有很多,以上只是一些常用的分析工具,其實會使用一兩個工具已經夠用了,我們重點是要能夠通過數據分析這些性能的瓶頸,而分析的前提就是你得知道這些性能指標能對 Linux 系統產生哪些影響(如 CPU、內存、磁盤 I/O、網絡等)。

CPU 性能瓶頸分析

內存性能分析

磁盤性能分析

網絡性能分析

系統綜合分析

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/uORu-mIoKLa0Qjb9bu65Zw