top命令是linux下常用的工具,可以查看各個進程的CPU使用情況。先看一個實例:
這是Ramnode雙核VPS的top顯示結果:
左上角可以看到CPU的使用率是11.3%,但是看下面的進程,plugin-containe就占用了17.6%。出現這樣的情況是因為11.3%指的是所有核心的占用情況,17.6%指的是運行當前進程的核心的使用率。有時候可以看到某個進程的使用率已經達到100%了,但是top顯示的也只有50%而已。下面我們來做一個測試:
使用的命令是:
md5sum /dev/zero & |
執行上面命令的核心使用率超過了90%,左上角顯示的CPU使用率只有50%多
在top窗口中,按數字鍵“1”就可以看到每個核心的使用情況。
殺掉MD5sum進程 用 kill pid即可
關於vmstat,top,ps aux查看的cpu占用率不一致的問題
op,ps,vmstat都是根據系統的proc文件進行計算的,其中vmstat,top都使用了/proc/stat文件,而ps,top也使用了/proc/*/stat文件進行計算。
1.vmstat對於cpu idle的計算方式比較復雜,但是顯示的為平均值,即使用cpu使用時間片的差值/時間間隔/cpu個數(為物理cpu數目*cpu核心數),其中時間間隔為vmstat后加的參數,如vmstat 10就為10s內的平均cpu 占用率;
2.ps計算的為每個進程的cpu占用時間,使用的為/proc/*/stat文件,其中*為進程號,計算方式為使用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數目;