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資源監控實例,其他的資源對象也是類似的方式,這是一個基於數學的查詢語句,基於數學計算獲取我們想要的值也非常靈活。