天天看點

每天一個Linux指令(43):vmstat

vmstat是Virtual Meomory Statistics(虛拟記憶體統計)的縮寫,可對linux系統的虛拟記憶體、程序、CPU活動進行監控。vmstat提供了一種低開銷的系統性能觀察方式,在非常高負荷的伺服器上,我們可以使用vmstat檢視并監控系統的健康情況。

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. 使用執行個體

例一:顯示虛拟記憶體的使用情況

# vmstat 5 6          // 在5秒時間内進行6次采樣。

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 3029876 199616 690980    0    0     0     2    3    2  0  0 100  0  0
 0  0      0 3029752 199616 690980    0    0     0    41 1009   39  0  0 100  0  0
 0  0      0 3029752 199616 690980    0    0     0     3 1004   36  0  0 100  0  0
 0  0      0 3029752 199616 690980    0    0     0     4 1004   36  0  0 100  0  0
 0  0      0 3029752 199616 690980    0    0     0     6 1003   33  0  0 100  0  0
 0  0      0 3029752 199616 690980    0    0     0     5 1003   33  0  0 100  0  0 
           

說明:

  • Procs(程序)

    r,運作隊列中的程序數量

    b,等待IO的程序數量

  • Memory

    swpd: 使用虛拟記憶體大小

    free: 可用記憶體大小

    buff: 用作緩沖的記憶體大小

    cache: 用作緩存的記憶體大小

  • Swap

    si,每秒從交換區寫到記憶體的大小

    so,每秒寫入交換區的記憶體大小

  • IO:(現在Linux版本塊的大小為1024bytes)

    bi,每秒讀取的塊數

    bo,每秒寫入的塊數

  • 系統

    in,每秒中斷數,包括時鐘中斷

    cs,每秒上下文切換數

  • CPU(以百分比表示)

    us,使用者程序執行時間(user time)

    sy,系統程序執行時間(system time)

    id,中央處理器的空閑時間(包括IO等待時間),以百分比表示

    wa,IO等待時間

備注: 如果r經常大于4,且id經常少于40,則表示CPU的負載很重;如果bi,bo 長期不等于0,則表示記憶體不足;如果disk經常不等于0,且在 b中的隊列大于3, 表示io性能不好。Linux在具有高穩定性、可靠性的同時,具有很好的可伸縮性和擴充性,能夠針對不同的應用和硬體環境,優化出目前應用需要的最佳性能。是以企業在維護Linux系統,進行系統調優時,了解系統性能分析工具是至關重要的。

例二:顯示活躍和非活躍記憶體

指令:

vmstat -a 2 5

# 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
 0  0      0 3029752 387728 513008    0    0     0     2    3    2  0  0 100  0  0
 0  0      0 3029752 387728 513076    0    0     0     0 1005   34  0  0 100  0  0
 0  0      0 3029752 387728 513076    0    0     0    22 1004   36  0  0 100  0  0
 0  0      0 3029752 387728 513076    0    0     0     0 1004   33  0  0 100  0  0
 0  0      0 3029752 387728 513076    0    0     0     0 1003   32  0  0 100  0  0
           

說明:使用-a選項,顯示活躍和非活躍記憶體時,所顯示的内容除了增加inact和active外,其他顯示内容與例一相同。

Memory

inact,非活躍記憶體大小(當使用-a選項時顯示)

active,活躍的記憶體大小(當使用-a選項時顯示)

例三:檢視系統已經fork了多少次

指令:

vmstat -f

# vmstat -f

 forks
           

說明:這個資料是從/proc/stat中的processes字段取得的。

例四:檢視記憶體使用的詳細資訊

指令:

vmstat -s

# vmstat -s

  total memory
  used memory
  active memory
  inactive memory
  free memory
  buffer memory
  swap cache
  total swap
  used swap
  free swap
 non-nice user cpu ticks
 nice user cpu ticks
 system cpu ticks
 idle cpu ticks
 IO-wait cpu ticks
 IRQ cpu ticks
 softirq cpu ticks
  stolen cpu ticks
 pages paged in
 pages paged out
 pages swapped in
 pages swapped out
 interrupts
 CPU context switches
 boot time
 forks 
           

說明:這些資訊的分别來自/proc/meminfo,/proc/stat,/proc/vmstat。

例五:檢視磁盤的讀/寫

指令:

vmstat -d

每天一個Linux指令(43):vmstat

說明:這些資訊主要來自/proc/diskstats。merged表示一次來自合并的寫/讀請求,系統一般會把多個連接配接/或鄰近的讀/寫請求合并到一起操作。

例六:檢視/dev/sda1磁盤的讀/寫

# df

檔案系統     K-塊        已用       可用        已用%    挂載點
/dev/sda3           %    /tmpfs                                   
                               %    /dev/shm
/dev/sda1                     %    /boot

