一、簡介
vmstat是Virtual Meomory Statistics(虛擬內存統計)的縮寫,可對操作系統的虛擬內存、進程、CPU活動進行監控;屬於sysstat包;它是對系統的整體情況進行統計,不足之處是無法對某個進程進行深入分析。與top不同的是,top是交互式工具,用於監視性能,包含整個Linux系統的性能概要和進程信息。
如果沒有vmstat命令,則需要安裝
yum install -y sysstat
二、內存解讀
Linux系統的內存分為物理內存和虛擬內存兩種。物理內存是真實的,也就是物理內存條上的內存。而虛擬內存則是采用硬盤空間補充物理內存,將暫時不使用的內存頁寫到硬盤上以騰出更多的物理內存讓有需要的進程使用。當這些已被騰出的內存頁需要再次使用時才從硬盤(虛擬內存)中讀回內存。這一切對於用戶來說是透明的。通常對Linux系統來說,虛擬內存就是swap分區。
三、參數解讀
3.1、 表達式:
SYNOPSIS vmstat [-a] [-n] [delay [ count]] vmstat [-f] [-s] [-m] vmstat [-S unit] vmstat [-d] vmstat [-D] vmstat [-p disk partition] vmstat [-V]
3.2、要以1秒為時間間隔,連續收集3次性能數據,命令如下:
1
2
3
4
5
6
|
(py3) [root@jumpserver-168-182-149 ~]# vmstat 1 3
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 434432 700156 36 1380360 0 0 3 13 42 12 5 3 92 0 0
1 0 434432 686628 36 1380456 0 0 0 0 2573 1434 18 6 77 0 0
1 0 434432 662676 36 1380512 0 0 0 0 2021 1395 15 5 80 0 0
|
類別 |
項目 |
含義 |
說明 |
Procs(進程) |
r |
等待執行的任務數 |
展示了正在執行和等待cpu資源的任務個數。當這個值超過了cpu個數,就會出現cpu瓶頸。 |
B |
等待IO的進程數量 |
|
|
Memory(內存) |
swpd |
正在使用虛擬的內存大小,單位k |
|
free |
空閑內存大小 |
|
|
buff |
已用的buff大小,對塊設備的讀寫進行緩沖 |
|
|
cache |
已用的cache大小,文件系統的cache |
|
|
inact |
非活躍內存大小,即被標明可回收的內存,區別於free和active |
具體含義見:概念補充(當使用-a選項時顯示) |
|
active |
活躍的內存大小 |
具體含義見:概念補充(當使用-a選項時顯示) |
|
Swap |
si |
每秒從交換區寫入內存的大小(單位:kb/s) |
|
so |
每秒從內存寫到交換區的大小 |
|
|
IO |
bi |
每秒讀取的塊數(讀磁盤) |
塊設備每秒接收的塊數量,單位是block,這里的塊設備是指系統上所有的磁盤和其他塊設備,現在的Linux版本塊的大小為1024bytes |
bo |
每秒寫入的塊數(寫磁盤) |
塊設備每秒發送的塊數量,單位是block |
|
system |
in |
每秒中斷數,包括時鍾中斷 |
這兩個值越大,會看到由內核消耗的cpu時間sy會越多
秒上下文切換次數,例如我們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目 |
cs |
每秒上下文切換數 |
||
CPU(以百分比表示) |
us |
用戶進程執行消耗cpu時間(user time) |
us的值比較高時,說明用戶進程消耗的cpu時間多,但是如果長期超過50%的使用,那么我們就該考慮優化程序算法或其他措施了 |
sy |
系統進程消耗cpu時間(system time) |
sys的值過高時,說明系統內核消耗的cpu資源多,這個不是良性的表現,我們應該檢查原因。這里us + sy的參考值為80%,如果us+sy 大於 80%說明可能存在CPU不足 |
|
Id |
空閑時間(包括IO等待時間) |
一般來說 us+sy+id=100 |
|
wa |
等待IO時間 |
wa過高時,說明io等待比較嚴重,這可能是由於磁盤大量隨機訪問造成的,也有可能是磁盤的帶寬出現瓶頸。 |
vmstat命令提供了許多命令行參數,使用man手冊查看參數的詳細文檔。常用的參數有:
-m :顯示內核的內存使用情況(slabs) -a :顯示活動和非活動內存分頁相關信息 -n :只顯示一次欄位名稱行,當在取樣模式通下將輸出信息存儲到文件時非常有用。(例如,root#vmstat –n 2 10 以每2秒鍾的頻率執行10次取樣),如果只接一個數字,則表示每多少秒無限執行
三、系統監控的實驗
實例一、大量的系統調用
本腳本會進入一個死循環,不斷的執行cd命令,從而模擬大量系統調用的環境
測試腳本如下:
#!/bin/bash while (true) do cd ; done
chmod +x loop.sh ./loop.sh
運行:vmstat 1
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 435712 416576 36 1736788 0 0 0 0 5890 7219 4 21 75 0 0 2 0 435712 361036 36 1736792 0 0 0 0 6974 7930 24 24 52 0 0 3 0 435712 330312 36 1736968 0 0 0 0 7304 7761 18 32 51 0 0 3 0 435712 321648 36 1737080 0 0 0 0 6767 7008 21 29 50 0 0 1 0 435712 290116 36 1737144 0 0 0 0 6346 6591 25 24 50 0 0 5 0 435712 289628 36 1737168 0 0 0 99 8346 13175 8 25 68 0 0 1 0 435712 413956 36 1737188 0 0 0 144 7947 12721 18 25 58 0 0 1 0 435712 413792 36 1737188 0 0 0 0 5701 7234 4 21 75 0 0 2 0 435712 413368 36 1737188 0 0 0 8 5944 7442 4 21 75 0 0 2 0 435712 415280 36 1737188 0 0 0 0 5709 7221 4 21 75 0 0 1 0 435712 414148 36 1737188 0 0 0 0 5713 6706 4 21 75 0 0 1 0 435712 413932 36 1737188 0 0 0 0 5298 6310 5 20 76 0 0 2 0 435712 415592 36 1737188 0 0 0 0 5678 7199 4 21 75 0 0 2 0 435712 414368 36 1737188 0 0 0 0 5653 6700 4 20 75 0 0 3 0 435712 413432 36 1737188 0 0 0 210 5633 7050 4 21 75 0 0 7 0 435712 411728 36 1737188 0 0 0 230 6648 9505 5 22 73 0 0 2 0 435712 373168 36 1737200 0 0 0 190 9797 16602 24 31 45 0 0
隨着程序不斷調用cd命令,運行隊列有等待的進程r(看參數r),每秒的中斷數in(看參數in),下文切換的次數cs驟然提高(看參數cs),系統占用的cpu時間sy(看參數sy)也不斷提高,cpu空閑時間id(看參數id)一直為0。當程序終止的時候,r,in,cs,sy數據都下來了,id上去了,表示系統已經空閑下來了。
實例二、大量的io操作
我們用dd命令,從/dev/zero讀數據,寫入到/tmp/data文件中,如下:
dd if=/dev/zero of=/tmp/data bs=1M count=1000 參數解釋: if=文件名:輸入文件名,缺省為標准輸入。即指定源文件。< if=input file > of=文件名:輸出文件名,缺省為標准輸出。即指定目的文件。< of=output file > bs=bytes:同時設置讀入/輸出的塊大小為bytes個字節。 count=blocks:僅拷貝blocks個塊,塊大小等於ibs指定的字節數。
/dev/zero:“零”設備,可以無限的提供空字符(0x00,ASCII代碼NUL)。常用來生成一個特定大小的文件
1
|
dd
if
=/dev/zero of=./output.txt bs=1024 count=1 #產生一個1k大小的文件output.txt
|
運行:vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 21 0 439296 114440 36 1975824 0 0 0 0 410 769 3 97 0 0 0 24 0 439552 129656 36 1959912 0 348 0 348 287 536 4 96 0 0 0 24 0 439808 129572 36 1959316 0 36 0 36 206 423 0 100 0 0 0 18 0 439808 157688 36 1930456 0 148 0 148 308 511 4 96 0 0 0 23 0 440320 160804 36 1927740 0 456 0 456 277 540 5 95 0 0 0 17 1 440320 181112 36 1912696 0 48 208 48 373 707 10 90 0 0 0 20 0 440576 185452 36 1909900 0 168 136 168 246 373 11 89 0 0 0 30 0 440576 176440 36 1918448 0 0 3984 19 471 846 23 74 3 0 0 34 0 440576 168792 36 1921808 0 0 1072 24 448 851 17 83 0 0 0 17 0 440576 166992 36 1923036 0 0 332 0 304 704 10 90 0 0 0 12 0 440576 167552 36 1926380 0 0 1532 0 573 1381 38 62 0 0 0 13 0 440576 165368 36 1927568 0 0 0 127 267 433 5 95 0 0 0 6 0 440576 163492 36 1928592 0 0 0 0 319 527 8 92 0 0 0 7 0 440576 160376 36 1929892 0 0 0 0 279 613 4 96 0 0 0 10 0 440576 158276 36 1931884 0 0 0 0 325 568 4 96 0 0 0 12 0 440576 156188 36 1934068 0 0 0 0 334 584 11 89 0 0 0 12 0 440576 154172 36 1935252 0 0 0 0 282 419 4 96 0 0 0 10 0 440576 152016 36 1935856 0 0 0 0 245 452 0 100 0 0 0 9 0 440576 149820 36 1936904 0 0 0 4 291 535 4 96 0 0 0 19 0 440576 147456 36 1937672 0 0 0 0 282 445 4 96 0 0 0 18 1 440576 145656 36 1938468 0 0 0 18 273 614 5 95 0 0 0 14 0 440576 143684 36 1940092 0 0 0 6 296 514 4 96 0 0 0 10 0 440576 141644 36 1940580 0 0 0 0 244 445 0 100 0 0 0
1、bo寫數據到磁盤的速率,bi是從磁盤讀的速度
2、dd不斷的向磁盤寫入數據,所以bo的值會驟然提高
這回從/tmp/data文件讀,寫到/dev/null文件中,如下:
dd if=/tmp/test1 of=/dev/null bs=1M
1、dd不斷的從/tmp/data磁盤文件中讀取數據,所以bi的值會驟然變高,最后我們看到b(在等待io的進程)也由0變成了1甚至到2
2、dd讀的時候,in中斷數和cs上下文切換很高,還有就是等待IO所消耗的cpu時間wa相當高
四、vmstat用法:
1、查看系統已經fork了多少次
(py3) [root@jumpserver-168-182-149 ~]# vmstat -f 14642852 forks
注意:這個數據是從/proc/stat中的processes字段里取得的
2、查看內存的active和inactive
(py3) [root@jumpserver-168-182-149 ~]# vmstat -a
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
1 0 376576 229028 897160 2018204 0 0 4 14 8 27 5 3 92 0 0
3、查看內存使用的詳細信息
(py3) [root@jumpserver-168-182-149 ~]# vmstat -s 3861364 K total memory 1758596 K used memory 2017476 K active memory 897136 K inactive memory 229908 K free memory 36 K buffer memory 1872824 K swap cache 4063228 K total swap 376576 K used swap 3686652 K free swap 5201414 non-nice user cpu ticks 49 nice user cpu ticks 2814309 system cpu ticks 89605394 idle cpu ticks 36633 IO-wait cpu ticks 0 IRQ cpu ticks 110102 softirq cpu ticks 0 stolen cpu ticks 3924612 pages paged in 14092886 pages paged out 25685 pages swapped in 117208 pages swapped out 480587807 interrupts 670429635 CPU context switches 1624539986 boot time 14652200 forks
4、查看磁盤的讀/寫
(py3) [root@jumpserver-168-182-149 ~]# vmstat -d disk- ------------reads------------ ------------writes----------- -----IO------ total merged sectors ms total merged sectors ms cur sec sr0 18 0 2056 580 0 0 0 0 0 0 sda 119355 7888 7838620 5931106 1215186 204210 27261464 4283174 0 2143 dm-0 100059 0 7566702 5788365 1302162 0 26315487 4253256 0 1819 dm-1 25773 0 209888 193185 117208 0 937664 34797615 0 522 dm-2 148 0 2532 170 4 0 4096 96 0 0 sdb 194 0 8548 304 951 33592 930656 716 0 0
注意:這些信息主要來自於/proc/diskstats.
merged:表示一次來自於合並的寫/讀請求,一般系統會把多個連接/鄰近的讀/寫請求合並到一起來操作.
5、查看/dev/sda磁盤的讀/寫,注意磁盤需要是已分區的。
(py3) [root@jumpserver-168-182-149 ~]# vmstat -p /dev/sdb2 sdb2 reads read sectors writes requested writes 100 6224 0 0
五、top命令詳解
5.1、參數詳解
top命令經常用來監控linux的系統狀況,是常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用情況。
top的使用方式 top [-d number] | top [-bnp]
參數解釋:
-d:number代表秒數,表示top命令顯示的頁面更新一次的間隔。默認是5秒。
-b:以批次的方式執行top。
-n:與-b配合使用,表示需要進行幾次top命令的輸出結果。
-p:指定特定的pid進程號進行觀察。 在top命令顯示的頁面還可以輸入以下按鍵執行相應的功能(注意大小寫區分的): ?:顯示在top當中可以輸入的命令
P:以CPU的使用資源排序顯示
M:以內存的使用資源排序顯示
N:以pid排序顯示
T:由進程使用的時間累計排序顯示
k:給某一個pid一個信號。可以用來殺死進程
r:給某個pid重新定制一個nice值(即優先級)
q:退出top(用ctrl+c也可以退出top)。
5.2、top前5行統計信息
第1行:top - 05:43:27 up 4:52, 2 users, load average: 0.58, 0.41, 0.30
第1行是任務隊列信息,其參數如下:
內容 | 含義 |
---|---|
05:43:27 | 表示當前時間 |
up 4:52 | 系統運行時間 格式為時:分 |
2 users | 當前登錄用戶數 |
load average: 0.58, 0.41, 0.30 | 系統負載,即任務隊列的平均長度。 三個數值分別為 1分鍾、5分鍾、15分鍾前到現在的平均值。 |
load average: 如果這個數除以邏輯CPU的數量,結果高於5的時候就表明系統在超負荷運轉了。
第2行:Tasks: 159 total, 1 running, 158 sleeping, 0 stopped, 0 zombie 第3行:%Cpu(s): 37.0 us, 3.7 sy, 0.0 ni, 59.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
第2、3行為進程和CPU的信息
注意:%Cpu(s)是系統所有用戶進程占用整個CPU的平均值,由於每個核心占用的百分比不同,所以按平均值來算比較有參考意義。
當有多個CPU時,這些內容可能會超過兩行,其參數如下:
內容 | 含義 |
---|---|
159 total | 進程總數 |
1 running | 正在運行的進程數 |
158 sleeping | 睡眠的進程數 |
0 stopped | 停止的進程數 |
0 zombie | 僵屍進程數 |
37.0 us | 用戶空間占用CPU百分比 |
3.7 sy | 內核空間占用CPU百分比 |
0.0 ni | 用戶進程空間內改變過優先級的進程占用CPU百分比 |
59.3 id | 空閑CPU百分比 |
0.0 wa | 等待輸入輸出的CPU時間百分比 |
0.0 hi | 硬中斷(Hardware IRQ)占用CPU的百分比 |
0.0 si | 軟中斷(Software Interrupts)占用CPU的百分比 |
0.0 st |
第4行:KiB Mem: 1530752 total, 1481968 used, 48784 free, 70988 buffers 第5行:KiB Swap: 3905532 total, 267544 used, 3637988 free. 617312 cached Mem
第4、5行為內存信息
其參數如下:
內容 | 含義 |
---|---|
KiB Mem: 1530752 total | 物理內存總量 |
1481968 used | 使用的物理內存總量 |
48784 free | 空閑內存總量 |
70988 buffers(buff/cache) | 用作內核緩存的內存量 |
KiB Swap: 3905532 total | 交換區總量 |
267544 used | 使用的交換區總量 |
3637988 free | 空閑交換區總量 |
617312 cached Mem | 緩沖的交換區總量。 |
3156100 avail Mem | 代表可用於進程下一次分配的物理內存數量 |
上述最后提到的緩沖的交換區總量,這里解釋一下,所謂緩沖的交換區總量,即內存中的內容被換出到交換區,而后又被換入到內存,但使用過的交換區尚未被覆蓋,該數值即為這些內容已存在於內存中的交換區的大小。相應的內存再次被換出時可不必再對交換區寫入。
計算可用內存數有一個近似的公式:
第四行的free + 第四行的buffers + 第五行的cached
5.3、進程信息
列名 | 含義 |
---|---|
PID | 進程id |
PPID | 父進程id |
RUSER | Real user name |
UID | 進程所有者的用戶id |
USER | 進程所有者的用戶名 |
GROUP | 進程所有者的組名 |
TTY | 啟動進程的終端名。不是從終端啟動的進程則顯示為 ? |
PR | 優先級 |
NI | nice值。負值表示高優先級,正值表示低優先級 |
P | 最后使用的CPU,僅在多CPU環境下有意義 |
%CPU | 上次更新到現在的CPU時間占用百分比 |
TIME | 進程使用的CPU時間總計,單位秒 |
TIME+ | 進程使用的CPU時間總計,單位1/100秒 |
%MEM | 進程使用的物理內存百分比 |
VIRT | 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES |
SWAP | 進程使用的虛擬內存中,被換出的大小,單位kb |
RES | 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA |
CODE | 可執行代碼占用的物理內存大小,單位kb |
DATA | 可執行代碼以外的部分(數據段+棧)占用的物理內存大小,單位kb |
SHR | 共享內存大小,單位kb |
nFLT | 頁面錯誤次數 |
nDRT | 最后一次寫入到現在,被修改過的頁面數。 |
S | 進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=僵屍進程 |
COMMAND | 命令名/命令行 |
WCHAN | 若該進程在睡眠,則顯示睡眠中的系統函數名 |
Flags | 任務標志 |
5.4、其它實用快捷鍵操作
默認進入top時,各進程是按照CPU的占用量來排序的。
1、在top基本視圖中,按鍵盤數字“1”可以監控每個邏輯CPU的狀況:
2、改變進程顯示字段
在top基本視圖中,敲擊”f”進入另一個視圖,在這里可以編輯基本視圖中的顯示字段:
用上下鍵選擇選項,按下空格鍵可以決定是否在基本視圖中顯示這個選項。
top命令是一個非常強大的功能,但是它監控的最小單位是進程,如果想監控更小單位時,就需要用到ps或者netstate命令來滿足我們的要求。
~~~以上就是vmstat和top工具的講解~~~