Prometheus數(shù)學(xué)理論基礎(chǔ)

Prometheus數(shù)學(xué)consule使用

Linux系統(tǒng)中底層計(jì)算CPU占用率的方法
簡(jiǎn)單的總結(jié)如下:
Linux系統(tǒng)開啟后,CPU開始進(jìn)入工作狀態(tài),每一個(gè)不同狀態(tài)的CPU使用時(shí)間都是從零開始累計(jì)
而我們?cè)诒槐O(jiān)控客戶端安裝的node_exporter會(huì)抓取并返回給我們常用的八種CPU狀態(tài)的累積時(shí)間數(shù)值

用戶態(tài)CPU
用戶態(tài)CPU通常占用整個(gè)CPU狀態(tài),最多的類型,當(dāng)然也有個(gè)別的情況,內(nèi)核態(tài)或ID等待占用的更多

top =>user%
12:00開機(jī)后 一直到12:30截止

這30分鐘的過程中(當(dāng)前我們先暫時(shí)忽略是幾核CPU 就按1核來說)

CPU被使用在用戶態(tài)的時(shí)間一共是8分鐘
CPU被使用在內(nèi)核態(tài)的時(shí)間一共是1.5分鐘
CPU被使用在IO等待狀態(tài)的時(shí)間一共是0.5分鐘
CPU被使用在Idle(空閑狀態(tài))的時(shí)間一共是20分鐘
(Idle空閑狀態(tài)的CPU時(shí)間 其實(shí)就是CPU沒事干的時(shí)間)
CPU被使用在其他的幾個(gè)狀態(tài)時(shí)間是0

上面的這些數(shù)據(jù)為了我們計(jì)算CPU在這段30mins時(shí)間的使用率提供了單位數(shù)據(jù)基礎(chǔ)

CPU的使用率=(所有非空閑狀態(tài)的CPU使用時(shí)間總和)/(所有狀態(tài)CPU時(shí)間的總和)
有了這個(gè)公式后 就可以得出如下的計(jì)算公式

(user(8mins)+sys(1.5mins)+iowa(0.5mins)+0+0+0+0)/(30mins)=10分鐘/30分鐘
=30%

Counter數(shù)據(jù)類型(虛擬的數(shù)據(jù)類型,針對(duì)返回值,他的使用途徑)
node_exporter=>node_cpu給我們返回的是Counter的數(shù)據(jù)(CPU底層是時(shí)間的累積)
Counter是一個(gè)一直持續(xù)增長(zhǎng)的數(shù)值

30分鐘內(nèi)CPU使用時(shí)間持續(xù)增長(zhǎng)UP,我們需要截取其中一段增長(zhǎng)的增量值
如果我們能獲得1分鐘的增量值,然后那這個(gè)數(shù)值再去使用剛才同樣的計(jì)算公式
就能得到1分鐘的平均值。

Prometheus的數(shù)學(xué)查詢命令行 計(jì)算函數(shù)

increase()函數(shù)
increase函數(shù)在Prometheus中,是用來針對(duì)Counter這種持續(xù)增長(zhǎng)的數(shù)值,截取其中一段時(shí)間的增量
increase(node_cpu[1m])=》這樣就獲取了CPU總使用時(shí)間在1分鐘內(nèi)的增量

實(shí)際工作中的CPU大多數(shù)是多核的
如下圖Node_exporter給我們截圖回來的
八種CPU狀態(tài)->每一個(gè)核的使用率
采集的數(shù)據(jù)精細(xì)到每一個(gè)核的CPU時(shí)間

不過我們?cè)谶\(yùn)維實(shí)習(xí)監(jiān)控中 并不太關(guān)注每一個(gè)CPU核表現(xiàn)如何
而是關(guān)注整個(gè)CPU的表現(xiàn)
(一般生產(chǎn)服務(wù)器 CPU 都有 16 20 32 40 48 核)

如果每一個(gè)CPU核都單獨(dú)來一個(gè)監(jiān)控曲線圖 意義不大而且看著圖太混亂了

Prometheus解決辦法 

Prometheus提供了另一個(gè)sum()函數(shù)  很頻繁使用
sum()  起到value加合的作用

sum( increase(node_cpu[1m]) )
外面套用一個(gè)sum即可把所有核數(shù)值加合

拆分并解釋這個(gè)運(yùn)算公式

