Linux系列(41) - 監聽命令Vmstart,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次性能數據,命令如下:

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工具的講解~~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM