一、前言
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.使用說明
例子1:每3秒輸出一條結果
字段說明:
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:顯示活躍和非活躍內存
使用-a選項顯示活躍和非活躍內存時,所顯示的內容除增加inact和active外,其他顯示內容與例子1相同。
字段說明:
Memory(內存):
inact: 非活躍內存大小(當使用-a選項時顯示)
active: 活躍的內存大小(當使用-a選項時顯示)
3.字段含義說明:
類別 |
項目 |
含義 |
說明 |
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.
六、總結
目前說來,對於服務器監控有用處的度量主要有:
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)
如果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時間和一些后台的程序,釋放內存的占用。
注意:如果r經常大於4 ,且id經常少於40,表示cpu的負荷很重。如果bi,bo 長期不等於0,表示內存不足。
當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)
如果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時間和一些后台的程序,釋放內存的占用。