vmstat命令

vmstat是Virtual Meomory Statistics(虛擬內存統計)的縮寫,可對操作系統的虛擬內存、進程、CPU活動進行監控。他是對系統的整體情況進行統計,不足之處是無法對某個進程進行深入分析。vmstat 工具提供了一種低開銷的系統性能觀察方式。因爲 vmstat 本身就是低開銷工具,在非常高負荷的服務器上,需要查看並監控系統的健康情況,在控制窗口還是能夠使用vmstat 輸出結果。在學習vmstat命令前,我們先了解一下Linux系統中關於物理內存和虛擬內存相關信息。

物理內存和虛擬內存區別:
我們知道,直接從物理內存讀寫數據要比從硬盤讀寫數據要快的多,因此,我們希望所有數據的讀取和寫入都在內存完成,而內存是有限的,這樣就引出了物理內存與虛擬內存的概念。
物理內存就是系統硬件提供的內存大小,是真正的內存,相對於物理內存,在linux下還有一個虛擬內存的概念,虛擬內存就是爲了滿足物理內存的不足而提出的策略,它是利用磁盤空間虛擬出的一塊邏輯內存,用作虛擬內存的磁盤空間被稱爲交換空間(Swap Space)。
作爲物理內存的擴展,linux會在物理內存不足時,使用交換分區的虛擬內存,更詳細的說,就是內核會將暫時不用的內存塊信息寫到交換空間,這樣以來,物理內存得到了釋放,這塊內存就可以用於其它目的,當需要用到原始的內容時,這些信息會被重新從交換空間讀入物理內存。
linux的內存管理採取的是分頁存取機制,爲了保證物理內存能得到充分的利用,內核會在適當的時候將物理內存中不經常使用的數據塊自動交換到虛擬內存中,而將經常使用的信息保留到物理內存。

要深入瞭解linux內存運行機制,需要知道下面提到的幾個方面:
首先,Linux系統會不時的進行頁面交換操作,以保持儘可能多的空閒物理內存,即使並沒有什麼事情需要內存,Linux也會交換出暫時不用的內存頁面。這可以避免等待交換所需的時間。
其次,linux進行頁面交換是有條件的,不是所有頁面在不用時都交換到虛擬內存,linux內核根據」最近最經常使用「算法,僅僅將一些不經常使用的頁面文件交換到虛擬內存,有時我們會看到這麼一個現象:linux物理內存還有很多,但是交換空間也使用了很多。其實,這並不奇怪,例如,一個佔用很大內存的進程運行時,需要耗費很多內存資源,此時就會有一些不常用頁面文件被交換到虛擬內存中,但後來這個佔用很多內存資源的進程結束並釋放了很多內存時,剛纔被交換出去的頁面文件並不會自動的交換進物理內存,除非有這個必要,那麼此刻系統物理內存就會空閒很多,同時交換空間也在被使用,就出現了剛纔所說的現象了。關於這點,不用擔心什麼,只要知道是怎麼一回事就可以了。

最後,交換空間的頁面在使用時會首先被交換到物理內存,如果此時沒有足夠的物理內存來容納這些頁面,它們又會被馬上交換出去,如此以來,虛擬內存中可能沒有足夠空間來存儲這些交換頁面,最終會導致linux出現假死機、服務異常等問題,linux雖然可以在一段時間內自行恢復,但是恢復後的系統已經基本不可用了。
因此,合理規劃和設計linux內存的使用,是非常重要的。

虛擬內存原理:

在系統中運行的每個進程都需要使用到內存,但不是每個進程都需要每時每刻使用系統分配的內存空間。當系統運行所需內存超過實際的物理內存,內核會釋放某些進程所佔用但未使用的部分或所有物理內存,將這部分資料存儲在磁盤上直到進程下一次調用,並將釋放出的內存提供給有需要的進程使用。

在Linux內存管理中,主要是通過「調頁Paging」和「交換Swapping」來完成上述的內存調度。調頁算法是將內存中最近不常使用的頁面換到磁盤上,把活動頁面保留在內存中供進程使用。交換技術是將整個進程,而不是部分頁面,全部交換到磁盤上。

分頁(Page)寫入磁盤的過程被稱作Page-Out,分頁(Page)從磁盤重新回到內存的過程被稱作Page-In。當內核需要一個分頁時,但發現此分頁不在物理內存中(因爲已經被Page-Out了),此時就發生了分頁錯誤(Page Fault)。