# vmstat -p /dev/sda1

sda1      reads   read sectors  writes    requested writes
                             

# vmstat -p /dev/sda3

sda3      reads   read sectors  writes     requested writes
                    
           

說明:這些資訊主要來自于/proc/diskstats

reads,來自于這個分區讀的次數。

read sectors,來自于這個分區的讀扇區的次數。

writes,來自于這個分區的寫的次數。

requested writes,來自于這個分區的寫請求次數。

例七:檢視系統的slab資訊

指令:

vmstat -m

每天一個Linux指令(43):vmstat
每天一個Linux指令(43):vmstat

說明:這組資訊來自于/proc/slabinfo。

slab:由于核心會有許多小對象,這些對象構造銷毀十分頻繁,比如i-node,dentry,如果每次建構這些對象時,就向記憶體要一個頁(4kb),而它們實際隻有幾個位元組,這樣就會非常浪費。為了解決這個問題,linux引入了一種新的機制來處理在同一個頁框中如何配置設定小存儲區,而slab可以對小對象進行配置設定,這樣就不用為每一個對象配置設定頁框,進而節省了空間。slab對這些小對象進行緩沖,可以重複利用,減少記憶體配置設定次數。

5. linux記憶體管理機制

5.1 實體記憶體和虛拟記憶體的差別

我們知道,直接從實體記憶體讀寫資料要比從硬碟讀寫資料要快的多,是以我們希望所有資料的讀取和寫入都在記憶體中完成,而記憶體是有限的,這樣就引出了實體記憶體與虛拟記憶體的概念。

實體記憶體就是系統硬體提供的記憶體大小,是真正的記憶體。相對于實體記憶體,linux還有一個虛拟記憶體的概念。虛拟記憶體就是為了滿足實體記憶體的不足而提出的政策,它利用磁盤空間虛拟出的一塊邏輯記憶體,用作虛拟記憶體的磁盤空間被稱為交換空間(Swap Space)。

作為實體記憶體的擴充,linux會在實體記憶體不足時,使用交換分區的虛拟記憶體。更詳細的說,linux核心會将暫時不用的記憶體塊資訊寫入交換空間,這樣實體記憶體得到了釋放,就可以用于其它目的。當需要用到原始内容時,這些資訊會被系統從交換空間重新讀入實體記憶體中。

linux的記憶體管理采取的是分頁存取機制,為了保證實體記憶體得到充分的利用,在适當的時候,核心會将實體記憶體中不經常使用的資料塊自動交換到虛拟記憶體中,而将經常使用的資訊保留到實體記憶體中。

5.2 深入了解linux記憶體運作機制

首先,Linux系統會不時地進行頁面交換操作,以保持盡可能多的空閑實體記憶體。即使沒有什麼事情需要記憶體,Linux也會交換出暫時不用的記憶體頁面,這可以避免等待交換所需的時間。

其次,linux進行頁面交換是有條件的,不是所有頁面在不用時都交換到虛拟記憶體中。linux核心根據“最近最經常使用”算法,僅将一些不經常使用的頁面檔案交換到虛拟記憶體。有時我們會看到這樣一個現象:linux實體記憶體還有很多,但是交換空間也使用了很多。其實,這并不奇怪。例如,一個占用很大記憶體的程序運作時,需要耗費很多記憶體資源,此時就會有一些不常用的頁面檔案被交換到虛拟記憶體中。當這個占用很多記憶體資源的程序,運作結束并釋放了很多記憶體時,剛才被交換出去的頁面檔案并不會自動地交換進實體記憶體,除非有這個必要,此時系統實體記憶體就會空閑很多,同時交換空間也在被使用,就出現了剛才所說的現象了。

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

5. 3 虛拟記憶體原理

在系統中運作的每個程序都需要使用記憶體,但不是每個程序都需要一直使用系統配置設定的記憶體空間。當系統運作所需的記憶體超過實際的實體記憶體時,核心會釋放某些程序所占用但未使用的部分或所有實體記憶體。linux核心将這部分檔案存儲在磁盤上直到程序下一次調用,并将釋放出的實體記憶體提供給需要的程序使用。

在Linux記憶體管理中,主要通過“調頁Paging”和“交換Swapping”來完成上述的記憶體排程。調頁算法是将記憶體中最近不常使用的頁面交換到磁盤上,把活動頁面保留在實體記憶體中,以供程序使用。交換技術是将整個程序而不是部分頁面,全部交換到磁盤上。

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

當發現可運作記憶體變少時,系統核心會通過Page-Out,釋放一部分實體記憶體。盡管Page-Out不是經常發生,但如果Page-out頻繁不斷地發生,直到核心管理分頁的時間超過運作程序的時間時,系統性能就會急劇下降。這時,系統已經運作地非常慢或進入暫停狀态,這種狀态被稱作thrashing(颠簸)。

繼續閱讀