cpu占用率怎么計算
CPU 占用率的計算方式因操作系統而異,以下是常見操作系統中的計算方法:
Windows 系統:
- 任務管理器查看:在任務管理器中,CPU 占用率是在任務管理器的刷新周期內 CPU 忙的時間與整個刷新周期的比值,默認刷新周期是 1 秒。
- 公式計算:CPU% = 1 - 空閑時間(idle time)/ 系統總時間(system time)* 100。其中,系統總時間等于 CPU 處于用戶態和內核態的時間總和,即系統總時間 = 用戶態時間(user time) + 內核態時間(kernel time),這里的系統總時間并不包括空閑時間,因為當 CPU 處于空閑狀態時,實際上是在內核模式下運行系統空閑進程(system idle process),所以內核態時間實際上已經包含了空閑時間。
Linux 系統:
- 通過 /proc 文件系統計算:
- 從 /proc/stat 文件中獲取總的 CPU 使用情況。該文件中第一行的數值表示 CPU 總的使用情況,各數值含義如下:
- user:從系統啟動開始累計到當前時刻,處于用戶態的運行時間,不包含 nice 值為負進程。
- nice:從系統啟動開始累計到當前時刻,nice 值為負的進程所占用的 CPU 時間。
- system:從系統啟動開始累計到當前時刻,處于核心態的運行時間。
- idle:從系統啟動開始累計到當前時刻,除 I/O 等待時間以外的其它等待時間。
- iowait:從系統啟動開始累計到當前時刻,I/O 等待時間(since 2.5.41)。
- irq:從系統啟動開始累計到當前時刻,硬中斷時間(since 2.6.0-test4)。
- softirq:從系統啟動開始累計到當前時刻,軟中斷時間(since 2.6.0-test4)。
- stealstolen:在虛擬環境中運行時,被其他操作系統占用的時間(since 2.6.11)。
- guest:在 Linux 內核控制下,運行虛擬 CPU 為 guest 操作系統所用的時間(since 2.6.24)。
- 總的 CPU 時間 total_cpu_time = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest。
- 對于某個特定進程,從 /proc/<pid>/stat 文件中可以得出該進程自啟動以來占用的 CPU 時間,比如第 14 項 utime 和第 15 項 stime 分別表示該進程執行用戶代碼態占用的時間和執行內核態代碼占用的時間,單位是 clock tick(時鐘節拍)。通過 sysconf (_sc_clk_tck) 可以獲取 1 秒內有多少個 clock tick(通常是 100,即 1 clock tick 為 1/100 秒)。
- 某進程 CPU 使用率的計算公式為:某進程 CPU 使用率 = ((utime + stime) - (last_utime + last_stime)) / (period * sysconf (_sc_clk_tck)) 。其中,(utime + stime) 為本次采樣時進程占用 CPU 的時間總和,(last_utime + last_stime) 為上一次采樣時進程占用 CPU 的時間總和,period 為采樣時間間隔(單位:秒)。
- 從 /proc/stat 文件中獲取總的 CPU 使用情況。該文件中第一行的數值表示 CPU 總的使用情況,各數值含義如下:
macOS 系統:
- 可以通過活動監視器(Activity Monitor)來查看各個進程的 CPU 占用率。
- 底層的計算方式類似于 Linux,也是通過統計 CPU 在不同狀態(如用戶態、系統態等)下的時間來計算總體的 CPU 占用率,但具體的實現細節和數據獲取方式可能有所不同。
在實際計算 CPU 占用率時,還需要考慮以下因素:
- 操作系統的調度策略:不同的操作系統調度算法會影響 CPU 分配給各個進程的時間,從而影響 CPU 占用率的計算。
- 進程的狀態:進程可能處于運行、就緒、等待等不同狀態,只有在運行狀態時才會占用 CPU 時間。
- 多核處理器:在多核系統中,需要考慮各個核心上的 CPU 占用情況,以及進程是否能夠充分利用多核并行處理能力。