當系統內核發現可運行內存變少時,就會通過Page-Out來釋放一部分物理內存。經管Page-Out不是經常發生,但是如果Page-out頻繁不斷的發生,直到當內核管理分頁的時間超過運行程式的時間時,系統效能會急劇下降。這時的系統已經運行非常慢或進入暫停狀態,這種狀態亦被稱作thrashing。

1.命令格式

vmstat [-a] [-n] [-S unit] [delay [ count]]
vmstat [-s] [-n] [-S unit]
vmstat [-m] [-n] [delay [ count]]
vmstat [-d] [-n] [delay [ count]]
vmstat [-p disk partition] [-n] [delay [ count]]
vmstat [-f]
vmstat [-V]

2.命令功能

用來顯示虛擬內存的信息

3.命令參數

  • -a:顯示活躍和非活躍內存
  • -f:顯示從系統啓動至今的fork數量 。
  • -m:顯示slabinfo
  • -n:只在開始時顯示一次各字段名稱。
  • -s:顯示內存相關統計信息及多種系統活動數量。
  • delay:刷新時間間隔。如果不指定,只顯示一條結果。
  • count:刷新次數。如果不指定刷新次數,但指定了刷新時間間隔,這時刷新次數爲無窮。
  • -d:顯示磁盤相關統計信息。
  • -p:顯示指定磁盤分區統計信息
  • -S:使用指定單位顯示。參數有 k 、K 、m 、M ,分別代表1000、1024、1000000、1048576字節(byte)。默認單位爲K(1024 bytes)
  • -V:顯示vmstat版本信息。

4.使用實例

實例1:顯示虛擬內存使用情況

命令:

vmstat

輸出:

[yiibai@localhost ~]$ 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 703572    948 162328    0    0   608    65  379  564 14 10 72  3  0
[yiibai@localhost ~]$

字段說明:

  • Procs(進程):

    • r: 運行隊列中進程數量
    • b: 等待IO的進程數量
  • Memory(內存):

    • swpd: 使用虛擬內存大小
    • free: 可用內存大小
    • buff: 用作緩衝的內存大小
    • cache: 用作緩存的內存大小
  • Swap:

    • si: 每秒從交換區寫到內存的大小
    • so: 每秒寫入交換區的內存大小
    • IO:(現在的Linux版本塊的大小爲1024bytes)
    • bi: 每秒讀取的塊數
    • bo: 每秒寫入的塊數
  • system:

    • in: 每秒中斷數,包括時鐘中斷。
    • cs: 每秒上下文切換數。
    • CPU(以百分比表示):
    • us: 用戶進程執行時間(user time)
    • sy: 系統進程執行時間(system time)
    • id: 空閒時間(包括IO等待時間),中央處理器的空閒時間 。以百分比表示。
    • wa: 等待IO時間

備註: 如果 r經常大於 4,且id經常少於40,表示cpu的負荷很重。如果pi,po 長期不等於0,表示內存不足。如果disk 經常不等於0, 且在 b中的隊列 大於3, 表示 io性能不好。Linux在具有高穩定性、可靠性的同時,具有很好的可伸縮性和擴展性,能夠針對不同的應用和硬件環境調整,優化出滿足當前應用需要的最佳性能。因此企業在維護Linux系統、進行系統調優時,瞭解系統性能分析工具是至關重要的。

命令:

vmstat 5 5

表示在5秒時間內進行5次採樣。將得到一個數據彙總他能夠反映真正的系統情況。

實例2:顯示活躍和非活躍內存

命令:

vmstat -a 2 5

輸出:

[yiibai@localhost ~]$ vmstat -a 2 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 3  0      0 703524  67680 121392    0    0   496    54  506  484 30  8 59  3  0
 1  0      0 703528  67680 121396    0    0     0     0 1059   87 100  0  0  0  0
 1  0      0 703528  67680 121396    0    0     0     1 1058   94 100  0  0  0  0
 1  0      0 703528  67680 121408    0    0     0     0 1069   93 100  0  0  0  0
 1  0      0 703528  67680 121408    0    0     0     0 1064   90 100  1  0  0  0
[yiibai@localhost ~]$

