Linux監控工具vmstat命令詳解

一、前言

很顯然從名字中我們就可以知道vmstat是一個查看虛擬內存(Virtual Memory)使用狀況的工具,但是怎樣通過vmstat來發現系統中的瓶頸呢?在回答這個問題前,還是讓我們回顧一下Linux中關於虛擬內存相關內容。

二、虛擬內存原理

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

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

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

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

三、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]

-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版本信息。
2.使用說明

例子1:每2秒輸出一條結果

procs   -------------------------------memory-------------------------------   -----swap-------       --------io------------   ---system---   -----cpu------------------

r      b   swpd          free               buff                  cache                 si               so         bi             bo         in        cs         us   sy    id   wa   st

字段說明:

Procs(進程):

r: 運行隊列中進程數量,這個值也可以判斷是否需要增加CPU。(長期大於1)
b: 等待IO的進程數量

Memory(內存):

swpd: 使用虛擬內存大小

注意:如果swpd的值不爲0,但是SI,SO的值長期爲0,這種情況不會影響系統性能。
free: 空閒物理內存大小
buff: 用作緩衝的內存大小
cache: 用作緩存的內存大小

注意:如果cache的值大的時候,說明cache處的文件數多,如果頻繁訪問到的文件都能被cache處,那麼磁盤的讀IO bi會非常小。

Swap:

si: 每秒從交換區寫到內存的大小,由磁盤調入內存
so: 每秒寫入交換區的內存大小,由內存調入磁盤

注意:內存夠用的時候,這2個值都是0,如果這2個值長期大於0時,系統性能會受到影響,磁盤IO和CPU資源都會被消耗。有些朋友看到空閒內存(free)很少的或接近於0時,就認爲內存不夠用了,不能光看這一點,還要結合si和so,如果free很少,但是si和so也很少(大多時候是0),那麼不用擔心,系統性能這時不會受到影響的。

IO:(現在的Linux版本塊的大小爲1kb)

bi: 每秒讀取的塊數
bo: 每秒寫入的塊數

注意:隨機磁盤讀寫的時候,這2個值越大(如超出1024k),能看到CPU在IO等待的值也會越大。

系統:

in: 每秒中斷數,包括時鐘中斷。
cs: 每秒上下文切換數。

注意:上面2個值越大,會看到由內核消耗的CPU時間會越大。

CPU(以百分比表示):

us: 用戶進程執行時間百分比(user time)

注意: us的值比較高時,說明用戶進程消耗的CPU時間多,但是如果長期超50%的使用,那麼我們就該考慮優化程序算法或者進行加速。

sy: 內核系統進程執行時間百分比(system time)

注意:sy的值高時,說明系統內核消耗的CPU資源多,這並不是良性表現,我們應該檢查原因。

wa: IO等待時間百分比

注意:wa的值高時,說明IO等待比較嚴重,這可能由於磁盤大量作隨機訪問造成,也有可能磁盤出現瓶頸(塊操作)。

id: 空閒時間百分比

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

procs   -------------------------------memory-------------------------------   -----swap-------       --------io------------   ---system---   -----cpu------------------

r      b   swpd          free               inact                   active                 si               so         bi             bo         in        cs         us   sy    id   wa   st

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

字段說明:

Memory(內存):

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

總結:

目前說來,對於服務器監控有用處的度量主要有:

r(運行隊列)
pi(頁導入)
us(用戶CPU)
sy(系統CPU)
id(空閒)
注意:如果r經常大於4 ,且id經常少於40,表示cpu的負荷很重。如果bi,bo 長期不等於0,表示內存不足。

通過VMSTAT識別CPU瓶頸:
r(運行隊列)展示了正在執行和等待CPU資源的任務個數。當這個值超過了CPU數目,就會出現CPU瓶頸了。

Linux下查看CPU核心數的命令:
cat /proc/cpuinfo|grep processor|wc -l

當r值超過了CPU個數,就會出現CPU瓶頸,解決辦法大體幾種:

1. 最簡單的就是增加CPU個數和核數
2. 通過調整任務執行時間,如大任務放到系統不繁忙的情況下進行執行,進爾平衡系統任務
3. 調整已有任務的優先級

通過vmstat識別CPU滿負荷:

首先需要聲明一點的是,vmstat中CPU的度量是百分比的。當us+sy的值接近100的時候,表示CPU正在接近滿負荷工作。但要注意的是,CPU 滿負荷工作並不能說明什麼,Linux總是試圖要CPU儘可能的繁忙,使得任務的吞吐量最大化。唯一能夠確定CPU瓶頸的還是r(運行隊列)的值。

通過vmstat識別RAM瓶頸:

數據庫服務器都只有有限的RAM,出現內存爭用現象是Oracle的常見問題。

首先用free查看RAM的數量:
[oracle@oracle-db02 ~]$ free
total       used       free     shared    buffers     cached
Mem:       2074924    2071112       3812          0      40616    1598656
-/+ buffers/cache:     431840    1643084
Swap:      3068404     195804    2872600

當內存的需求大於RAM的數量,服務器啓動了虛擬內存機制,通過虛擬內存,可以將RAM段移到SWAP DISK的特殊磁盤段上,這樣會 出現虛擬內存的頁導出和頁導入現象,頁導出並不能說明RAM瓶頸,虛擬內存系統經常會對內存段進行頁導出,但頁導入操作就表明了服務器需要更多的內存了, 頁導入需要從SWAP DISK上將內存段複製回RAM,導致服務器速度變慢。

解決的辦法有幾種:

1. 最簡單的,加大RAM;
2. 改小SGA,使得對RAM需求減少;
3. 減少RAM的需求。(如:減少PGA)

參考文檔,本人做了相關修改和說明:

http://hi.baidu.com/imlidapeng/blog/item/51872329329ab8335243c1c9.html

http://qa.taobao.com/?p=2269

永久鏈接 : http://www.ha97.com/4512.html

轉自:http://blog.csdn.net/yq495/article/details/8133559

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章