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
http://xxxxxx/Linuxjc/1184694.html TechArticle