1. 程式人生 > 其它 >vmstat,top系統監控工具

vmstat,top系統監控工具

一、簡介

  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次效能資料,命令如下:

(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)。常用來生成一個特定大小的檔案
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工具的講解~~~