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。
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]
用來顯示虛擬記憶體的資訊
-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版本資訊。命令:
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
次取樣。將得到一個資料彙總他能夠反映真正的系統情況。
命令:
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
選項顯示活躍和非活躍記憶體時,所顯示的內容除增加inact
和active
外,其他顯示內容與例子1相同。
欄位說明:
Memory
(記憶體):inact
: 非活躍記憶體大小(當使用-a選項時顯示)active
: 活躍的記憶體大小(當使用-a選項時顯示)命令:
vmstat -f
輸出:
[yiibai@localhost ~]$ vmstat -f
2436 forks
[yiibai@localhost ~]$ vmstat -f
2437 forks
說明:這個資料是從/proc/stat
中的processes
欄位裡取得。
命令:
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
。
命令:
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
:表示一次來自於合併的寫/讀請求,一般系統會把多個連線/鄰近的讀/寫請求合併到一起來操作.
命令執行及輸出:
[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
:來自於這個分割區的寫請求次數。命令:
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-node
,dentry
,這些物件如果每次構建的時候就向記憶體要一個頁(4kb),而其實只有幾個位元組,這樣就會非常浪費,為了解決這個問題,就引入了一種新的機制來處理在同一個頁框中如何分配小儲存區,而slab可以對小物件進行分配,這樣就不用為每一個物件分配頁框,從而節省了空間,核心對一些小物件建立解構很頻繁,slab對這些小物件進行緩衝,可以重複利用,減少記憶體分配次數。