Linux vmstat命令詳解


一、vmstat命令介紹

  vmstat主要是用來檢測虛擬內存的,可以展現給定時間間隔的服務器的狀態值,包括CPU使用率內存使用率虛擬內存交換情況IO讀寫情況等。一般vmstat工具的使用是通過兩個數字參數來完成的,第一個參數是采樣的時間間隔數,單位是秒,第二個參數是采樣的次數,如:

➜  test vmstat 2 1       #2表示每隔兩秒采集一次服務器狀態,1表示只采集一次
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 5403744 445268 8211656    0    0     0     7    0    0  1  2 97  0  0

在實際應用過程中,我們會在一段時間內一直監控,不想監控直接結束vmstat就行了,例如:

➜  test vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 5397244 445268 8221524    0    0     0     7    0    0  1  2 97  0  0
 1  0      0 5394448 445268 8221568    0    0     0   114 4273 7854  1  2 98  0  0
 0  0      0 5394300 445268 8221580    0    0     0     2 3590 6823  0  1 98  0  0
 0  0      0 5392520 445268 8221580    0    0     0    32 4232 7807  0  2 98  0  0
 0  0      0 5392516 445268 8221688    0    0     0    66 4400 8066  1  2 98  0  0

上面的命令表示vmstat每2秒采集一次數據,一直采集,直到我結束程序。vmstat命令常用的選項如下:

選項 功能
-a 顯示活躍和非活躍內存
-f 顯示從系統啟動至今的fork數量
-m 顯示slabinfo
-s 顯示內存相關統計信息及多種系統活動數量
-d 顯示磁盤相關的統計信息
-S 使用指定單位顯示。參數有 k 、K 、m 、M ,分別代表1000、1024、1000000、1048576字節(Byte),默認單位為K(1024 Bytes)
delay 刷新時間間隔,如果不指定,只顯示一條結果
count 刷新次數,如果不指定刷新次數,但指定了刷新時間間隔,這時刷新次數為無窮

1.1、vmstat各個參數的含義

procs

r:運行隊列中進程的數量,這些進程都是可運行狀態,都在等待CPU的分配

  解釋:當這個值超過了CPU數目,就會出現CPU瓶頸,如果運行隊列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高

b:被blocked(阻塞)的進程數,正在等待IO

memory

swpd:使用的虛擬內存的大小,單位是KB

  解釋:如果該值大於0,表示你的機器物理內存不足了,如果不是程序內存泄露的原因,那么你該升級內存了或者把耗內存的任務遷移到其他機器

free:可用的物理內存大小,單位是KB

buff:物理內存用來緩存讀寫操作的buffer大小,單位是KB

cache:物理內存用來緩存進程地址空間的cache大小,單位是KB

swap

si(換入):每秒從SWAP(交換分區)讀入到RAM(swap in)的大小,單位是KB

so(換出):每秒從RAM寫出到SWAP(swap out)的大小,單位是KB

  解釋:內存夠用的時候,這2個值都是0,如果這2個值長期大於0時,系統性能會受到影響。有些朋友看到空閑內存(free)很少時,就認為內存不夠用了,不能光看這一點,還要結合si和so,如果free很少,但是si和so也很少(大多時候是0),那么不用擔心,系統性能這時不會受到影響。

io

bi:每秒從文件系統或SWAP讀入到RAM(blocks in)的塊數,block(1KB磁盤塊)為單位

bo:每秒從RAM寫出到文件系統或SWAP(blocks out)的塊數,block(1KB磁盤塊)為單位

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

system

in:每秒的中斷數

cs:系統每秒進行上下文切換的次數

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

cpu

us:用戶空間占用CPU的百分比

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

sy:內核空間占用CPU的百分比

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

id:CPU空閑的百分比

wa:CPU等待IO的百分比

  解釋:wa的值高時,說明CPU等待IO的時間比較多,這可能是大量的磁盤隨機訪問造成的,也有可能是磁盤出現瓶頸。

st:來自於虛擬機偷取的CPU所占的百分比

1.2、vmstat命令使用實例

【例1】顯示活躍和非活躍內存

➜  test vmstat -a 1    #每秒輸出一次信息
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 5388064 4919824 3586956    0    0     0     7    0    1  1  2 97  0  0
 1  0      0 5388072 4919824 3587040    0    0     0     0 3607 6841  1  1 98  0  0
 0  0      0 5387824 4919836 3587388    0    0     0     0 3761 7198  1  2 98  0  0
 1  0      0 5387824 4919836 3587388    0    0     0     0 3558 6897  1  1 98  0  0
 1  0      0 5389012 4919852 3587388    0    0     0     0 3699 6932  1  2 98  0  0

二、虛擬內存相關知識

  在系統中運行的每個進程都需要使用到內存,但並不是所有的進程每時每刻都會使用到內存。當系統運行所需內存超過實際的物理內存時,系統內核會釋放某些進程所占用但未使用的部分或所有物理內存,將這部分數據存儲在磁盤上直到進程下一次調用,並將釋放出的內存提供給有需要的進程使用。在Linux內存管理中,主要是通過“調頁Paging”和“交換Swapping”來完成上述的內存調度。調頁算法是將內存中最近不常使用的頁面換到磁盤上,把活動頁面保留在內存中供進程使用。而交換是將整個進程,而不是部分頁面,全部交換到磁盤上。分頁(Page)寫入磁盤的過程被稱作Page-Out,分頁(Page)從磁盤重新回到內存的過程被稱作Page-In。當內核需要一個分頁時,但發現此分頁不在物理內存中(因為已經被Page-Out了),此時就發生了分頁錯誤(Page Fault)。當系統內核發現可運行內存變少時,就會通過Page-Out來釋放一部分物理內存。盡管Page-Out不是經常發生,但是如果Page-Out頻繁不斷地發生,直到當內核管理分頁的時間超過了運行程序的時間時,系統性能會急劇下降。這時的系統已經運行的非常慢或進入暫停狀態,這種狀態也被稱作thrashing(顛簸)。

三、總結

  vmstat是一個服務器監控命令,通過vmstat可以看到CPU和內存的使用情況。目前說來,對於服務器監控有用處的度量主要有:

  • r(運行隊列)
  • pi(頁導入)
  • us(用戶CPU)
  • sy(系統CPU)
  • id(空閑CPU)

通過vmstat來識別CPU瓶頸

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

Linux下查看CPU核心數命令

cat /proc/cpuinfo|grep processor|wc -l

解決CPU瓶頸的辦法如下

1. 增加CPU個數或核數(推薦)

2. 調整任務的執行時間,如把大任務放到系統不繁忙的時候進行,進而平衡系統的任務。

3. 調整已有任務的優先級

通過vmstat識別CPU滿負荷:

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

通過vmstat識別內存瓶頸:

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

解決內存瓶頸的辦法如下

1. 最簡單的,增加內存(推薦)

2. 改小SGA,使得對內存的需求減少

3. 改小PGA,使得對內存的需求減少


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM