- vmstat命令介紹
- vmstat各個引數的含義
- procs
- memory
- swap
- io
- system
- cpu
- vmstat命令使用例項
- vmstat各個引數的含義
- 虛擬記憶體相關知識
- 總結
- 透過vmstat來識別CPU瓶頸:
- 解決CPU瓶頸的辦法如下:
- 透過vmstat識別CPU滿負荷:
- 透過vmstat識別記憶體瓶頸:
- 解決記憶體瓶頸的辦法如下:
vmstat命令介紹
vmstat主要是用來檢測虛擬記憶體的,可以展現給定時間間隔的伺服器的狀態值,包括CPU使用率,記憶體使用率,虛擬記憶體交換情況,I/O讀寫情況等。一般vmstat工具的使用是透過兩個數字引數來完成的,第一個引數是取樣的時間間隔數,單位是秒,第二個引數是取樣的次數,如:
# 2表示每隔兩秒採集一次伺服器狀態,1表示只採集一次
# 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
2 0 0 4776548 153688 1299304 0 0 0 15 0 0 2 0 98 0 0
在實際應用過程中,我們會在一段時間內一直監控,不想監控直接結束vmstat就行了,例如:
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 4777576 153688 1299500 0 0 0 15 0 0 2 0 98 0 0
0 0 0 4777696 153688 1299500 0 0 0 124 222 289 0 0 100 0 0
0 0 0 4777664 153688 1299512 0 0 0 520 426 524 0 0 99 0 0
0 0 0 4779712 153688 1299548 0 0 0 484 462 525 1 1 98 0 0
0 0 0 4779428 153688 1299548 0 0 0 10 171 267 0 0 100 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 | 重新整理次數,如果不指定重新整理次數,但指定了重新整理時間間隔,這時重新整理次數為無窮 |
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等待I/O的時間比較多,這可能是大量的磁碟隨機訪問造成的,也有可能是磁碟出現瓶頸。
st:來自於虛擬機器偷取的CPU所佔的百分比
vmstat命令使用例項
顯示活躍或非活躍記憶體
# 每秒輸出一次資訊
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 4775112 659976 2271076 0 0 0 15 0 0 2 0 98 0 0
0 0 0 4775112 659976 2271172 0 0 0 656 522 552 1 0 99 0 0
0 0 0 4775080 659976 2271172 0 0 0 0 220 304 0 0 100 0 0
0 0 0 4775332 659976 2271172 0 0 0 0 185 281 0 0 100 0 0
0 0 0 4775364 659976 2271172 0 0 0 120 228 322 0 0 100 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,使得對記憶體的需求減少