vmstat是一個查看虛擬內(nèi)存使用狀況的工具洪添。是相比于top随橘,可以看到整個機(jī)器的CPU,內(nèi)存,IO的使用情況跷究,而不是單單看到各個進(jìn)程的CPU使用率和內(nèi)存使用率(使用場景不一樣)
一. 虛擬內(nèi)存原理
在系統(tǒng)中運(yùn)行的每個進(jìn)程都需要使用到內(nèi)存洛退,但不是每個進(jìn)程都需要每時每刻使用系統(tǒng)分配的內(nèi)存空間。當(dāng)系統(tǒng)運(yùn)行所需內(nèi)存超過實際的物理內(nèi)存夹抗,內(nèi)核會釋放某些進(jìn)程所占用但未使用的部分或所有物理內(nèi)存绳慎,將這部分資料存儲在磁盤上直到進(jìn)程下一次調(diào)用,并將釋放出的內(nèi)存提供給有需要的進(jìn)程使用。
在Linux內(nèi)存管理中偷线,主要是通過“調(diào)頁P(yáng)aging”和“交換Swapping”來完成上述的內(nèi)存調(diào)度。調(diào)頁算法是將內(nèi)存中最近不常使用的頁面換到磁盤上沽甥,把活動頁面保留在內(nèi)存中供進(jìn)程使用声邦。交換技術(shù)是將整個進(jìn)程,而不是部分頁面摆舟,全部交換到磁盤上亥曹。
分頁(Page)寫入磁盤的過程被稱作Page-Out,分頁(Page)從磁盤重新回到內(nèi)存的過程被稱作Page-In恨诱。當(dāng)內(nèi)核需要一個分頁時媳瞪,但發(fā)現(xiàn)此分頁不在物理內(nèi)存中(因為已經(jīng)被Page-Out了),此時就發(fā)生了分頁錯誤(Page Fault)照宝。
當(dāng)系統(tǒng)內(nèi)核發(fā)現(xiàn)可運(yùn)行內(nèi)存變少時蛇受,就會通過Page-Out來釋放一部分物理內(nèi)存。經(jīng)管Page-Out不是經(jīng)常發(fā)生厕鹃,但是如果Page-out頻繁不斷的發(fā)生兢仰,直到當(dāng)內(nèi)核管理分頁的時間超過運(yùn)行程式的時間時,系統(tǒng)效能會急劇下降剂碴。這時的系統(tǒng)已經(jīng)運(yùn)行非常慢或進(jìn)入暫停狀態(tài)把将,這種狀態(tài)亦被稱作thrashing(顛簸)。
二. vmstat詳解
- 用法
一般vmstat工具的使用通過兩個數(shù)字參數(shù)來完成忆矛,第一個參數(shù)指采樣的時間間隔數(shù)察蹲,單位是秒,第二個參數(shù)是采樣的次數(shù):
# vmstat 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 2204340 2076 871160 0 0 1 1 50 7 0 0 99 0 0
- 2:表示每隔2秒采集一次服務(wù)器狀態(tài)
- 1:表示只采集1次
如果需要在一段時間一直監(jiān)控催训,不指定采集次數(shù)就行了:
# vmstat 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 2198572 2076 871208 0 0 1 1 52 9 0 0 99 0 0
0 0 0 2198572 2076 871208 0 0 0 0 885 911 1 0 99 0 0
0 0 0 2198572 2076 871208 0 0 0 0 902 926 0 0 99 0 0
0 0 0 2198572 2076 871208 0 0 0 0 1025 1063 1 1 99 0 0
0 0 0 2198572 2076 871208 0 0 0 15 863 912 0 0 99 0 0
0 0 0 2198572 2076 871208 0 0 0 10 824 897 1 0 99 0 0
0 0 0 2198572 2076 871208 0 0 0 0 816 878 1 1 99 0 0
0 0 0 2198572 2076 871208 0 0 0 0 807 879 0 1 99 0 0
- 參數(shù)詳解
1)procs(進(jìn)程):- r:運(yùn)行隊列中進(jìn)程數(shù)量(就是說多少個進(jìn)程真正分配到了cpu)洽议,當(dāng)這個值超過了cpu數(shù)目(長期大于1),就會出現(xiàn)cpu瓶頸
- b:表示阻塞的進(jìn)程
2)memory(內(nèi)存): - swpd:使用虛擬內(nèi)存大小漫拭,如果大于0绞铃,表示你的機(jī)器物理內(nèi)存不足了,如果不是程序內(nèi)存泄露的原因嫂侍,那么你該升級內(nèi)存了或者把耗內(nèi)存的任務(wù)遷移到其他機(jī)器
- free:空閑的物理內(nèi)存大小
- buff:用來給目錄做緩沖儿捧,目錄內(nèi)容,權(quán)限等
- cache :用來給打開的文件做緩沖
注意:如果cache的值大的時候挑宠,說明cache處的文件數(shù)多菲盾,如果頻繁訪問的文件都被cache,那么磁盤的讀IO會非常小
3)swap(交換區(qū)): - si:每秒從磁盤讀入虛擬內(nèi)存的大小各淀,如果這個值大于0懒鉴,表示物理內(nèi)存不夠用或內(nèi)存泄漏,需要查找消耗內(nèi)存進(jìn)程解決
- so:每秒虛擬內(nèi)存寫入磁盤的大小,如果值大于0临谱,同上
4)io: - bi:塊設(shè)備每秒接收的塊數(shù)量璃俗。這里的塊設(shè)備是指系統(tǒng)上所有的磁盤和其他塊設(shè)備,默認(rèn)塊大小是1024byte
- bo:塊設(shè)備每秒發(fā)送的塊數(shù)量悉默,例如我們讀取文件城豁,bo就要大于0。bi和bo一般都要接近0抄课,不然就是IO過于頻繁唱星,需要調(diào)整
5)system: - in:每秒cpu的中斷次數(shù),包括時間中斷
- cs:每秒上下午切換次數(shù)跟磨。例如我們調(diào)用系統(tǒng)函數(shù)间聊,就要進(jìn)行上下文切換,線程的切換抵拘,也要進(jìn)程上下文切換哎榴,這個值要越小越好,太大了僵蛛,要考慮調(diào)低線程或者進(jìn)程的數(shù)目,例如在apache和nginx這種web服務(wù)器中叹话,我們一般做性能測試時會進(jìn)行幾千并發(fā)甚至幾萬并發(fā)的測試,選擇web服務(wù)器的進(jìn)程可以由進(jìn)程或者線程的峰值一直下調(diào)墩瞳,壓測驼壶,直到cs到一個比較小的值,這個進(jìn)程和線程數(shù)就是比較合適的值了喉酌。系統(tǒng)調(diào)用也是热凹,每次調(diào)用系統(tǒng)函數(shù),我們的代碼就會進(jìn)入內(nèi)核空間泪电,導(dǎo)致上下文切換般妙,這個是很耗資源,也要盡量避免頻繁調(diào)用系統(tǒng)函數(shù)相速。上下文切換次數(shù)過多表示你的CPU大部分浪費在上下文切換碟渺,導(dǎo)致CPU干正經(jīng)事的時間少了,CPU沒有充分利用突诬,是不可取的苫拍。
注意:上面兩個值越大,說明內(nèi)核消耗的cpu時間越大
6)cpu: - us:用戶進(jìn)程執(zhí)行時間百分比(user time)旺隙。us的值比較高時绒极,說明用戶進(jìn)程消耗的CPU時間多,但是如果長期超50%的使用蔬捷,那么我們就該考慮優(yōu)化程序算法或者進(jìn)行加速
- sy:內(nèi)核系統(tǒng)進(jìn)程執(zhí)行時間百分比垄提。sy的值高時榔袋,說明系統(tǒng)內(nèi)核消耗的CPU資源多,這并不是良性表現(xiàn)铡俐,我們應(yīng)該檢查原因凰兑。
- id:空閑時間百分比,一般來說us+sy+id=100
- wa:IO等待時間百分比审丘。wa的值高時吏够,說明IO等待比較嚴(yán)重,這可能由于磁盤大量作隨機(jī)訪問造成备恤,也有可能磁盤出現(xiàn)瓶頸(塊操作)。
三. vmstat使用
- 通過vmstat識別CPU瓶頸
Linux下查看CPU核心數(shù)的命令:cat /proc/cpuinfo|grep processor|wc -l
r(運(yùn)行隊列)展示了正在執(zhí)行和等待CPU資源的任務(wù)個數(shù)锦秒。當(dāng)這個值超過了CPU數(shù)目露泊,就會出現(xiàn)CPU瓶頸了。解決方法大體幾種:- 最簡單的就是增加CPU個數(shù)和核數(shù)
- 通過調(diào)整任務(wù)執(zhí)行時間旅择,如大任務(wù)放到系統(tǒng)不繁忙的情況下進(jìn)行執(zhí)行惭笑,進(jìn)爾平衡系統(tǒng)任務(wù)
- 調(diào)整已有任務(wù)的優(yōu)先級
- 通過vmstat識別CPU滿負(fù)荷
首先需要聲明一點的是,vmstat中CPU的度量是百分比的生真。當(dāng)us+sy的值接近100的時候沉噩,表示CPU正在接近滿負(fù)荷工作。但要注意的是柱蟀,CPU 滿負(fù)荷工作并不能說明什么川蒙,Linux總是試圖要CPU盡可能的繁忙,使得任務(wù)的吞吐量最大化长已。唯一能夠確定CPU瓶頸的還是r(運(yùn)行隊列)的值畜眨。