CentOS下 CPU 負載觀察和效能監測
CPU負載和利用率
CPU 的負載和利用率是兩個不同的概念,但是他們都可以在top命令中查看。CPU利用率顯示的是程式在運行期間即時佔用的CPU百分比,而CPU負載顯示的是一段時間內正在使用和等待使用CPU的平均任務數。CPU利用率高,並不意味著CPU的負載大。兩者之間沒有必然的關係。
常用命令介紹:
* uptime
首先我們需要明白load average後面的三個數字代表什麼,他們分別代表前一分鐘,五分鐘,十五分鐘的CPU負載,一般來說較重要的指標是最後一個,因為我們需要盡量避免一些突發的情況。那麼這些數字處於什麼區間是正常的呢?首先我們需要知道,這些數字是和你的伺服器的CPU核心數是緊密相關的,如果你只有一個核的話,那麼數字為1.0就表示剛好在CPU的承受範圍之內。這些數字當然是越小越好,但是理論上0.0~1.0之間都是正常範圍。根據經驗來說,如果一直在0.7上下,那麼說明你可能需要花些時間來調查;如果長期徘徊或者超過1.0,那麼你就需要進行修複啦!
對應的,提供查看linux下查看邏輯CPU的命令:
* top
top命令不僅可以查看當前系統的平均負載,還可以查看不同進程對於CPU、記憶體等資源的使用方式。
預設情況下,top命令是以CPU使用率由高到低排序顯示進程資訊的,在 top 資訊介面按 K 鍵,並輸入想要終止的PID,就可以直接殺死指定進程。
top的 -b 選項開啟批處理模式,將每次重新整理全部列印到stdout
top的 -n 選項指定退出top命令前重新整理多少次資訊。
top命令的輸出:
  第1行:與uptime相同;
  第3行:當前的CPU運行情況:
us:非nice使用者進程佔用CPU的比率
sy:核心、核心進程佔用CPU的比率;
ni:如果一些使用者進程修改過優先順序,這裡顯示這些進程佔用CPU時間的比率;
id:CPU空閑比率,如果系統緩慢而這個值很高,說明系統慢的原因不是CPU負載高;
wa:CPU等待執行I/O操作的時間比率,該指標可以用來排查磁碟I/O的問題,通常結合wa和id判斷
hi:CPU處理硬體終端所佔時間的比率;
si:CPU處理軟體終端所佔時間的比率;
st:流逝的時間,虛擬機器中的其他任務所佔CPU時間的比率;
使用者進程佔比高,wa低,說明系統緩慢的原因在於進程佔用大量CPU,通常還會伴有較低的id,說明CPU空轉時間很少。
wa低,id高,可以排除CPU資源瓶頸的可能。  
wa高,說明I/O佔用了大量的CPU時間,需要檢查交換空間的使用,交換空間位於磁碟上,效能遠低於記憶體,當記憶體耗盡開始使用交換空間時,將會給效能帶來嚴重影響,所以對於效能要求較高的伺服器,一般建議關閉交換空間。另一方面,如果記憶體充足,但wa很高,說明需要檢查哪個進程佔用了大量的I/O資源。
* iostat
如果iowait過長,說明是磁碟瓶頸;system過長,說明是核心瓶頸。
在Device一行,可以看到一些IO指標:
tps: 每秒I/O傳輸請求量;
Blk_read/s:每秒讀取多少KB;
Blk_wrtn/s:每秒寫多少KB;
Blk_read:一共讀了多少KB;
Blk_wrtn:一共寫了多少KB
* sar
sar命令查看CPU、記憶體和磁碟記錄。預設情況下,sar命令顯示當天的統計資訊,不帶參數顯示CPU統計資訊,參數-r顯示收集的記憶體記錄,-b顯示磁碟I/O
查看當天CPU使用:
查看當天記憶體使用量:
查看當天IO統計:
另外,可以使用參數-s和-e限定查看的時間,使用參數-f查看本月內之前某一天的曆史統計資訊,例如:sar -s 20:00:00 ; sar -f /var/log/sysstat/sa08
*vmstat
相比top,這個可以看到整個機器的CPU,記憶體,IO的使用方式,而不是單單看到各個進程的CPU使用率和記憶體使用量率(使用情境不一樣)
vmstat後面跟兩個參數,第一個參數是採樣的時間間隔數,單位是秒,第二個參數是採樣的次數(可以預設)。
r 表示運行隊列(就是說多少個進程真的分配到CPU),我測試的伺服器目前CPU比較空閑,沒什麼程式在跑,當這個值超過了CPU數目,就會出現CPU瓶頸了。
b 表示阻塞的進程。
swpd 虛擬記憶體已使用的大小,如果大於0,表示你的機器實體記憶體不足了,如果不是程式記憶體泄露的原因,那麼你該升級記憶體了或者把耗記憶體的任務遷移到其他機器。
free 閒置實體記憶體的大小。
buff Linux/Unix系統是用來儲存,目錄裡面有什麼內容,許可權等的緩衝。
cache cache直接用來記憶我們開啟的檔案,給檔案做緩衝,用閒置一部分實體記憶體做緩衝,提高程式執行的效能。
si 每秒從磁碟讀入虛擬記憶體的大小,如果這個值大於0,表示實體記憶體不夠用或者記憶體泄露了,要尋找耗記憶體進程解決掉。
so 每秒虛擬記憶體寫入磁碟的大小,如果這個值大於0,同上。
bi 塊裝置每秒接收的塊數量,這裡的塊裝置是指系統上所有的磁碟和其他塊裝置,預設塊大小是1024byte,我本機上沒什麼IO操作,所以一直是0。
bo 塊裝置每秒發送的塊數量,例如我們讀取檔案,bo就要大於0。bi和bo一般都要接近0,不然就是IO過於頻繁,需要調整。
in 每秒CPU的中斷次數,包括時間中斷。
cs 每秒環境切換次數,例如我們調用系統函數,就要進行環境切換,線程的切換,也要進程環境切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目,例如在apache和nginx這種web伺服器中,我們一般做效能測試時會進行幾千並發甚至幾萬並發的測試,選擇web伺服器的進程可以由進程或者線程的峰值一直下調,壓測,直到cs到一個比較小的值,這個進程和線程數就是比較合適的值了。系統調用也是,每次調用系統函數,我們的代碼就會進入核心空間,導致環境切換,這個是很耗資源,也要盡量避免頻繁調用系統函數。環境切換次數過多表示你的CPU大部分浪費在環境切換,導致CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。
us 使用者CPU時間。
sy 系統CPU時間,如果太高,表示系統調用時間長,例如是IO操作頻繁。
d 空閑 CPU時間,一般來說,id + us + sy = 100,一般我認為id是空閑CPU使用率,us是使用者CPU使用率,sy是系統CPU使用率。
wt 等待IO CPU時間。
常用的擷取Cpu負載和效能的命令大概就總結這麼多把,還有一些是關於使用taskset綁定進程到指定CPU上的,我自己並沒有使用過,就不在此展開了。
參考:
https://zhangge.net/3257.html
http://blog.csdn.net/longxibendi/article/details/44625703