Prometheus 查詢語言 PromQL 的 CPU 使用率計算方法


參考文檔:https://blog.csdn.net/qq_35753140/article/details/105121525

--------------
cpu使用率
--------------

100 * (1 - sum by (instance)(increase(node_cpu_seconds_total{mode="idle"}[5m])) /

sum by (instance)(increase(node_cpu_seconds_total[5m])))

會將所有主機的CPU使用率顯示在一個panel中

 

以下是對參考文檔的一些備注說明:

 

 

 

增加increase函數,查看效果:

 

其實increase的作用是:用這12個數據點中的最后一個數據點1563.56去第一個數據點1508.76

即得到這個范圍內的增量。

也就是上圖中增加increase后的效果。

這里的數據只是做一個演示,主要是為了講解原理和規則,不要去糾結數據的正確性。

 

回到計算CPU使用率的場景中來: 

increase(node_cpu_seconds_total{cpu="0",mode="idle"}[5m])

node_cpu_seconds_total表示的是:系統自開機以來,cpu的總時間(單位秒)

{cpu="0"}表示的是:第一個CPU

{mode="idle"}表示的是:CPU的mode為idle

[5m]表示的是5分鍾的區間

increase表示增量

 

13:00   系統啟動

13:45   采集的數據為13000

13:50   采集的數據為13567   (現在)

[5m] 就表示 13:45 ~ 13:50

increase 就表示 13:45 ~ 13:50 之間的增量 即 567

 

cpu0 5分鍾內處於空閑狀態的時間占比

increase(node_cpu_seconds_total{cpu="0",mode="idle"}[5m]) /

increase(node_cpu_seconds_total{cpu="0"}[5m])

 

針對CPU0,在這5分鍾內,處於idle狀態的時間增量為 20秒(紅色

針對CPU0,在這5分鍾內,總時間增量(user + sys + idle + irq + iowait + nice + softirq + steal) 為500秒(黑色)

 

則這5分鍾內,百分比為 20 / 500 = 4%,即:處於空閑狀態的時間占比為4%。

 

一個服務器可能有4顆CPU,上面計算了1個CPU的,現在我們計算所有CPU的(沒有用cpu="0"這樣的字眼來過濾):

sum(increase(node_cpu_seconds_total{mode="idle"}[5m])) / sum (increase(node_cpu_seconds_total[5m]))

increase(node_cpu_seconds_total{cpu="0", mode="idle"}[5m])     CPU0在這5分鍾的增量 20

increase(node_cpu_seconds_total{cpu="1", mode="idle"}[5m])     CPU1在這5分鍾的增量 30

increase(node_cpu_seconds_total{cpu="2", mode="idle"}[5m])     CPU2在這5分鍾的增量 40

increase(node_cpu_seconds_total{cpu="3", mode="idle"}[5m])     CPU3在這5分鍾的增量 70

sum()的作用就是計算總和 :20 + 30 + 40 + 70 = 160

即:所有CPU在這5分鍾內,處於idle狀態的總時間。

 

increase(node_cpu_seconds_total{cpu="0"}[5m])     CPU0在這5分鍾的增量 1000

increase(node_cpu_seconds_total{cpu="1"}[5m])     CPU0在這5分鍾的增量 1200

increase(node_cpu_seconds_total{cpu="2"}[5m])     CPU0在這5分鍾的增量 1300

increase(node_cpu_seconds_total{cpu="3"}[5m])     CPU0在這5分鍾的增量 1500

sum() 計算總和 1000 + 1200 + 1300 + 1500 = 5000

即:所有CPU在這5分鍾內,總的時間增量。

 

即:160 / 5000 = 3.2% (0.032),這就是空閑率。

那么CPU使用率 = 1 - 空閑率 = 1 - 3.2% = 96.8%

 

以上就計算出了一台主機的CPU使用率。

==========================================================================

注意:假設我們在配置文件中只配置了一台主機,才能使用上面的計算方式。(比如下圖)

 

如果你的配置文件中配置了多台主機,則上面的計算方式不對。(比如下圖)

 

如果要監控多台主機,則需要注意用instance來區分。

increase(node_cpu_seconds_total{cpu="0", mode="idle", instance="localhost:8080"}[5m]) 1000 \

increase(node_cpu_seconds_total{cpu="1", mode="idle", instance="localhost:8080"}[5m]) 1200 |

increase(node_cpu_seconds_total{cpu="2", mode="idle", instance="localhost:8080"}[5m]) 1300 | 一組

increase(node_cpu_seconds_total{cpu="3", mode="idle", instance="localhost:8080"}[5m]) 1500 /

 

increase(node_cpu_seconds_total{cpu="0", mode="idle", instance="localhost:8081"}[5m]) 1000 \

increase(node_cpu_seconds_total{cpu="1", mode="idle", instance="localhost:8081"}[5m]) 1200 |

increase(node_cpu_seconds_total{cpu="2", mode="idle", instance="localhost:8081"}[5m]) 1300 | 一組

increase(node_cpu_seconds_total{cpu="3", mode="idle", instance="localhost:8081"}[5m]) 1500 /

 

sum by (instance) (increase(node_cpu_seconds_total{mode="idle"}[5m]))

按主機分組(即按instance)進行求和

上述表達式會得出2個值

 

increase(node_cpu_seconds_total{cpu="0", instance="localhost:8080"}[5m])    5分鍾的增量 1000

increase(node_cpu_seconds_total{cpu="1", instance="localhost:8080"}[5m])    5分鍾的增量 1200

increase(node_cpu_seconds_total{cpu="2", instance="localhost:8080"}[5m])    5分鍾的增量 1300

increase(node_cpu_seconds_total{cpu="3", instance="localhost:8080"}[5m])    5分鍾的增量 1500

 

increase(node_cpu_seconds_total{cpu="0", instance="localhost:8081"}[5m])    5分鍾的增量 1000

increase(node_cpu_seconds_total{cpu="1", instance="localhost:8081"}[5m])    5分鍾的增量 1200

increase(node_cpu_seconds_total{cpu="2", instance="localhost:8081"}[5m])    5分鍾的增量 1300

increase(node_cpu_seconds_total{cpu="3", instance="localhost:8081"}[5m])    5分鍾的增量 1500

 

sum by (instance) (increase(node_cpu_seconds_total[5m]))

按主機分組(即按instance)進行求和

上述表達式會得出2個值

 

sum by (instance)(increase(node_cpu_seconds_total{mode="idle"}[5m])) /

sum by (instance)(increase(node_cpu_seconds_total[5m]))

 

這也會得到2個值,用instance區分


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM