prometheusCPU資源監控實例

CPU是我們系統重要的資源指標,它提供了最主要的計算功能,所以CPU的狀態對整個服務器和應用來講是最爲重要的,那麼我們如何使用Prometheus獲取到需要監控CPU資源指標。

知識點回顧

CPU的使用率是如何計算的?

1)CPU相關概念

    CPU利用率:CPU的使用情況。
    用戶時間(User time) :表示CPU執行用戶進程的時間,包括nices時間。通常期望用戶空間CPU越高越好。
    系統時間(System time) :表示CPU在內核運行時間,包括IRQ和softirq時間。系統CPU佔用率高,表明系統某部分存在瓶頸。通常值越低越好。
    等待時間(Waiting time) :CPU在等待I/O操作完成所花費的時間。系統不應該花費大量時間來等待I/O操作,否則就說明I/O存在瓶頸。
    空閒時間(Idle time) :系統處於空閒期,等待進程運行。
    Nice時間(Nice time) :系統調整進程優先級所花費的時間。
    硬中斷處理時間(Hard Irq time) :系統處理硬中斷所花費的時間。
    軟中斷處理時間(SoftIrq time) :系統處理軟中斷中斷所花費的時間。
    丟失時間(Steal time) :被強制等待(involuntary wait)虛擬CPU的時間,此時hypervisor在爲另一個虛擬處理器服務。

2)我們查看下一臺安裝了Prometheus node_exporter主機都採集了那些cpu相關數據  

curl localhost:9100/metrics | grep cpu

node_cpu_seconds_total{cpu="0",mode="idle"} 1.12742968e+06
node_cpu_seconds_total{cpu="0",mode="iowait"} 15314.29
node_cpu_seconds_total{cpu="0",mode="irq"} 0
node_cpu_seconds_total{cpu="0",mode="nice"} 2851.94
node_cpu_seconds_total{cpu="0",mode="softirq"} 826.97
node_cpu_seconds_total{cpu="0",mode="steal"} 0
node_cpu_seconds_total{cpu="0",mode="system"} 8983.57
node_cpu_seconds_total{cpu="0",mode="user"} 29765.21

後面的數字是cpu的使用時間

3)CPU的使用率是怎麼計算的呢?

    CPU佔用率計算公式
    CPU時間=user+system+nice+idle+iowait+irq+softirq+Stl +guest
    %us=(User time + Nice time)/CPU時間*100% 
    %sy=(System time + Hard Irq time +SoftIRQ time)/CPU時間*100% 
    %id=(Idle time)/CPU時間*100% 
    %ni=(Nice time)/CPU時間*100% 
    %wa=(Waiting time)/CPU時間*100% 
    %hi=(Hard Irq time)/CPU時間*100% 
    %si=(SoftIRQ time)/CPU時間*100% 
    %st=(Steal time)/CPU時間*100%

Prometheus的演示

通過 curl localhost:9100/metrics 我們可以看到cpu的總量在prometheus中的key是node_cpu_seconds_total

1)node_cpu_seconds_total 視圖

2)如何獲取cpu衆多值中的一個?例如idle(空閒cpu)

表達式  (key的過濾是通過 { } 實現的 )

node_cpu_seconds_total{mode="idle"}

3)獲取1m中內的數據變化通過increase()

表達式

increase(node_cpu_seconds_total{mode="idle"}[1m])

4) 獲取1m中內的數據變化和

表達式

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

當然這裏有個問題,當你使用了sum像是上面的方式,我們求的和是包含了所有服務器的所有cpu的平均值和。意思就是說假如監控上面監控了100服務器其中各個服務器的cpu數量都不盡相同,那麼我們的求和就是將這100服務器中的所有cpu求和求平均。

5) 如何解決上面的問題呢?

這裏就引進一個方法 by(instance),將sum加和一起的數值按照指定的方式進行一層拆分,instance代表的是機器名.

表達式

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

6) 獲取空閒cpu的百分比

表達式(開始使用預算符)

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

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

7)非空閒cpu1m使用百分比

表達式


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

8) 獲取 user 在1m內cpu使用率

表達式

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

or 

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

9) 獲取sys 1m內cpu使用率

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

or 

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

結束語:我這裏做一個CPU資源監控實例,其他的資源對象也是類似的方式,這是一個基於數學的查詢語句,基於數學計算獲取我們想要的值也非常靈活。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章