進程cpu使用率的計算

計算公式

(process jiffies) * 100.0f / ((float)Hertz * (float)et * cpuCoresCount)

亦或html

(process jiffies) * 100.0f / (float)Hertz / (float)et / cpuCoresCount

亦或linux

100 * (process jiffies)/ (float)Hertz / (float)et  / cpuCoresCount

至關於top -p pid 中 %CPU 的值segmentfault

process jiffies的計算

process jiffies是內核提供的該進程在DeltaT時間內消耗的jiffies。具體是/proc/<pid>/stat文件的第14-17 token。14-17token分別是utime, stime, cutime, cstime。cutime/cstime分別是該進程spawn的子進程在用戶態和內核態消耗的jiffies。函數

process jiffies = utime + stime + cutime + cstimeui

Jiffies 爲Linux核心變數(unsigned long),它被用來記錄系統自開機以來,已通過了多少tick。每發生一次timer interrupt,Jiffies變數會被加一。spa

注意stat中的jiffies是一個絕對累計值,因此要取兩個時間點,算DeltaT中消耗的jiffies。.net

(process jiffies) = (current process jiffies) - (last process jiffies)線程

Hertz(tick per second)

什麼是jiffies呢?其實就是Linux內核定義的一個時間單位,值就是1/Hertz。Linux內核中,進程/線程消耗的時間,單位都是這個 jiffies。code

Hertz就是CLK_TCK,能夠根據getconf CLK_TCK獲取htm

LINUX系統時鐘頻率是一個常數HZ來決定的, 一般HZ=100,即100Hz,一個週期即爲 1/100s = 10ms = 10^7 ns,那麼他的精度度就是10ms(毫秒)。也就是說每10ms一次中斷。因此通常來講Linux的精確度是10毫秒。

et

這裏是每次統計的間隔時間,單位爲秒

(System.nanoTime() - lastNanoTime) * 1E-9

cpu核數

/usr/bin/nproc

或者

cat /proc/cpuinfo | grep processor | wc -l

doc

相關文章
相關標籤/搜索