1. 程式人生 > >vmstat命令淺析

vmstat命令淺析

發送 調整 內存交換 mov 原理 目錄 大量 host 性能測試

  vmstat命令是最常見的Linux/Unix監控工具,可以展現給定時間間隔的服務器的狀態值,包括服務器的CPU使用率,內存使用,虛擬內存交換情況,IO讀寫情況。這個命令是我查看Linux/Unix最喜愛的命令,一個是Linux/Unix都支持,二是相比top,我可以看到整個機器的CPU,內存,IO的使用情況,而不是單單看到各個進程的CPU使用率和內存使用率(使用場景不一樣)。

一般vmstat工具的使用是通過兩個數字參數來完成的,第一個參數是采樣的時間間隔數,單位是秒,第二個參數是采樣的次數,如:

[[email protected] ~]# vmstat 2 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   
free buff cache si so bi bo in cs us sy id wa st 0 0 0 33700708 288784 30246748 0 0 14 49 3 8 0 0 98 2 0 0 0 0 33699328 288784 30247348 0 0 24 1176 3335 5641 1 0 97 2 0 0 0 0 33698944 288784 30247396 0 0 0 1498 3631 6062 1 0 98 1 0 0 0 0
33699056 288788 30247396 0 0 0 1110 3479 5904 1 0 98 1 0 0 0 0 33699612 288788 30247396 0 0 0 890 3427 5811 0 0 99 1 0

2表示每兩秒采集一次服務器狀態,5表示只采集一次。當然也可以不加後面的那個數字,那就默認持續采集,直到ctrl+c停止。

個個參數具體含義如下:

r 表示運行隊列(就是說多少個進程真的分配到CPU),當這個值超過了CPU數目,就會出現CPU瓶頸了。這個也和top的負載有關系,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,服務器的狀態很危險。top的負載類似每秒的運行隊列。如果運行隊列過大,表示CPU很繁忙,一般會造成CPU使用率很高。

b 表示阻塞的進程,進程阻塞。

swpd 虛擬內存已使用的大小,如果大於0,表示你的機器物理內存不足了,如果不是程序內存泄露的原因,那麽你該升級內存了或者把耗內存的任務遷移到其他機器。

free 空閑的物理內存的大小。

buff Linux/Unix系統被用來做為緩存的內存數。

cache cache直接用來記憶我們打開的文件,給文件做緩沖,我本機大概占用300多M(這裏是Linux/Unix的聰明之處,把空閑的物理內存的一部分拿來做文件和目錄的緩存,是為了提高 程序執行的性能,當程序使用內存時,buffer/cached會很快地被使用。)

si 每秒從磁盤讀入虛擬內存的大小,如果這個值大於0,表示物理內存不夠用或者內存泄露了,要查找耗內存進程解決掉。我的機器內存充裕,一切正常。

so 每秒虛擬內存寫入磁盤的大小,如果這個值大於0,同上。

bi 塊設備每秒接收的塊數量,這裏的塊設備是指系統上所有的磁盤和其他塊設備,默認塊大小是1024byte,我本機上沒什麽IO操作,所以一直是0,但是我曾在處理拷貝大量數據(2-3T)的機器上看過可以達到140000/s,磁盤寫入速度差不多140M每秒

bo 塊設備每秒發送的塊數量,例如我們讀取文件,bo就要大於0。bi和bo一般都要接近0,不然就是IO過於頻繁,需要調整。

in 每秒CPU的中斷次數,包括時間中斷

cs 每秒上下文切換次數,例如我們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目,例如在apache和nginx這種web服務器中,我們一般做性能測試時會進行幾千並發甚至幾萬並發的測試,選擇web服務器的進程可以由進程或者線程的峰值一直下調,壓測,直到cs到一個比較小的值,這個進程和線程數就是比較合適的值了。系統調用也是,每次調用系統函數,我們的代碼就會進入內核空間,導致上下文切換,這個是很耗資源,也要盡量避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導致CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。

us 用戶CPU時間,us的值比較高時,說明用戶進程消耗的cpu時間多,但是如果長期超過50%的使用,那麽就該考慮優化程序算法或其他措施了。

sy 系統CPU時間,如果太高,表示系統調用時間長,例如是IO操作頻繁。

id 空閑 CPU時間,一般來說,id + us + sy = 100,一般認為id是空閑CPU使用率,us是用戶CPU使用率,sy是系統CPU使用率。

wt 等待IO CPU時間。

常見問題處理

(1)如果r經常大於4,且id經常少於40,表示cpu的負荷很重。

(2)如果pi,po長期不等於0,表示內存不足。

(3)如果disk經常不等於0,且在b中的隊列大於3,表示io性能不好。

(4)如果在processes中運行的序列(process r)是連續的大於在系統中的CPU的個數表示系統現在運行比較慢,有多數的進程等待CPU。

(5)如果r的輸出數大於系統中可用CPU個數的4倍的話,則系統面臨著CPU短缺的問題,或者是CPU的速率過低,系統中有多數的進程在等待CPU,造成系統中進程運行過慢。

(6)如果空閑時間(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時間和一些後臺的程序,釋放內存的占用。

vmstat命令淺析