Prometheus常用監控指標介紹
deepseek解釋
1、cpu使用率
promql表達式:100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance) * 100)
可以拆解為:
-
node_cpu_seconds_total{mode="idle"}-
獲取所有表示 CPU 空閑時間的指標(Counter 類型)
-
標簽
mode="idle"過濾出空閑狀態的 CPU 時間
-
-
irate(...[5m])-
計算該指標在 5 分鐘窗口內的 瞬時增長率(單位:秒/秒)
-
公式:
(最新值 - 前一個值) / 時間間隔(秒)
-
-
avg() by (instance)-
對每個
instance(服務器實例)的多個 CPU 核心的空閑率求平均值 -
多核服務器需要聚合所有核心的數據
-
-
* 100-
將比例值轉換為百分比(例如 0.8 → 80)
-
-
100 - (...)-
用 100% 減去空閑百分比,得到 CPU 使用率
-
該 PromQL 的核心邏輯是:
CPU使用率 = 100% - (CPU空閑時間占比)
Q1: 為什么用 irate 而不是 rate?
-
irate使用最后兩個數據點,更適合捕捉短期波動 -
rate會平滑 5 分鐘內所有數據,可能掩蓋瞬時峰值
2、內存使用率
promql表達式: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
(1)傳統計算方式
Used = MemTotal - MemFree - Buffers - Cached
Usage% = (Used / MemTotal) * 100
存在問題:低估實際使用率,因為緩存(Cached)可能被應用快速回收
(2)現代計算方式(推薦)
Used = MemTotal - MemAvailable
Usage% = (Used / MemTotal) * 100
優勢:MemAvailable 包含可回收緩存,更準確反映實際可用內存
3、磁盤 I/O 使用率(%util)
promql表達式: 100 * rate(node_disk_io_time_seconds_total{device=~"sd.*"}[1m])
-
含義:磁盤設備(如
/dev/sda)處于忙碌狀態的總秒數(從系統啟動開始累計) -
關鍵標簽:
-
device:磁盤設備名(如sda,nvme0n1) -
fstype:文件系統類型(需額外過濾)
-
(1)傳統使用率計算
%util = (設備繁忙時間 / 采樣間隔時間) * 100
實現原理:
-
內核通過
blk_account_io_done()統計設備繁忙時間 -
采樣間隔通常為1秒(如
iostat 1)
(2)現代多隊列(MQ)計算
對于NVMe等高性能設備:
%util = max(
(sum(各CPU隊列繁忙時間) / (cores × 采樣間隔)),
(傳統%util計算)
)
4、磁盤空間使用率%
promql表達式:100 - (node_filesystem_avail_bytes{fstype=~"ext4|xfs", mountpoint="/"} / node_filesystem_size_bytes{fstype=~"ext4|xfs", mountpoint="/"} * 100)
node_filesystem_free_bytes與 node_filesystem_avail_bytes 的關鍵區別: node_filesystem_free_bytes只計算完全未使用的空間,不含可回收緩存,avail_bytes (推薦)包含可被普通用戶程序回收的緩存空間(更準確反映真實可用空間)
5、[$interval]
在 Prometheus 和 Grafana 中,[$interval] 是一個動態時間范圍變量,用于自動適配查詢的時間間隔。它不是 PromQL 的原生語法,而是主要在 Grafana 儀表盤中使用。
1. [$interval] 的含義和作用
(1)基本定義
-
[$interval]是 Grafana 自動計算的時間間隔,表示每個數據點覆蓋的時間范圍。 -
它根據當前儀表盤的時間范圍和圖表寬度動態調整,確保數據點數量適中,平衡精度和性能。
(2)簡單示例
假設:
-
儀表盤時間范圍:最近 1 小時
-
圖表寬度:600 像素
Grafana 可能自動設置 $interval = 10s,即每 10 秒一個數據點(共 360 個點)。
在 PromQL 中的使用場景
(1)rate()、irate()、increase() 函數
這些函數必須指定時間范圍(如 [5m]、[1h])。[$interval] 可動態適配該范圍:
rate(http_requests_total[$interval])
(2)Grafana 變量替換
在 Grafana 面板的 PromQL 查詢中,[$interval] 會被自動替換為實際值:
# 在 Grafana 中書寫:
rate(node_cpu_seconds_total{mode="idle"}[$interval])
# Grafana 實際執行(假設 interval=15s):
rate(node_cpu_seconds_total{mode="idle"}[15s])
為什么需要 [$interval]?
(1)自適應查詢
-
短時間范圍(如最近 5 分鐘):
$interval可能為5s,提供高精度。 -
長時間范圍(如最近 7 天):
$interval可能為1h,避免數據點過多。
(2)性能優化
-
避免查詢返回過多數據點(如 10,000+),導致瀏覽器渲染緩慢或 Prometheus 負載過高。
示例對比
(1)固定間隔(不推薦)
rate(http_requests_total[1m]) # 始終用 1m,可能不適配所有時間范圍
(2)動態間隔(推薦)
rate(http_requests_total[$interval]) # 自動適配當前視圖
5、CPU Throttling
CPU Throttling(CPU 限流) 是容器編排平臺(如 Kubernetes)對容器 CPU 使用的一種限制機制。當容器使用的 CPU 超過其設定的限制時,系統會強制讓容器"暫停運行"一段時間,從而限制其 CPU 使用。CPU Throttling 值是一個百分比,表示:Throttling 百分比 = (被強制暫停的時間 / 總時間) × 100%
# 這些指標的實際意義 container_cpu_cfs_periods_total = 總的時間片周期數 container_cpu_cfs_throttled_periods_total = 被限制的周期數
promql表達式1(deepseek):
# 計算所有容器的 Throttling 比例 ( rate(container_cpu_cfs_throttled_periods_total{container!="", container!="POD"}[5m]) / rate(container_cpu_cfs_periods_total{container!="", container!="POD"}[5m]) ) * 100
promql表達式2(店J):
(sum(increase(container_cpu_cfs_throttled_periods_total{pod=~"$pod"}[5m])) by (container,pod) > 0) /(sum(increase(container_cpu_cfs_periods_total{pod=~"$pod"}[5m])) by (container,pod) > 0)

浙公網安備 33010602011771號