CPU使用率終極計算
說明
以往對於運維人員查看CPU 用戶態,內核態,IO等待等操作以直接在命令行使用TOP命令查看當前CPU運行狀況,但從未關心過該值是如何通過計算展示出來。以下是對CPU使用率計算說明。
引入
node_cpu: CPU從啟動到當前時間的累積運行時間
假定服務器從啟動到當前時刻已運行了半個小時
CPU被用戶態使用時間為8分鍾
CPU被內核態使用時間為1.5分鍾
CPU被IO等待時間為0.5分鍾
CPU在使用Idle(空閑狀態)的時間為20分鍾
CPU在被其他幾個狀態使用的時間是0
計算公式:CPU的使用率=(所有非空閑狀態的CPU使用時間總和) / (所有狀態CPU時間的總和)
計算:
TOP命令行第二行,除Idle空閑外的所有總和 / 運行30分鍾
(user(8min) + sys(1.5min) + iowa(0.5min) + 0 + 0 + 0 + 0) / (30min)
= 10分鍾 / 30分鍾
= 30%
結論:
在30分鍾內CPU的平均使用率就是30%,但是還有比上面更為簡單的計算方式
Idle(20mins) / (30mins) ==> 70
100% - 70% = 30%
應用場景
在prometheus中node_cpu為CPU從啟動到當前時間的累積運行時間,當在prometheus中想查詢cpu使用率,將代入引用中計算方式進行相關運算。
這里的node_cpu為counter類型,持續增長。
# 獲取空閑CPU運行總時間
node_cpu{mode='idle'}
# 獲取1分鍾內空閑CPU的增量值
increase(node_cpu{mode='idle'}[1m])
# 如CPU是多核,需要將CPU核數相加
sum(increase(node_cpu{mode='idle'}[1m]))
# 監控取值會存在多主機,所以需要根據instance做分組
sum(increase(node_cpu{mode='idle'}[1m])) by(instance)
# 套取公式計算:
1 - (空閑CPU / 總cpu) = cpu使用率
1 - (sum(increase(node_cpu{mode='idle'}[1m])) by(instance) / sum(increase(node_cpu)[1m]) by(instance)) = CPU的使用率
# 例:(用戶態單獨一個cpu在1分鍾內cpu的使用率)
sum(increase(node_cpu{mode='user'}[1m])) by (instance) / sum(increase(node_cpu[1m])) by (instance)