1. 程式人生 > >CentOS下 CPU 負載觀察和效能監測

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上的,我自己並沒有使用過,就不在此展開了。