(1-((sum(increase(node_cpu{mode="idle"}[1m])) by (instance))  /
(sum(increase(node_cpu[1m])) by (instance)))) * 100
(1-((sum(increase(node_cpu{mode="idle"}[1m])) by (instance))  /
(sum(increase(node_cpu[1m])) by (instance)))) * 100
這個(gè)prometheus的計(jì)算公式 其實(shí)就是 咱們最后 那個(gè) 使?
100%- (空閑時(shí)間 / 總時(shí)間) 的?法
不過這個(gè)公式 直接拿來看 還是有點(diǎn)痛苦, 咱們來學(xué)?下 拆
分

rate函數(shù)的使用

rate函數(shù)可以說是Prometheus提供的最重要的函數(shù)之一

rate()
rate(v range-vector) calculates the per-second
average rate of increase of the time series in the range
vector. Breaks in monotonicity (such as counter resets due
to target restarts) are automatically adjusted for. Also, the
calculation extrapolates to the ends of the time range, 
allowing for missed scrapes or imperfect alignment of
scrape cycles with the range's time period.
The following example expression returns the per-second
rate of HTTP requests as measured over the last 5 minutes,
per time series in the range vector:
rate(http_requests_total{job="api-server"}
[5m])

上面這一段是官網(wǎng)提供的解釋
簡(jiǎn)單翻譯一下

 
rate()函數(shù)是專門搭配counter類型數(shù)據(jù)使用的函數(shù)
它的功能是按照設(shè)置一個(gè)時(shí)間段,取counter在這個(gè)時(shí)間段中的平均每秒的增量
這個(gè)例? 使?的 node_exporter
key node_network_receive_bytes
rate(node_network_receive_bytes[1m])
node_network_receive_bytes 本?是?個(gè)counter類型 字?意
思 也很好理解
?絡(luò)接收字節(jié)數(shù)
咱們之前也學(xué)習(xí)過了 對(duì)于這種 持續(xù)增長(zhǎng)的 counter數(shù)據(jù),直
接輸?key 是沒有任何意義的
我們必須要 以獲取單位時(shí)間內(nèi) 增量的?式 來進(jìn)?加? 才能
有意義
那么 對(duì)于counter數(shù)據(jù), 進(jìn)?第?步的初始化的 增量獲取 加
?
通常的使?發(fā)放 就是直接? rate() 包上。(increase(). 也是
可以的 我之后會(huì)講到)
node_network_receive_bytes 被rate(. [1m])包上以后
就可以獲取到 在1分鐘時(shí)間內(nèi),平均每秒鐘的 增量

得到的圖


這樣以來 數(shù)據(jù)就變得有意義了
強(qiáng)調(diào)
所以說 我們以后在使?任何counter數(shù)據(jù)類型的時(shí)候,永遠(yuǎn)記
得 別的先不做 先給它加上?個(gè) rate() 或者 increase()
接下來我們把rate()做的事情 更加細(xì)化的 咱們來解釋?下
?如上?這個(gè)圖, ?絡(luò)接收字節(jié)數(shù) ?直不停的累加
從 23:44開始 到 23:45
?如累積量 從440011229804456 到了 -> 440011229805456
1分鐘內(nèi) 增加了 1000bytes (假設(shè))
從 23:45開始 到 23:50
?如累積量 從440011229805456 到了 -> 440011229810456
5分鐘內(nèi) 增加了 5000bytes(假設(shè))
加?rate(. [1m]) 之后
會(huì)把 1000bytes 除以 1m*60秒 , =~16bytes/s
就是這樣 計(jì)算出 在這1分鐘內(nèi),平均每秒鐘增加 16bytes
這個(gè)還是?較好理解的
接下來 咱們修改 1m => 5m
變成這樣 rate(. [5m])
這樣就變成 把5分鐘內(nèi)的增量 除以 5m*60
5分鐘的增量 假如是 5000 , 那么除以300 以后 也還是約等于
=~ 16bytes/s
感覺好像是?模?樣的?
那么我們來看下輸出 rate[5]
??? 感覺圖形發(fā)?了?定的變化 怎么回事?
明明是?樣的 平均 16/s 啊 怎么圖形變了呢?
事實(shí)是這樣的
如果 我們按照 rate(1m)這樣來取,那么是取1分鐘內(nèi)的增量 除
以秒數(shù)
如果 我們按照 rate(5m)這樣來取,那么是取5分鐘內(nèi)的增量 除
以秒數(shù)
?這種取法 是?種平均的取法 ?且是假設(shè)的
剛才我們說 counter在 ?分鐘 5分鐘 之內(nèi)的增量 1000 和 5000
其實(shí)是?種假設(shè)的理想狀態(tài)
事實(shí)上 ?產(chǎn)環(huán)境 ?絡(luò)數(shù)據(jù)接收量 可不是這么平均的
有可能在 第?分鐘內(nèi) 增加了 1000 , 到 第?分鐘 就變成增加
了2500 ….
所以 rate(1m) 這樣的取值?法 ?起 rate(5m) ,因?yàn)樗〉臅r(shí)
間段短,所以 任何某?瞬間的凸起或者降低
在成圖的時(shí)候 會(huì)體現(xiàn)的更細(xì)致 更敏感
? rate(5m) 把整個(gè)5分鐘內(nèi)的 都?起平均了,那么當(dāng)發(fā)?瞬時(shí)
凸起的時(shí)候 ,會(huì)顯得圖平緩了?些 (因?yàn)?取的時(shí)間段長(zhǎng) 把
波峰波? 都給平均消下去了)
那么我們?cè)俜??些 看看 rate(20m) 會(huì)怎么樣
哈哈 ? 是不是就更平緩了
在我們的?作中 取1m 還是取5m
這個(gè)取決于 我們對(duì)于監(jiān)控?cái)?shù)據(jù)的敏感性程度來挑選
說到這? 我們對(duì)rate() 函數(shù) 應(yīng)該也有了?定的了解了
接下來 咱們繼續(xù)學(xué)習(xí) 第?個(gè)重要的函數(shù)
(三) increase函數(shù) 使?
increase 函數(shù) 其實(shí)和rate() 的概念及使??法?常相似
rate(1m) 是取?段時(shí)間增量的平均每秒數(shù)量
increase(1m) 則是 取?段時(shí)間增量的總量
?如
increase(node_network_receive_bytes[1m])
取的是 1分鐘內(nèi)的 增量總量
和
rate(node_network_receive_bytes[1m])
取的是 1分鐘內(nèi)的增量 除以 60秒 每秒數(shù)量

