Linux 下如何使用 vmstat 命令
語法
vmstat 命令的執行不需要特殊的權限,普通用戶就可以執行,其語法形式如下:
vmstat [options] [delay [count]]
??delay?
? 表示數據更新間隔,單位是秒,如果沒有指定此值,表示系統啟動以來的平均時間,而且此時只輸出一次結果
??count?
? 表示輸出次數,如果沒有指定該值,但是指定了 ??delay?
? 的值,則表示無限次
結果字段說明
在命令行輸入 vmstat 并回車, 會輸出一次結果
[root@cghost22 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 0 991324 932 537336 0 0 0 0 3 4 0 0 100 0 0
[root@cghost22 ~]#
結果中有許多的字段,下表列出了每個字段的詳細說明
字段 | 說明 |
r | 可運行進程的數量,包括運行態和就緒態 |
b | 處于不可中斷睡眠狀態的進程數量 |
swpd | 虛擬內存使用量 |
free | 空閑內存 |
buff | 用作buffer的內存數量 |
cache | 用作cache的內存數量 |
si | 從磁盤換入內存的數量 |
so | 從內存換出到磁盤的數量 |
bi | 從塊設備接收的塊,單位:塊/秒 |
bo | 發送到塊設備的塊,單位:塊/秒 |
in | 每秒中斷數,包括時鐘中斷 |
cs | 每秒上下文切換數 |
us | 用戶態執行時間 |
sy | 內核態執行時間 |
id | CPU空閑時間 |
wa | 等待IO的時間 |
st | 從虛擬機中偷取的時間 |
表中第二行 ??處于不可中斷睡眠狀態的進程數量?
?,這里的不可中斷是指 一個進程在執行某些系統調用時進入的狀態,在這種狀態下,進程被阻塞,并且不能被中斷,直到完成系統調用
字段結果按照顏色分成了幾部分,從上到下依次是:進程信息,內存信息,IO信息,系統中斷和上下文,CPU時間
內存信息中數值的單位默認是 KB ( 1024 kbytes ), CPU時間字段并不表示具體的時間,而是占總CPU時間的一個百分比
常見選項
選項 | 說明 |
-a | 顯示活躍和非活躍內存 |
-f | 從系統啟動至今 fork 的數量,包括 fork、vfork 以及 clone 等系統調用 |
-s | 顯示系統事件計數以及內存統計信息 |
-d | 報告磁盤統計信息 |
-D | 統計活動磁盤信息 |
-p | 指定分區的詳細信息 |
-t | 追加一列時間顯示 |
-S | 按照指定字節單位顯示 |
-w | 結果按照寬模式顯示 |
-V | vmstat的版本 |
常見用法
vmstat 命令主要用于識別系統的瓶頸,統計數據的時候,它不會包含自身進程
- 按照指定時間間隔和次數輸出
[root@cghost22 ~]$ vmstat 2 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 12552 148356 234324 3382956 0 0 1 21 4 4 2 2 97 0 0
1 0 12552 148264 234324 3382980 0 0 0 0 14974 27478 3 2 96 0 0
1 0 12552 148232 234324 3382984 0 0 0 14 14384 27181 3 2 96 0 0
0 0 12552 148376 234332 3383052 0 0 0 204 14197 26812 4 2 94 0 0
0 0 12552 148512 234332 3383088 0 0 0 4 14398 27155 3 2 95 0 0
0 0 12552 147892 234332 3383128 0 0 0 210 15515 28802 3 2 95 0 0
1 0 12552 148388 234332 3383156 0 0 0 0 15147 28042 3 2 95 0 0
0 0 12552 148264 234332 3383168 0 0 0 4 14380 27395 3 1 96 0 0
0 0 12552 148264 234336 3383216 0 0 0 198 14430 27008 3 1 95 0 0
2 0 12552 148140 234336 3383252 0 0 0 6 14233 27161 3 2 95 0 0
??2?
? 表示每隔 2 秒輸出一次結果,??10?
? 表示總共輸出 10 次,10 次之后程序自動結束
- 修改內?存顯示單位
輸出的結果中,內存數據的單位默認是 KB,可以通過 ??-S?
? 選項調整顯示的單位,有下面幾種單位可供選擇
注意:??-S?
?? 選項對 ??si、 so?
? 字段無效
k # 1000 bytes
K # 1024 bytes
m # 1000 * 1000 bytes
M # 1024 * 1024 bytes
上圖中第一個結果中內存數據顯示單位是 KB , 第二個結果中單位是 MB,將第一個結果對應字段的數值除以 1024 就得到了第二個結果
- 活躍內存和非活躍內存
??inact?
? 是非活躍內存,??active?
? 是活躍內存
活躍內存是進程在使用的內存,非活躍內存是未運行進程的內存
- 系統啟動以來 fork 的數量
這里的 fork 數量包括 fork、vfork 以及 clone 等系統調用
[root@cghost22 ~]# vmstat -f
12714 forks
[root@cghost22 ~]# vmstat -f
12715 forks
[root@cghost22 ~]# vmstat -f
12716 forks
我們每次在控制臺執行一次命令,系統就會 fork 一個新的進程來執行命令,比如像上面的例子,每執行一次 ??vmstat -f?
? 命令,系統就會 fork 一個新進程
這個選項還可以用于統計某個操作消耗多少次 fork 調用,只需要在操作前后各執行一次 ??vmstat -f?
? 命令,比較兩次結果的差值即可
- 每行追加一列時間
追加一列時間顯示,有助于比較一段時間內的結果
- 按照寬模式顯示
vmstat 結果中的某些字段的數字有時會比較長,而且跟字段名的位置有偏差, 不太適合人類的觀看習慣,??-w?
? 選項可以按照寬模式顯示數據,使結果看起來更直觀,下圖是分別未使用寬模式和使用了寬模式的一個對比
- 統計磁盤信息
磁盤信息主要分三個方面:讀、寫、IO ,讀和寫以毫秒為單位,IO以秒為單位
讀
total: 成功讀取的總數
merged: 分組讀取(產生一個 IO)
sectors: 成功讀取的扇區數
ms: 讀取花費的毫秒
寫
total: 成功寫入的總數
merged: 分組寫入(產生一個 IO)
sectors: 成功寫入的扇區數
ms: 寫花費的毫秒
IO
cur: 正在進行的IO
s: IO花費的秒數
- 指定磁盤分區信息
上圖中,輸出結果顯示 sda3 分區設備的信息,它們包括:讀計數、讀取的扇區數,寫計數,分區寫請求總數。