【Linux】效能監控指令vmstat
一、概述
監控通常分為機器監控和服務監控,機器監控是基礎監控,目的是為了獲得系統當前的運行狀態,服務監控則是主要目的,也是最應該關心的監控,機器監控也是為了更好的服務監控而存在,簡單來說,服務監控和系統上部署的具體服務有關,但監控模式可以統一。
監控是為了獲得相關的目標資料,獲得資料是為了異常情況下作出分析,分析的目的是為瞭解決線上case以及效能調優。這基本上就是監控存在的意義了。一台線上伺服器的機器監控,基本上可以分成四大類:cpu監控、磁碟容量監控、IO監控和網卡監控。不同業務將會導致伺服器不同的瓶頸,應該視具體業務而言。本文主要討論Linux下常見的獲得cpu狀態的命令列:vmstat。
二、使用詳解
在使用指令之前,應該明白監控的具體內容以及含義。cpu監控分為兩種:cpu使用率和IPC/CPI,兩者的應用情境也不相同,通常使用的是cpu使用率監控,基本上作業系統都會提供,而IPC/CPI監控則需要效能專家的協助,作業系統上基本沒有相關的指令。
非計算密集型只需要監控cpu的使用率,而cpu的使用率需要關注使用者態cpu使用率和系統態cpu使用率,前者表示系統上運行業務獲得cpu的執行時間佔總cpu時間的百分比,後者表示系統獲得cpu時間的百分比。對使用者而言,使用者態cpu百分比為100%是最理想的狀況,但這通常不可能,當出現程式調度、線程環境切換以及IO互動的時候,系統態cpu使用率會較多的增長。應當明確的是,應用消耗很多CPU並不意味著效能或者擴充性達到了最高或瓶頸。如果長時間出現系統態cpu使用率居高不下,那麼就需要關注,有可能是程式寫的不優雅,有可能是磁碟即將損壞導致IO消耗時間過長,這時候就需要cpu監控從而分析得出結果。
對計算密集型應用來首,只監控cpu使用率是不夠的,還需要監控IPC(每時鐘指令數)或CPI(每指令刻度)。為什麼需要知道這一項資料?IPC或CPI都可以反映了沒有指令被執行的時候佔用cpu刻度的百分比,簡而言之就是CPU等待指令從記憶體中裝入寄存器消耗時間的百分比,即停滯(stall)。停滯——當cpu執行指令而所用到的運算元不在寄存器或緩衝中並且當前鐘周期還未失效時,cpu就需要停滯等待資料從記憶體中裝入寄存器,停滯一旦發生,通常會浪費幾百個cpu刻度。要想提高計算密集型應用的效能,就需要獲得IPC/CPI監控資料,減少停滯減少cpu等待記憶體資料時間或改善快取。
1. vmstat用法
[work@localhost ~]$ vmstat --helpusage: vmstat [-V] [-n] [delay [count]] -V prints version. -n causes the headers not to be reprinted regularly. -a print inactive/active page stats. -d prints disk statistics -D prints disk table -p prints disk partition statistics -s prints vm table -m prints slabinfo -t add timestamp to output -S unit size delay is the delay between updates in seconds. unit size k:1000 K:1024 m:1000000 M:1048576 (default is K) count is the number of updates.
2. vmstat樣本
[work@localhost ~]$ vmstat 1procs -----------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 56400 43444 324868 0 0 20 14 28 45 0 0 99 1 0 0 0 0 56400 43452 324864 0 0 0 48 36 58 0 0 98 2 0 0 0 0 56400 43452 324868 0 0 0 0 22 34 0 0 100 0 0 0 0 0 56400 43452 324868 0 0 0 0 34 48 0 1 99 0 0 1 0 0 56400 43452 324868 0 0 0 0 22 31 0 1 99 0 0 0 0 0 56400 43452 324868 0 0 0 0 31 48 0 0 100 0 0 0 0 0 56400 43452 324868 0 0 0 0 129 163 3 1 96 0 0 0 0 0 56400 43452 324868 0 0 0 0 35 56 0 2 98 0 0 0 0 0 56400 43452 324868 0 0 0 0 22 32 0 0 100 0 0 0 0 0 56400 43452 324868 0 0 0 0 58 61 0 0 100 0 0 0 0 0 56400 43452 324868 0 0 0 0 24 38 0 1 99 0 0
3. vmstat詳解
vmstat 1:表示每隔一秒鐘採集、展示一次資料,要想停下來Ctrl+d即可,如果想指定採集次數,則使用“vmstat 1 10",表示每隔一秒鐘採集一次資料,總共採集10次。
procs:
r:表示除了cpu資源外已經準備好的進程隊列,即等待可用cpu的進程數,擷取該值用於判斷系統負荷情況,如果長時間該值超過處理器硬體執行緒個數一倍,則需要關注,系統可能面臨高負載狀況,如果長時間是處理器硬體執行緒數的三、四倍,則需要立即關注並採取行動,此時系統已經能感覺到明顯的效能下降,要麼增加cpu,要麼分析當前系統進程狀況。
附註:硬體執行緒個數的概念,舉個例子,雙核四線程的cpu,表示有2個物理cpu,但是每個cpu有兩個邏輯上的線程,對作業系統而言,它認為有4個cpu。
b:表示阻塞的進程隊列,阻塞的時候進程還在記憶體(和掛起不一樣,注意區別),但是需要額外的資源(例如IO)等。
cpu:
us:表示使用者態cpu使用率,即應用獲得cpu執行時間佔用cpu總時間的百分比,佔比高並不表示系統瓶頸。
sy:表示系統態cpu使用率,常指系統調度佔用cpu總時間的百分比。
id:表示系統空閑時間百分比。
獲得這三項資料的目的是為了分析、減少sy的百分比,實際上要判斷導致應用異常需要綜合很多監控資料,具體靠經驗。
swap:
si:每秒從磁碟讀入虛存(swap)的大小,如果該值較大,則表示系統記憶體資源緊張,需要頻繁的進行記憶體交換。
so:每秒從記憶體寫入到虛存的大小,和si一致,但是要注意兩個值是配合使用,當兩個值都較大的時候才真正表示記憶體資源緊張。
io:
bi:塊裝置(磁碟)每秒接收的塊數量,對應IO中的寫操作,太大表示IO操作頻繁。
bo:塊裝置每秒輸出的塊數量,對應IO中的讀操作,太大表示IO操作頻繁。
system:
in:每秒cpu中斷次數。
cs:每秒環境切換次數,例如調用系統函數、線程環境切換、進程切換都會導致該值增大,環境切換會浪費cpu時鐘,配合in值,因此如果該值長時間太大,就需要考慮應用中的線程數是否開啟太多等。
附註: