vmstat : virtual memory
statistics(虛拟記憶體統計),vmstat指令是最常見的Linux/Unix監控工具,可以展現給定時間間隔的伺服器的狀态值,包括伺服器的CPU使用率,記憶體使用率,虛拟記憶體交換情況,IO讀寫情況。這個指令在Linux/Unix系統都支援,相對于top指令,vmstat可以看到整個CPU,memory,
IO的使用情況,而不是單單看到各個程序的資源使用率.
(并不是說vmstat指令比top好,不用場景的應用不一樣而已)。
一般vmstat工具的使用是通過兩個數字參數來完成的,第一個參數是采樣的時間間隔,機關是秒;第二個參數是采樣的次數,如:
[email protected]:~# vmstat2 1
procs -----------memory-------------------
---swap-- -----io---- -system------cpu----
r b
swpd
free buff
cache
si so
bi
bo in
cs
us sy id wa
1 0
0 3498472 315836
3819540
0 0
1 2
0 0
100 0
2表示每2秒采集一次伺服器狀态,1表示隻采集一次。
在實際應用過程中,我們會在一段時間内一直監控,不想監控的時候直接結束vmstat,例如:
[email protected]:~# vmstat 2
procs-----------memory---------- ---swap-------io----
-system-- ----cpu----
r b
swpd
free
buff
cache si
so
bi bo
in
cs us
sy
id wa
1 0
0 3499840
315836 3819660
0 0
1 2
0 0
100 0
0 0
0 3499584
315836
3819660
0 0
0 88
158
0 0
100 0
0 0
0 3499708
315836
3819660
0 0
2 86
162
0 0
100 0
0 0
0 3499708
315836
3819660
0 0
10 81
151
0 0
100 0
1
0 3499732
315836
3819660
0 0
2
83 154
0 100
上面表示每2秒采集一次資料,一直采集,直到手動結束,上面采集了5次就結束了
接下來分析每一個字段傳回值:
PROCS
r : (run)
CPU運作隊列,cpu在機關時間内所能處理的程序數越高,那它的性能應該就越高。但是關于這個負載,網上很說法,有的說r值不應該超過cpu的核心數量;有的說r值不應該超過cpu核心數量的2倍;有的說不能超過cpu核心數量的3倍。其實每種說法都是對的,都是擔心cpu承受不住,但上面說法不完全正确。關于這個數,我們應該根據目前的應用系統來判斷。最主要的判斷是cpu在達到一定程度負載的時候,系統能夠運作良好。如果cpu的負載都超過核心數的好幾倍了但是軟體還依然運作流暢,那這個也是可以有的。
b :
(block)表示阻塞的程序,當運作隊列r值的數量逐漸增加,達到了一定值的時候,程序就會被移動到b裡面。理論上講,blocked的值會一直增加,直到系統崩潰。
MEMORY
swpd : (swap
disk)虛拟記憶體已使用的大小,如果大于0,表示你的機器實體記憶體不足了,如果不是記憶體洩露的原因,那麼該更新記憶體或者把耗記憶體的任務遷移到其他機器
記憶體洩露:用動态存儲配置設定函數動态開辟的空間,在使用完畢後未釋放,結果導緻一直占據該記憶體單元。直到程式結束。(其實說白了就是該記憶體空間使用完畢之後未回收)即所謂記憶體洩漏。
記憶體洩漏形象的比喻是“作業系統可提供給所有程序的存儲空間正在被某個程序榨幹”,最終結果是程式運作時間越長,占用存儲空間越來越多,最終用盡全部存儲空間,整個系統崩潰。是以“記憶體洩漏”是從作業系統的角度來看的。這裡的存儲空間并不是指實體記憶體,而是指虛拟記憶體大小,這個虛拟記憶體大小取決于磁盤交換區設定的大小。由程式申請的一塊記憶體,如果沒有任何一個指針指向它,那麼這塊記憶體就洩漏了。
free
:空閑的實體記憶體的大小
buff :
linux/unix系統是用來存儲目錄裡面有什麼内容權限等 的緩存
cache
:直接用來記憶我們打開的檔案,給檔案做緩沖,這裡是Linux/Unix的聰明之處,把空閑的實體記憶體的一部分拿來做檔案和目錄的緩存,是為了提高程式執行的能力,當程式使用記憶體時,buffer/cached會很快地被使用
1.A buffer is something that has yet to be "written" to
disk.
2.A cache is something that has been "read" from the disk and
stored for later use.
Cache:由于cpu的速度遠高于主記憶體,cpu直接從記憶體中存取資料要等待一定的時間周期,Cache中儲存着CPU剛用過或循環使用的一部分資料,當CPU再次使用該部分資料時可從Cache中直接調用,這樣就減少了CPU的等待時間,提高了系統的效率。
Cache又分為一級Cache(L1 Cache)和二級Cache(L2 Cache),L1 Cache內建在CPU内部,L2
Cache早期一般是焊在主機闆上,現在也都內建在CPU内部,常見的容量有256KB或512KB L2 Cache。
Buffer:緩沖區,一個用于存儲速度不同步的裝置或優先級不同的裝置之間傳輸資料的區域。通過緩沖區,可以使程序之間的互相等待變少,進而使從速度慢的裝置讀入資料時,速度快的裝置的操作程序不發生間斷。
SWAP
si : (swap
in) 每秒從磁盤讀入虛拟記憶體的大小,如果這個值大于0,表示實體記憶體不夠用或者記憶體洩露了,要查找耗記憶體的程序解決掉.
so : (swap
out)每秒虛拟記憶體寫入磁盤的大小,如果這個值大于0,同上。。。
I/O
bi : (block
in)塊裝置每秒接受的塊數量(機關:KB/秒),這裡的塊裝置是指系統上所有的磁盤和其他塊裝置,預設塊大小為1024byte,上面例子中沒有io操作,
bo : (block
out) 塊裝置每秒發送的塊數量(機關:KB/秒),例如我們讀取檔案,bo就要大于0,bi和bo一般都很接近0,不然就是IO過于頻繁,需要調整。
塊裝置:系統中能夠随機(不需要按順序)通路固定大小資料片(chunks)的裝置被稱作塊裝置,這些資料片就稱作塊。最常見的塊裝置是硬碟、軟碟、CD
ROM、閃存等。他們都是以安裝檔案系統的方式使用的,這也是塊裝置一般的通路方式。
字元裝置:字元裝置按照字元流的方式被有序通路,像序列槽和鍵盤就都屬于字元裝置。如果一個硬體裝置是以字元流的方式被通路的話,那就應該将它歸于字元裝置,反過來,如果一個裝置是随機(無序的)通路的,那麼它就屬于塊裝置。
SYSTEM
in :
(interrupt) 每秒CPU的中斷次數,包括中斷時間。
cs : (context
switch) 每秒上下文切換次數,例如我們調用系統函數,就要進行上下文切換,線程的切換,也要程序上下文切換,這個值越小越好,太大了,要考慮調低線程或者程序的數目。例如在web伺服器中,做性能的時候,常常會進行幾千甚至上萬并發的測試,選擇web伺服器的程序可以由程序或者線程的峰值一直下調,壓測,直到cs到一個比較小的值,這個程序和線程就是比較合适的值了。系統調用也是,每次調用函數,我們的代碼就會進入核心空間,導緻上下文切換,這個很耗資源,也要盡量避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導緻CPU幹正事的時間少,CPU沒有充分利用,是不可取的。
CPU
us : (user
time) 使用者CPU時間,
sy : (system
time)系統時間
id :
(idle) 空閑CPU時間
wa : (wait
time) 等待IO 的CPU時間,wa值越高,說明IO等待越嚴重。如果wa值超過20%,說明IO等待嚴
重
如果一個CPU被充分利用的話,使用率分類之間均衡的比例應該是:
user time :65%-70%
system time :30%-35%
idle time :0%-5%
一般情況 us+sy+id=100
通過vmstat識别CPU瓶頸
如果r經常大于3,且id經常少于40,表示CPU的負荷很重。
如果空閑時間(cpu id)持續為0并且系統時間(cpu sy)是使用者時間的兩倍(cpu
us),系統則面臨着cpu資源的短缺。
當cpu出現瓶頸的解決辦法
1. 最簡單的就是增加CPU個數、
2. 通過調整任務時間,如大任務放到系統不繁忙的情況下執行,進而平衡系統
3. 調整已有任務的優先級
首先表明,vmstat中的cpu的度量是百分比,當us+sy的值接近100時,表示cpu正在接近滿負荷工作,cpu滿負荷工作并不能說明什麼,Unix總是試圖盡可能的繁忙,使得任務的吞吐量最大化。唯一能夠确定cpu瓶頸的還是r值。
通過vmstat識别IO瓶頸
如果disk經常不等于0,且在b中的隊列大于3,表示io性能不好