說明:
使用-a選項顯示活躍和非活躍內存時,所顯示的內容除增加inactactive外,其他顯示內容與例子1相同。
字段說明:

  • Memory(內存):
    • inact: 非活躍內存大小(當使用-a選項時顯示)
    • active: 活躍的內存大小(當使用-a選項時顯示)

實例3:查看系統已經fork了多少次

命令:

vmstat -f

輸出:

[yiibai@localhost ~]$ vmstat -f
         2436 forks
[yiibai@localhost ~]$ vmstat -f
         2437 forks

說明:這個數據是從/proc/stat中的processes字段裏取得。

實例4:查看內存使用的詳細信息

命令:

vmstat -s

輸出:

[yiibai@localhost ~]$ vmstat -s
       999936 K total memory
       133040 K used memory
       121372 K active memory
        67680 K inactive memory
       703620 K free memory
          948 K buffer memory
       162328 K swap cache
      2097148 K total swap
            0 K used swap
      2097148 K free swap
        18184 non-nice user cpu ticks
            0 nice user cpu ticks
         1962 system cpu ticks
        14474 idle cpu ticks
          700 IO-wait cpu ticks
            0 IRQ cpu ticks
          146 softirq cpu ticks
            0 stolen cpu ticks
       121878 pages paged in
        13296 pages paged out
            0 pages swapped in
            0 pages swapped out
       240318 interrupts
       129447 CPU context switches
   1487555462 boot time
         2441 forks
[yiibai@localhost ~]$

說明:這些信息的分別來自於/proc/meminfo,/proc/stat/proc/vmstat

實例5:查看磁盤的讀/寫

命令:

vmstat -d

輸出:

[yiibai@localhost ~]$ vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
sda     5993      1  243668   34060    915    119   26595   71815      0     22
sr0       11      0      88      89      0      0       0       0      0      0
dm-0    3025      0  188242   29896   1008      0   18235   97048      0     20
dm-1     128      0    2136     272      0      0       0       0      0      0
dm-2     655      0    5470     722     16      0    4224     177      0      0
[yiibai@localhost ~]$

說明:這些信息主要來自於/proc/diskstats.
merged:表示一次來自於合併的寫/讀請求,一般系統會把多個連接/鄰近的讀/寫請求合併到一起來操作.

實例6:查看/dev/sda1磁盤的讀/寫

命令執行及輸出:

[yiibai@localhost ~]$ df
Filesystem          1K-blocks    Used Available Use% Mounted on
/dev/mapper/cl-root  40137576 1652712  38484864   5% /
devtmpfs               488988       0    488988   0% /dev
tmpfs                  499968       0    499968   0% /dev/shm
tmpfs                  499968    6856    493112   2% /run
tmpfs                  499968       0    499968   0% /sys/fs/cgroup
/dev/sda1             1038336  141652    896684  14% /boot
/dev/mapper/cl-home  19593216   34612  19558604   1% /home
tmpfs                   99996       0     99996   0% /run/user/0
[yiibai@localhost ~]$ vmstat -p /dev/sda1
sda1          reads   read sectors  writes    requested writes
                1981      45316         10       4136
[yiibai@localhost ~]

說明:這些信息主要來自於/proc/diskstats

  • reads:來自於這個分區的讀的次數。
  • read sectors:來自於這個分區的讀扇區的次數。
  • writes:來自於這個分區的寫的次數。
  • requested writes:來自於這個分區的寫請求次數。

實例7:查看系統的slab信息

命令:

vmstat -m

輸出:

[yiibai@localhost ~]$ vmstat -m
vmstat: your kernel does not support slabinfo or your permissions are insufficie                            nt
[yiibai@localhost ~]$

這組信息來自於/proc/slabinfo
slab:由於內核會有許多小對象,這些對象構造銷燬十分頻繁,比如i-nodedentry,這些對象如果每次構建的時候就向內存要一個頁(4kb),而其實只有幾個字節,這樣就會非常浪費,爲了解決這個問題,就引入了一種新的機制來處理在同一個頁框中如何分配小存儲區,而slab可以對小對象進行分配,這樣就不用爲每一個對象分配頁框,從而節省了空間,內核對一些小對象創建析構很頻繁,slab對這些小對象進行緩衝,可以重複利用,減少內存分配次數。