關於vmstat,top,ps aux查看的cpu佔用率不一致的問題



關於vmstat,top,ps aux查看的cpu佔用率不一致的問題

問題:

用vmstat,top,和ps aux三個命令查看進程對cpu的佔用率,數值差異很大。


例:

用 vmstat 查看系統cpu空閒率, id是cpu的空閒率,可以看出,空閒率一直在73%以上

用 ps aux 統計兩個compress進程的cpu佔用率,長時間恆定在15.5%和28.9%

用 top統計兩個compress進程的cpu佔用率,可以看出是一個動態變化的過程

(命令執行結果後面有顯示)


這三個命令查出的cpu利用率不統一

首先,ps aux中兩個compress進程佔用cpu 15.5%+28.9%>40%,再加上其它進程,爲

何vmstat查看cpu空閒率id還能一直大於73%

其次,top命令顯示的進程compress的cpu佔用率和ps顯示的數值差別很大,ps的

cpu佔用率雷打不動,一直是恆定值,

top的比較動態, 難道ps aux顯示的進程cpu佔用率不可靠?

最後,這三個命令查出的cpu佔用率相互之間均不統一,用哪一個更可靠?例如輸入如下命令,粗體字是cpu佔用率


$ vmstat 1

procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----

r   b swpd free buff   cache si so bi bo in cs us sy id wa

0   0 432 802660   28724 5747324 0 0 204 770 0     0   6   3 90   2

3   0 432 799196   28724 5747392 0 0     0 152 1455 681   2   2 96   0

0   0 432 802420   28724 5747460 0 0     0 480 1599   1892 10   8 82 0

0   0 432 802292   28724 5747664 0 0     0 440 1859   6179 14 13 73 0

2   0 432 797636   28724 5752084 0 0     0 240 1403   3419   8   7 85   0

1   0 432 798732   28724 5751268 0 0     0 448 1506   4608 10   8 81   0

2   0 432 797924   28724 5752084 0 0     0 192 1752   4332 11 10 79   0

0   0 432 802076   28724 5747936 0 0     0 280 1705   1527 14   6 79 0


$ps aux | grep compress

USER    PID %CPU %MEM VSZ   RSS TTY    STAT START TIME COMMAND

img    6569 15.5   0.2 36716 16540 ?    S Aug12 230:57 ./bin/compress 8014

img    6570 28.9   0.2 54592 22524 ?    S Aug12 430:28 ./bin/compress 8004  


$top | grep compress

PID USER    PR   NI   VIRT   RES   SHR S %CPU %MEM TIME+   COMMAND                                                      

6569 img    16 0 40956   20m 6632 R 10.7   0.3 231:10.12 compress                                                       

6570 img    16 0 54592   21m 2456 S 20.3   0.3 430:54.32 compress                                                       

6569 img    17 0 36740   16m 2456 S 10.3   0.2 231:10.43 compress                                                       

6570 img    16 0 54592   21m 2456 R 58.9   0.3 430:56.09 compress                                                       

6569 img    16 0 36716   16m 2456 R 53.9   0.2 231:12.05 compress                                                       

6570 img    16 0 58444   24m 4752 R 69.9   0.3 430:58.19 compress                                                       

6569 img    16 0 36716   16m 2456 S 60.2   0.2 231:13.86 compress                                                       

6570 img    16 0 54592   21m 2456 S 52.6   0.3 430:59.77 compress                                                       

6569 img    15 0 36716   16m 2456 S 45.3   0.2 231:15.22 compress                                                       


大概看了些源碼,補充一下:

top,ps,vmstat都是根據系統的proc文件進行計算的,其中vmstat,top都使用了/proc/stat文件,而ps,top也使用了/procstat文件,其中*爲進程號,計算方式爲使用cpu總的時間片數/Hertz,目前確認爲對於每個物理cpu的佔用比率,因此在雙核機器上顯示的數值需要除以核心數2;


3.top使用的是/proc/stat計算上面顯示的cpu佔用,使用/proc/*/stat計算每個進程佔用的時間。但是計算的方式有所不同,代碼較爲複雜,但是目前確認爲默認顯示爲Irix模式,即爲相對於單個cpu core的佔用的時間,如雙核機器需要將該數值除以2*2計算,通過 shift+i可以進行切換;


通過上述說明可以解釋珺方發現的問題:

問題1:首先,ps aux中兩個compress進程佔用cpu 15.5%+28.9%>40%,再加上其它進程,爲何vmstat查看cpu空閒率id還能一直大於73%

ps的cpu佔用率需要除以雙核cpu數目爲2,因此實際佔用爲(15.5%+28.9% )/2=22.2% ,也就約等於100%-73%;


問題2:其次,top命令顯示的進程compress的cpu佔用率和ps顯示的數值差別很大,ps的cpu佔用率雷打不動,一直是恆定值,top的比較動態, 難道ps aux顯示的進程cpu佔用率不可靠?

ps和top相差的數值爲2倍關係,因此顯示的佔用率相差很大,同時變化率也會較大;


問題3:最後,這三個命令查出的cpu佔用率相互之間均不統一,用哪一個更可靠?例如輸入如下命令,粗體字是cpu佔用率

這三個命令的佔用率是統一的,按照如下公式進行計算時數據是一致的:

vmstat 的100%-idle == ps的cpu佔用/cpu核心數 == top的cpu佔用/cpu核心數/物理cpu數目;







我認爲topas纔是實時反映進程佔用cpu使用率,而ps不是,所以你這個腳本好象不能實現你的需求。 


如果ps是,那麼在業務高峯期,你看到的CPU使用率,應該更大,但實際上不是。你可以去觀察你的系統,如果系統運行得越久,使用ps看到的進程CPU使用率好象會越小。





ps 看到的CPU佔用率是進程自運行以來累計的CPU佔用率,所以不準確,請使用topas




就目前AIX系統而言,是沒有辦法採用系統命令去獲取進程實時的CPU使用率,只有採用topas纔可以獲取的到,但卻無法記錄下來。 

ps獲取到%CPU是進程的實際CPU使用時間與進程運行期間的比,意味着運行時間越長,該值越不準確。 




ps 看到的CPU佔用率是進程自運行以來累計的CPU佔用率,所以不準確,請使用topas



ps命令確實有侷限,ps aux看到的進程%CPU是該進程的全壽命均值,不是實時數據

我走了很多彎路,最後還是在AIX的命令大全中找到了簡單的辦法tprof




就不難理解了。ps是從進程開始就開始算的,是平均的佔用率;而top是從上次刷新開始算的,一般幾秒鐘一刷,可以認爲是即時的。而桌面系統我們一般更關注即時的,所以top的cpu佔用率纔是我需要的。而且top默認cpu的佔用率的和並不是100%,而是核數x100%,所以有時會有一個進程佔用超過100%的情況。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章