一、前言
vmstat命令: 用來獲得有關進程、虛存、頁面交換空間及 CPU活動的信息。這些信息反映了系統的負載情況
二、虛擬內存運行原理
在系統中運行的每個進程都需要使用到內存,但不是每個進程都需要每時每刻使用系統分配的內存空間。當系統運行所需內存超過實際的物理內存,內核會釋放某些進程所占用但未使用的部分或所有物理內存,將這部分資料存儲在磁盤上直到進程下一次調用,並將釋放出的內存提供給有需要的進程使用。
在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.字段含義說明:
類別 |
項目 |
含義 |
說明 |
Procs(進程) |
r |
等待執行的任務數 |
展示了正在執行和等待cpu資源的任務個數。當這個值超過了cpu個數,就會出現cpu瓶頸。 |
B |
等待IO的進程數量 |
|
|
Memory(內存) |
swpd |
正在使用虛擬的內存大小,單位k |
|
free |
空閑內存大小 |
|
|
buff |
已用的buff大小,對塊設備的讀寫進行緩沖 |
|
|
cache |
已用的cache大小,文件系統的cache |
|
|
inact |
非活躍內存大小,即被標明可回收的內存,區別於free和active |
具體含義見:概念補充(當使用-a選項時顯示) |
|
active |
活躍的內存大小 |
具體含義見:概念補充(當使用-a選項時顯示) |
|
Swap |
si |
每秒從交換區寫入內存的大小(單位:kb/s) |
|
so |
每秒從內存寫到交換區的大小 |
|
|
IO |
bi |
每秒讀取的塊數(讀磁盤) |
現在的Linux版本塊的大小為1024bytes |
bo |
每秒寫入的塊數(寫磁盤) |
|
|
system |
in |
每秒中斷數,包括時鍾中斷 |
這兩個值越大,會看到由內核消耗的cpu時間會越多 |
cs |
每秒上下文切換數 |
||
CPU(以百分比表示) |
Us |
用戶進程執行消耗cpu時間(user time) |
us的值比較高時,說明用戶進程消耗的cpu時間多,但是如果長期超過50%的使用,那么我們就該考慮優化程序算法或其他措施了 |
Sy |
系統進程消耗cpu時間(system time) |
sys的值過高時,說明系統內核消耗的cpu資源多,這個不是良性的表現,我們應該檢查原因。 |
|
Id |
空閑時間(包括IO等待時間) |
|
|
wa |
等待IO時間 |
Wa過高時,說明io等待比較嚴重,這可能是由於磁盤大量隨機訪問造成的,也有可能是磁盤的帶寬出現瓶頸。 |
四、常見問題處理
如果r經常大於4,且id經常少於40,表示cpu的負荷很重。
如果pi,po長期不等於0,表示內存不足。
如果disk經常不等於0,且在b中的隊列大於3,表示io性能不好。
1.)如果在processes中運行的序列(process r)是連續的大於在系統中的CPU的個數表示系統現在運行比較慢,有多數的進程等待CPU。
2.)如果r的輸出數大於系統中可用CPU個數的4倍的話,則系統面臨着CPU短缺的問題,或者是CPU的速率過低,系統中有多數的進程在等待CPU,造成系統中進程運行過慢。
3.)如果空閑時間(cpu id)持續為0並且系統時間(cpu sy)是用戶時間的兩倍(cpu us)系統則面臨着CPU資源的短缺。
解決辦法:
當發生以上問題的時候請先調整應用程序對CPU的占用情況.使得應用程序能夠更有效的使用CPU.同時可以考慮增加更多的CPU. 關於CPU的使用情況還可以結合mpstat, ps aux top prstat –a等等一些相應的命令來綜合考慮關於具體的CPU的使用情況,和那些進程在占用大量的CPU時間.一般情況下,應用程序的問題會比較大一些.比如一些sql語句不合理等等都會造成這樣的現象.
內存問題現象:
內存的瓶頸是由scan rate (sr)來決定的.scan rate是通過每秒的始終算法來進行頁掃描的.如果scan rate(sr)連續的大於每秒200頁則表示可能存在內存缺陷.同樣的如果page項中的pi和po這兩欄表示每秒頁面的調入的頁數和每秒調出的頁數.如果該值經常為非零值,也有可能存在內存的瓶頸,當然,如果個別的時候不為0的話,屬於正常的頁面調度這個是虛擬內存的主要原理.
解決辦法:
1.調節applications & servers使得對內存和cache的使用更加有效.
2.增加系統的內存.
3. Implement priority paging in s in pre solaris 8 versions by adding line "set priority paging=1" in /etc/system. Remove this line if upgrading from Solaris 7 to 8 & retaining old /etc/system file.
關於內存的使用情況還可以結ps aux top prstat –a等等一些相應的命令來綜合考慮關於具體的內存的使用情況,和那些進程在占用大量的內存.一般情況下,如果內存的占用率比較高,但是,CPU的占用很低的時候,可以考慮是有很多的應用程序占用了內存沒有釋放,但是,並沒有占用CPU時間,可以考慮應用程序,對於未占用CPU時間和一些后台的程序,釋放內存的占用。
五、概念補充
Free memory
This is RAM that's not being used.
Wired memory
Information in this memory can't be moved to the hard disk, so it must stay in RAM. The amount of Wired memory depends on the applications you are using.
Active memory
This information is currently in memory, and has been recently used.
Inactive memory
This information in memory is not actively being used, but was recently used.
For example, if you've been using Mail and then quit it, the RAM that Mail was using is marked as Inactive memory. This Inactive memory is available for use by another application, just like Free memory. However, if you open Mail before its Inactive memory is used by a different application, Mail will open quicker because its Inactive memory is converted to Active memory, instead of loading Mail from the slower hard disk.