效能分析之Linux PS&TOP中CPU百分比為什麼不一致
今天在7DGroup的群裡,老鄭提了個問題,ps統計出來的CPU百分比為什麼比TOP統計出來的少很多。圖如下:
從上面的圖來加一下,確實差別比較大呀。
top裡面:
800%-16.9%-7.6%-22.1%-29.9%-8.8%-24.4%-16.9%-20.3%=653.1%
ps裡面只有300%以下。
為什麼會這樣呢?
先得了解ps和top有什麼區別。
Top是一個monitoring tool,但ps是一個snapshot tool。這是一個本質的區別。
ps是取當前資料的,從/proc/pid目錄中取出來。
top是在一直取資料,並且根據重新整理週期做計算的。
ps怎麼計算CPU的呢?
有幾引數如下:
系統啟動時間: 是系統自啟動以來的總時間長度。
執行緒啟動時間:執行緒啟動的時間點。
執行緒CPU時間:執行緒用CPU的時間長度。
執行緒時間 = 系統啟動時間 - 執行緒啟動時間
執行緒CPU使用率 = 執行緒CPU時間*1000/執行緒時間
計算出的CPU使用率百分比 = 執行緒CPU使用率/10 . 執行緒CPU使用率%10
-
舉例說明:
系統啟動時間: 15456374.085712
執行緒啟動時間:9470058.848042
執行緒CPU時間:987163
執行緒時間 = 15456374.085712 - 9470058.848042 = 5986315.23767
執行緒CPU使用率 = 987163 * 1000 / 5986315.23767 = 164.9
計算出的CPU使用率百分比 = 164.9 / 10 . 164.9 %10 = 16.5
所以ps計算百分比的資料取自/proc/目錄。
從/proc/<pid>/stat取出如下幾個時間。
utime:使用者模式的CPU時間消耗。
stime:核心模式的CPU時間消耗。
cutime:使用者模式的CPU時間消耗,包括子程序。
cstime:核心模式的CPU時間消耗,包括子程序。
starttime:執行緒啟動時間點。
時間消耗是通過CPU時間片來統計的。計算的基礎就是CPU時間片,CPU頻率就是每秒內的CPU計算次數(但是單精雙精浮點運算時CPU時間片是不一樣的,這個要注意下)。
下面我們只從取出的值的結果來做計算。
如果想用ps像top一樣計算一定時間週期內的CPU使用率,可以按如下方式計算。
[root@7dgroup 2287]# ps -p 2287 -o %cpu,cputime,etime,etimes
%CPU TIME ELAPSED ELAPSED
0.3 00:00:00 01:03 63
這裡有兩個引數,etime和etimes(這兩個引數的header都是ELAPSED),這兩個引數別是:
etime:執行緒自啟動以來的持續時間,格式是[DD-]hh:]mm:ss。
etimes:執行緒自啟動以來的持續時間,以秒為單位。
比如說,上面這個2287程序,在第一次取值時,如上所示。
要計算到當前時間消耗了多少CPU,需要再取一次資料。
[root@7dgroup 2287]# ps -p 2287 -o %cpu,cputime,etime,etimes
%CPU TIME ELAPSED ELAPSED
0.3 00:00:01 04:30 270
計算一下時間:
前一次取值時:
CPU時間片消耗是:0(00*3600+00*60+00)
CPU時間視窗是63。計算過程是:1*60+3 = 63.
後一次取值時:
CPU時間片消耗是:1(00*3600+00*60+1)
CPU時間視窗是270。計算過程是:4*60+30 = 270.
CPU使用率計算是:
((1-0)/(270-63))*100 = 0.4
所以這個程序在這段時間內所用的CPU百分比是0.4%。
有興趣的也可以擼一下ps的原始碼。
如果對top計算結果有異議的,也可以去擼下top的原始碼。
上面邏輯了這麼多,那麼我們在看一個系統的資源使用率時,要看ps還是top呢?
ps和top的關係如下所示:

top是一個時間週期內的資源統計。
ps是一個個時間點的資源值。
所以如果要監控一個系統的整體資源使用率的話,建議用top來看。
如果要分析到一個具體的執行緒使用的CPU資源時,再用ps來看。