從這兩個(gè)圖 我們可以看到 其實(shí)曲線的?勢(shì) 基本是?樣的
但是 顯?出來的數(shù)量級(jí)bytes 可不?樣
137303978 * 60 = 8238238680 (發(fā)現(xiàn))
正好是 60倍
也就很好理解了,increase() 是不會(huì)取?秒的平均值的

incraese() rate()

監(jiān)控 獲取采集數(shù)據(jù)源
頻率
5m =》 rate()
形成圖 斷鏈
increase(5m)
rate() -> CPU 內(nèi)存 硬盤 IO ?絡(luò)流量
counter

(四) sum()函數(shù)的學(xué)習(xí)

sum()函數(shù)的使? , 我們?cè)谏瞎?jié)課 講CPU拆分公式的時(shí)候 已經(jīng)
講過了
sum就是 總?cè)『?sum 會(huì)把結(jié)果集的輸出 進(jìn)?總加合
?如
rate(node_network_receive_bytes[1m]) 顯?的結(jié)果集 會(huì)包含如
下內(nèi)容
從標(biāo)簽 我們就不難看出,有好多臺(tái)服務(wù)器 都返回了 這個(gè)監(jiān)控
數(shù)據(jù)
當(dāng)我們使? sum()包起來以后
sum(rate(node_network_receive_bytes[1m])) 就變成下?這樣了
變成?條線了 …
等于是 給出了 所有機(jī)器的 每秒請(qǐng)求量..
我們之前也說過,如果要進(jìn)?下?層的拆分
需要在 sum() 的后? 加上 by (instance)
才可以按照 機(jī)器名 拆分出?層來
sum() 加合 其實(shí)還有更多巧妙使?
instance
sum () by (cluster_name)
如果是 by instance 那么 其實(shí)跟 不加sum()的輸出結(jié)果是?樣
的
本來 rate(node_network_receive_bytes[1m]) 就已經(jīng)是按照每臺(tái)
機(jī)器 返回了
但是如果 我們希望 按集群總量輸出呢?
?如 我們返回了20臺(tái)機(jī)器的數(shù)據(jù)
其中 有6臺(tái) 屬于 web server
10臺(tái)屬于 DB server
其他的 屬于?般server
那么我們這時(shí)候 sum() by (cluster_name) 就可以幫我們實(shí)現(xiàn) 集
群加合并分三條曲線輸出了
100 - 1000 CPU
順帶?提的是 (cluster_name) 這個(gè)標(biāo)簽,默認(rèn)node_exporter
是沒有辦法提供的
node_exporter只能按照 不同的機(jī)器名 去劃分
如果希望 ?持cluster_name 我們需要??定義標(biāo)簽 ?
往后的課程 我們會(huì)涉及到這個(gè)內(nèi)容

(五) topk()函數(shù)的學(xué)習(xí)

定義:取前?位的最?值

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容