Linux性能分析之vmstat
1 vmstat簡介
vmstat是Virtual Meomory Statistics(虛拟記憶體統計)的縮寫,可對作業系統的虛拟記憶體、程序、CPU活動進行監控。是對系統的整體情況進行統計,不足之處是無法對某個程序進行深入分析。
CPU性能統計:
正在運作的程序個數;
CPU接收的終端個數;
排程器執行的上下文切換次數。
記憶體性能統計:
使用的了交換分區的大小;
實體記憶體是如何使用的;
剩餘空閑記憶體。
2 實體記憶體與虛拟記憶體的差別
我們知道,直接從實體記憶體讀寫資料要比從硬碟讀寫資料要快的多,是以,我們希望所有資料的讀取和寫入都在記憶體完成,而記憶體是有限的,這樣就引出了實體記憶體與虛拟記憶體的概念。
實體記憶體就是系統硬體提供的記憶體大小,是真正的記憶體,相對于實體記憶體,在linux下還有一個虛拟記憶體的概念,虛拟記憶體就是為了滿足實體記憶體的不足而提出的政策,它是利用磁盤空間虛拟出的一塊邏輯記憶體,用作虛拟記憶體的磁盤空間被稱為交換空間(Swap Space)。
作為實體記憶體的擴充,linux會在實體記憶體不足時,使用交換分區的虛拟記憶體,更詳細的說,就是核心會将暫時不用的記憶體塊資訊寫到交換空間,這樣以來,實體記憶體得到了釋放,這塊記憶體就可以用于其它目的,當需要用到原始的内容時,這些資訊會被重新從交換空間讀入實體記憶體。
linux的記憶體管理采取的是分頁存取機制,為了保證實體記憶體能得到充分的利用,核心會在适當的時候将實體記憶體中不經常使用的資料塊自動交換到虛拟記憶體中,而将經常使用的資訊保留到實體記憶體。
要深入了解linux記憶體運作機制,需要知道下面提到的幾個方面:
首先,Linux系統會不時的進行頁面交換操作,以保持盡可能多的空閑實體記憶體,即使并沒有什麼事情需要記憶體,Linux也會交換出暫時不用的記憶體頁面。這可以避免等待交換所需的時間。
其次,linux進行頁面交換是有條件的,不是所有頁面在不用時都交換到虛拟記憶體,linux核心根據”最近最經常使用“算法,僅僅将一些不經常使用的頁面檔案交換到虛拟記憶體,有時我們會看到這麼一個現象:linux實體記憶體還有很多,但是交換空間也使用了很多。其實,這并不奇怪,例如,一個占用很大記憶體的程序運作時,需要耗費很多記憶體資源,此時就會有一些不常用頁面檔案被交換到虛拟記憶體中,但後來這個占用很多記憶體資源的程序結束并釋放了很多記憶體時,剛才被交換出去的頁面檔案并不會自動的交換進實體記憶體,除非有這個必要,那麼此刻系統實體記憶體就會空閑很多,同時交換空間也在被使用,就出現了剛才所說的現象了。關于這點,不用擔心什麼,隻要知道是怎麼一回事就可以了。
最後,交換空間的頁面在使用時會首先被交換到實體記憶體,如果此時沒有足夠的實體記憶體來容納這些頁面,它們又會被馬上交換出去,如此以來,虛拟記憶體中可能沒有足夠空間來存儲這些交換頁面,最終會導緻linux出現假當機、服務異常等問題,linux雖然可以在一段時間内自行恢複,但是恢複後的系統已經基本不可用了。
是以,合理規劃和設計linux記憶體的使用,是非常重要的。
3 虛拟記憶體原理
在系統中運作的每個程序都需要使用到記憶體,但不是每個程序都需要每時每刻使用系統配置設定的記憶體空間。當系統運作所需記憶體超過實際的實體記憶體,核心會釋放某些程序所占用但未使用的部分或所有實體記憶體,将這部分資料存儲在磁盤上直到程序下一次調用,并将釋放出的記憶體提供給有需要的程序使用。
在Linux記憶體管理中,主要是通過“調頁Paging”和“交換Swapping”來完成上述的記憶體排程。調頁算法是将記憶體中最近不常使用的頁面換到磁盤上,把活動頁面保留在記憶體中供程序使用。交換技術是将整個程序,而不是部分頁面,全部交換到磁盤上。
分頁(Page)寫入磁盤的過程被稱作Page-Out,分頁(Page)從磁盤重新回到記憶體的過程被稱作Page-In。當核心需要一個分頁時,但發現此分頁不在實體記憶體中(因為已經被Page-Out了),此時就發生了分頁錯誤(Page Fault)。
當系統核心發現可運作記憶體變少時,就會通過Page-Out來釋放一部分實體記憶體。盡管Page-Out不是經常發生,但是如果Page-out頻繁不斷的發生,直到當核心管理分頁的時間超過運作程式的時間時,系統效能會急劇下降。這時的系統已經運作非常慢或進入暫停狀态,這種狀态亦被稱作thrashing(颠簸)。
4 vmstat指令用法
[email protected]:~# vmstat -h
用法:
vmstat [options] [delay [count]]
選項:
-a, --active active/inactive memory
-f, --forks number of forks since boot
-m, --slabs slabinfo
-n, --one-header do not redisplay header
-s, --stats event counter statistics
-d, --disk disk statistics
-D, --disk-sum summarize disk statistics
-p, --partition <dev> partition specific statistics
-S, --unit <char> define display unit
-w, --wide wide output
-t, --timestamp show timestamp
-h, --help 顯示此幫助然後離開
-V, --version 顯示程式版本然後離開
欲了解更多詳細資訊,請參見 vmstat(8)。
參數詳解:
參數 用法
-a, --actice 顯示活躍和非常活躍記憶體
-f, --forks 顯示從系統啟動至今fork的數量
-m, --slabs 顯示slabinfo
-n, --one-header 隻在開始顯示一次各字段名稱。
-s, --stats 顯示記憶體相關統計資訊及多種系統活動數量。
-d, --disk 顯示磁盤的統計資訊。
-D, --disk-sum 顯示所有磁盤的統計資訊。
-p, --parttion <dev> 顯示指定磁盤分區的統計資訊。
-S, --uint <char> 使用指定機關顯示。參數有k、K、m、M,分别代表為1000、1024、1000_000、1048576位元組(byte)。預設機關為K(1024byte)。
-w, --wide 顯示寬度加大。
-t, --timestamp 增加顯示目前系統時間。
-h, --help 擷取vmstat幫助資訊。
-v, --version 顯示vmstat版本資訊。
delay 重新整理時間間隔。若不指定,隻顯示一條結果。
count 重新整理的次數。若不指定重新整理次數,隻指定了重新整理時間間隔,将無限重新整理。
5 vmstat字段含義說明
6 vmstat使用示例
6.1 每隔n秒進行m次采樣
例如:vmstat 1 5(每隔1秒進行5次采樣)
6.2 顯示活躍與非活躍記憶體
vmstat –a 1 5
6.3 顯示從系統啟動至今的fork數量
vmstat -f
【說明】linux下建立程序的系統調用是fork
6.4 顯示記憶體使用的詳細資訊
vmstat –s
【說明】顯示記憶體相關統計資訊及多種系統活動數量
6.5 檢視硬碟的讀/寫的統計資訊
vmstat –d
【說明】這些資訊主要來自于/proc/diskstats
6.6 檢視某硬碟分區的讀/寫的統計資訊
vmstat –p /dev/sdb1
6.7 檢視系統的slab資訊
vmstat -m
【說明】這些資訊主要來自于/proc/slabinfo
slab:由于核心會有許多小對象,這些對象構造銷毀十分頻繁,比如i-node,dentry,這些對象如果每次建構的時候就向記憶體要一個頁(4kb),這樣就會非常浪費,為了解決這個問題,就引入了一種新的機制來處理在同一個頁框中如何配置設定小存儲區,而slab可以對小對象進行配置設定,這樣就不用為每一個對象配置設定頁框,進而節省了空間,核心對一些小對象建立析構很頻繁,slab對這些小對象進行緩沖,可以重複利用,減少記憶體配置設定次數。