性能監控——vmstat
? 性能監控是對 IT 系統運行效率和有效性的系統觀察和測量。它涉及收集、分析和報告各種組件(包括應用程序、網絡、服務器和數據庫)的關鍵性能指標 (KPI)。此過程使用專門的工具來跟蹤響應時間、吞吐量、資源利用率和錯誤率等指標。性能監控有助于識別瓶頸、預測潛在問題和優化系統資源。它對于維護服務水平協議 (SLA)、確保用戶滿意度和支持容量規劃至關重要。在現代 IT 環境中,性能監控通常結合實時分析、AI 驅動的洞察和自動警報系統,從而實現對復雜分布式系統的主動管理,并支持 IT 運營和服務交付的持續改進。
vmstat:該命令( virtual memory statistics的縮寫)是 Linux 中內置的監控實用程序。該命令用于獲取有關內存、系統進程、分頁、中斷、塊 I/O、磁盤和 CPU 調度的信息。用戶可以通過指定采樣周期來實時觀察系統活動。
vmstat命令是系統監控工具sysstat的一部分,可生成[PU 和設備統計信息和報告。vmstat的安裝
yum install sysstat
一、vmstat命令語法
基本vmstat
語法是:
vmstat [option] [delay[count]]
options:用于定制輸出的各種開關
delay:定義輸出更新之間的時間間隔
count:指定延遲間隔后輸出更新的次數,如果未設置count,則默認值為infinite
options | 解釋 |
---|---|
-a | 顯示活躍和非活躍內存。這有助于你了解系統中內存的使用狀態,哪些內存正在被頻繁使用(活躍內存),哪些內存處于相對空閑狀態(非活躍內存)。 |
-f | 輸出從系統啟動至今的 fork 次數。fork 是創建新進程的一種方式,此信息可讓你了解系統創建進程的總體情況。 |
-m | 顯示 slab 信息。slab 是 Linux 內核中用于管理內存分配的數據結構,該參數能幫助你了解內核內存分配的詳細情況。 |
-n | 僅在開始時顯示一次各字段名稱,后續持續輸出信息時不再重復顯示字段名,使輸出更簡潔。 |
-s | 以表格形式輸出內存和交換空間的統計信息,涵蓋了多種內存相關的統計數據,如總內存、空閑內存、已使用內存、交換空間使用情況等。 |
-d | 顯示磁盤的統計信息,包括磁盤的讀寫次數、讀寫扇區數、讀寫時間等,可用于監控磁盤的 I/O 性能。 |
-D | 顯示磁盤的詳細統計信息,包括每個磁盤設備的 I/O 操作情況,如讀請求、寫請求、合并的讀請求、合并的寫請求、讀扇區數、寫扇區數等 |
-p | 后面需跟磁盤分區名,用于顯示指定磁盤分區的統計信息,幫助你針對性地了解某個磁盤分區的 I/O 情況。 |
-S | 用于指定輸出信息中內存、I/O 等數據的單位,可取值為 k (千字節)、m (兆字節)等。例如,vmstat -S m 會以兆字節為單位顯示內存和 I/O 數據。 |
-t | 在輸出信息中添加時間戳,方便你關聯不同時間點的系統狀態信息。 |
-V | 顯示版本信息 |
man vmstat | 在終端顯示用戶手冊 |
二、基本vmstat輸出字段解釋
[root@Rocky ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 521468 4204 637204 0 0 23 3 100 208 0 1 99 0 0
各字段含義如下:
- procs:進程統計
- r:運行隊列中的進程數。即等待 CPU 時間片的進程數量。如果這個數字持續高于系統的 CPU 核心數,說明系統的 CPU 資源比較緊張,可能存在性能瓶頸。
- b:處于不可中斷睡眠狀態的進程數。通常是進程正在等待 I/O 操作完成,比如等待磁盤讀寫、網絡數據接收等。如果該值長期不為 0 且較大,可能表示系統存在 I/O 性能問題。
- memory:內存統計
- swpd:已使用的交換空間大小,單位是 KB。交換空間是磁盤上的一塊區域,當物理內存不足時,系統會將一部分內存數據交換到交換空間中。如果這個值不斷增大,說明系統的物理內存可能不夠用,需要關注系統內存使用情況。
- free:空閑的物理內存大小,單位為 KB。這是系統當前未被使用的內存量,可以直接反映出系統內存的剩余可用資源。
- buff:用于塊設備的緩沖區內存大小,單位為 KB。緩沖區主要用于緩存磁盤塊數據,以提高磁盤 I/O 的性能。當系統讀取或寫入磁盤數據時,數據會先在緩沖區中進行緩存,以便后續再次訪問時可以直接從緩沖區中獲取,減少實際的磁盤 I/O 操作。
- cache:用于文件系統的緩存內存大小,單位為 KB。文件系統緩存主要用于存儲最近訪問過的文件數據和元數據。與緩沖區不同,它更側重于文件層面的緩存,而不是磁盤塊層面。通過文件系統緩存,可以加速文件的讀取操作,提高系統的整體性能。
- swap:交換空間統計
- si:從磁盤交換到內存的交換頁數量,單位為 KB/s。表示每秒從交換空間(磁盤)換入到物理內存的數據量。如果這個值較大,說明系統頻繁地從交換空間讀取數據,可能是物理內存不足,導致系統不得不使用交換空間來滿足內存需求。
- so:從內存交換到磁盤的交換頁數量,單位為 KB/s。表示每秒從物理內存換出到交換空間(磁盤)的數據量。同樣,如果該值較大,也說明系統內存緊張,需要將部分內存數據交換到磁盤上以騰出物理內存空間。
- io:輸入/輸出統計
- bi:從塊設備(如磁盤)讀取的塊數量,單位為塊 /s。這個數值反映了系統對磁盤等塊設備的讀操作頻率和數據量。通過觀察該值,可以了解系統的磁盤讀負載情況。
- bo:寫入到塊設備的塊數量,單位為塊 /s。它體現了系統對磁盤等塊設備的寫操作頻率和數據量,用于評估磁盤的寫負載。如果
bi
和bo
的值同時較高,說明系統的磁盤 I/O 活動比較頻繁,可能存在 I/O 性能問題。
- system:系統調度
- in:每秒的中斷次數,包括時鐘中斷、硬件中斷等。中斷是計算機系統中用于處理異步事件的機制,例如硬件設備完成數據傳輸、定時器到期等都會產生中斷。如果
in
的值過高,可能表示硬件設備頻繁產生中斷,這會消耗 CPU 資源,影響系統性能。 - cs:每秒的上下文切換次數。上下文切換是指 CPU 從一個進程或線程切換到另一個進程或線程時需要保存和恢復的相關狀態信息,包括寄存器值、程序計數器等。頻繁的上下文切換會消耗 CPU 時間,降低系統的整體性能。如果
cs
的值很大,說明系統中的進程或線程切換比較頻繁,可能需要進一步分析原因,例如是否存在過多的進程或線程競爭資源。
- in:每秒的中斷次數,包括時鐘中斷、硬件中斷等。中斷是計算機系統中用于處理異步事件的機制,例如硬件設備完成數據傳輸、定時器到期等都會產生中斷。如果
- cpu:cpu統計信息,以百分比形式展示
- us:用戶空間進程使用 CPU 的時間百分比。即運行在用戶態的應用程序、進程等使用 CPU 的時間占總 CPU 時間的比例。如果該值較高,說明用戶程序消耗了較多的 CPU 資源,可能是某個或某些應用程序存在性能問題,需要進一步分析優化。
- sy:內核空間進程使用 CPU 的時間百分比。表示運行在內核態的系統進程、內核函數等使用 CPU 的時間占比。內核負責管理系統資源、處理中斷、進行進程調度等操作,如果
sy
的值過高,可能是內核任務過于繁重,例如系統調用頻繁、內核模塊存在性能問題等。 - id:CPU 空閑時間百分比。該值越高,說明 CPU 越空閑,系統的 CPU 資源利用率越低;反之,如果該值較低,表明 CPU 負載較高,系統可能處于繁忙狀態。
- wa:CPU 等待 I/O 完成的時間百分比。當 CPU 發起 I/O 操作后,需要等待 I/O 設備完成數據傳輸才能繼續執行后續操作,這段等待時間就是
wa
。如果wa
的值較大,說明系統存在 I/O 瓶頸,CPU 大部分時間都在等待 I/O 操作完成,導致 CPU 利用率不高。此時需要關注磁盤、網絡等 I/O 設備的性能情況。 - st:被虛擬機偷走的 CPU 時間百分比(僅在虛擬機環境中有意義)。如果系統是在虛擬機中運行,這個值表示虛擬機監控程序(如 KVM、Xen 等)占用的 CPU 時間,導致客戶機操作系統可用的 CPU 時間減少。如果
st
的值較高,說明虛擬機監控程序消耗了較多的 CPU 資源,可能會影響虛擬機內系統和應用程序的性能。
三、示例
3.1 顯示活動和非活動系統內存
-
活動內存:進程正在使用的內存。
-
非活動內存:分配給不再運行的進程的內存。
-
使用該**
-a
選項可將buff和cache內存列替換為inact和active**列。這些列顯示系統中非活動和活動內存的數量。
[root@Rocky ~]# vmstat -a
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free inact active si so bi bo in cs us sy id wa st2 0 0 521544 815128 253636 0 0 20 3 95 202 0 1 99 0 0
3.2 內存和調度統計
##生成有關內存、事件計數器和 CPU 調度統計信息的更多詳細信息
[root@Rocky ~]# vmstat -s
輸出顯示的報告與vmstat
基本報告類似,但某些部分包含更多詳細信息。例如,輸出將良好CPU 時間和非良好 CPU 時間分開,并在基本報告中合并vmstat
。
輸出中有四個部分:
- 輸出的第一部分涉及已使用的內存量:
- 總物理內存。
- 當前使用的內存。
- 活動記憶。
- 非活動內存。
- 釋放記憶。
- 緩沖內存。
- 高速緩存內存。
- 交換內存信息。
2.第二部分顯示CPU統計信息:
- 非良好 CPU 滴答數 – CPU 用于高優先級 進程的次數。
- 良好的 CPU 滴答數 – CPU 用于低優先級 進程的次數 。
- 系統 CPU 滴答 – CPU 用于內核進程的次數 。
- 空閑 CPU 滴答數——CPU 空閑的次數。
- IO-wait——CPU 用于輸入/輸出管理的次數。
- IRQ ——CPU 接收中斷請求的次數 。
- softirq——CPU 接收軟件中斷的次數 。
- 被盜 CPU 滴答數——虛擬機竊取 CPU 時間的次數。
3.第三部分顯示與內存分頁相關的值:
-
從虛擬內存 調入的頁面總數。
-
調出 到虛擬內存的總頁面數。
-
從交換內存讀取的總頁面數。
-
寫入交換內存的總頁面數。
-
最后一節描述了 各種事件計數器:
-
自啟動以來的中斷次數。
-
執行的上下文切換的次數。
-
上次啟動時間的時間戳 。
-
fork的總數 。
3.3 顯示自啟動以來的Fork次數
-
fork:是從現有正在運行的進程中創建的新進程
[root@Rocky ~]# vmstat -f3026 forks
3.4 顯示快速摘要磁盤統計信息
-
該**
-D
**選項會生成所有磁盤活動的快速摘要統計信息[root@Rocky ~]# vmstat -D4 disks2 partitions13241 total reads20 merged reads1765491 read sectors14401 milli reading5312 writes328 merged writes267212 written sectors7249 milli writing0 inprogress IO17 milli spent IO ## 輸出顯示系統詳細信息,例如磁盤數量、分區數量、讀取次數、寫入次數等
3.5 顯示磁盤統計信息(讀/寫統計信息)
-
-d
:獲取每個磁盤使用情況的詳細統計信息[root@Rocky ~]# vmstat -d disk- ------------reads------------ ------------writes----------- -----IO------total merged sectors ms total merged sectors ms cur sec sr0 40 0 2083 58 0 0 0 0 0 0 sda 7011 20 932380 7240 2569 332 136489 3175 0 9 dm-0 6090 0 826924 7078 2885 0 132393 4322 0 9 dm-1 104 0 4440 33 0 0 0 0 0 0
輸出顯示每個磁盤的三列 -讀取、寫入和IO 。讀取和寫入以毫秒為單位,而 IO 列以秒為單位。
每欄有若干小節:
- disk:表示磁盤設備的名稱。例如
sr0
通常代表光驅設備,sda
一般是第一塊 SATA 硬盤,dm-0
和dm-1
通常是與邏輯卷管理(LVM)相關的設備映射。 - reads 部分
- total:從系統啟動以來,該磁盤設備執行的讀操作總次數。比如
sda
的total
為 7011,表示從系統啟動到現在,對sda
磁盤進行了 7011 次讀操作。 - merged:合并的讀操作次數。操作系統為了提高磁盤 I/O 效率,會嘗試將相鄰的讀請求合并成一個更大的請求。以
sda
為例,merged
為 20,意味著有 20 次讀請求被合并處理。 - sectors:從磁盤讀取的扇區總數。每個扇區通常為 512 字節。像
sda
的sectors
為 932380,那么讀取的數據總量約為 932380 * 512 字節。 - ms:讀操作總共花費的時間(以毫秒為單位)。如
sda
的讀操作總共花費了 7240 毫秒。
- total:從系統啟動以來,該磁盤設備執行的讀操作總次數。比如
- writes 部分
- total:從系統啟動以來,該磁盤設備執行的寫操作總次數。例如
sda
的寫操作總次數為 2569 次。 - merged:合并的寫操作次數。
sda
有 332 次寫請求被合并處理。 - sectors:寫入到磁盤的扇區總數。
sda
寫入的扇區總數為 136489 個。 - ms:寫操作總共花費的時間(以毫秒為單位)。
sda
的寫操作總共花費了 3175 毫秒。
- total:從系統啟動以來,該磁盤設備執行的寫操作總次數。例如
- IO 部分
- cur:當前正在進行的 I/O 操作數量。如果該值長時間不為 0,可能表示磁盤存在 I/O 瓶頸。這里各磁盤的
cur
都為 0,說明當前沒有正在進行的 I/O 操作。 - sec:從系統啟動以來,該磁盤設備進行 I/O 操作所花費的總時間(以秒為單位)。例如
sda
的sec
為 9,即從系統啟動到現在,sda
進行 I/O 操作總共花費了 9 秒。
- cur:當前正在進行的 I/O 操作數量。如果該值長時間不為 0,可能表示磁盤存在 I/O 瓶頸。這里各磁盤的
3.6 顯示分區統計信息
-
**
-p
**使用該選項,后跟分區名稱,生成與特定分區相關的報告:[root@Rocky ~]# vmstat -p sda1 sda1 reads read sectors writes requested writes615 90088 2 4096 ##在此示例中,輸出顯示 sda 設備的第一個分區sda1的 摘要。摘要包括該分區上的磁盤讀寫計數以及磁盤讀寫任務所涉及的扇區總數
3.7 顯示更新的時間戳信息
-
-t:獲取時間戳以及請求的輸出
[root@Rocky ~]# vmstat -t procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----r b swpd free buff cache si so bi bo in cs us sy id wa st CST5 0 0 525784 4204 637264 0 0 17 3 91 197 0 1 99 0 0 2025-03-20 19:43:05 ## 輸出與基本輸出相同vmstat,但添加了時間戳
3.8使用延遲值
-
[delay]語法指定每次輸出更新之間的時間間隔,以秒為單位
[root@Rocky ~]# vmstat 3 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 525784 4204 637264 0 0 17 3 91 197 0 1 99 0 01 0 0 525612 4204 637264 0 0 0 0 122 329 0 1 99 0 00 0 0 525580 4204 637264 0 0 0 0 123 332 0 1 99 0 00 0 0 525580 4204 637264 0 0 0 0 119 326 0 0 100 0 0 ^C ##在此示例中,每次報告更新之間有三秒的延遲。如果沒有指定延遲,則只會打印一個輸出,給出自上次重啟以來的平均值。
3.9 使用計數值
-
注意:較低的延遲值會加重系統負擔,因為它會無限期地運行命令,直到您使用Ctrl+C組合鍵手動停止它 。為避免額外的負載,請將計數值與延遲值一起使用。語法是,
vmstat [delay[count]]
##在這個例子中,我們指定我們想要五秒延遲和三次輸出更新。 [root@Rocky ~]# vmstat 5 3 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 525724 4204 637264 0 0 17 2 90 197 0 1 99 0 00 0 0 525612 4204 637264 0 0 0 0 119 318 0 1 99 0 01 0 0 525612 4204 637264 0 0 0 0 122 321 0 1 99 0 0
3.10 更改單位
顯示內存和交換統計信息的默認單位是千字節。要更改輸出單位,請使用**-S
**選項和以下參數之一:
- k:1000 字節。
- K:1024字節。
- m:1000000 字節。
- M:1048576字節。
要以十進制千字節和兆字節顯示統計信息,請分別使用k和m。大寫K和M以十六進制千字節和兆字節顯示統計信息。
## 使用以下命令每 5 秒更新一次統計信息,并將顯示單位更改為兆字節:
[root@Rocky ~]# vmstat 5 -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 513 4 622 0 0 17 2 90 196 0 1 99 0 00 0 0 513 4 622 0 0 0 0 111 313 0 1 99 0 0
^C
3.11 顯示Slab統計信息
-
slab 緩存是 Linux 內核用于管理內存分配的數據結構,它有助于提高頻繁分配和釋放的小對象的內存分配效率。要查看 slab 統計信息,請使用該**
-m
選項。請注意,此操作需要超級用戶權限**[root@Rocky ~]# vmstat -m
-
整體列名解釋
-
Cache:表示 slab 緩存的名稱,不同的名稱對應著不同類型的內核對象緩存,例如
xfs
相關的緩存與 XFS 文件系統的內核操作有關。 -
Num:當前處于使用狀態(已分配)的對象數量,即該 slab 緩存中已經被內核使用的對象個數。
-
Total:該 slab 緩存中對象的總數量,包括已分配和未分配的對象。
-
Size:每個對象所占用的內存大小,單位是字節(Byte)。
-
vmstat -m
[外鏈圖片轉存中...(img-pPGE4ByA-1742476536369)]- 整體列名解釋- **Cache**:表示 slab 緩存的名稱,不同的名稱對應著不同類型的內核對象緩存,例如 `xfs` 相關的緩存與 XFS 文件系統的內核操作有關。- **Num**:當前處于使用狀態(已分配)的對象數量,即該 slab 緩存中已經被內核使用的對象個數。- **Total**:該 slab 緩存中對象的總數量,包括已分配和未分配的對象。- **Size**:每個對象所占用的內存大小,單位是字節(Byte)。- **Pages**:該 slab 緩存占用的物理內存頁數。在 Linux 系統中,內存以頁為單位進行管理,一頁的大小通常是 4KB(不同系統可能有所不同)。