監聽命令 - Vmstart,Top
一、簡介
vmstat是Virtual Meomory Statistics(虛擬記憶體統計)的縮寫,可對作業系統的虛擬記憶體、程序、CPU活動進行監控;屬於sysstat包;它是對系統的整體情況進行統計,不足之處是無法對某個程序進行深入分析。與top不同的是,top是互動式工具,用於監視效能,包含整個Linux系統的效能概要和程序資訊。
如果沒有vmstat命令,則需要安裝
yum install -y sysstat
二、記憶體解讀
Linux系統的記憶體分為實體記憶體和虛擬記憶體兩種。實體記憶體是真實的,也就是實體記憶體條上的記憶體。而虛擬記憶體則是採用硬碟空間補充實體記憶體,將暫時不使用的記憶體頁
三、引數解讀
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工具的講解~~~