簡介
最近在線上跑的的業務,同事跟我說zabbix沒有告警,當時機器上cpu 占用很高,idle已經很低了,但是cpu確實沒有報警出來。然后我開始分析cpu的告警條件觸發器等,做下這次的總結分析過程。
首先我查看該機器上告警觸發條件,觸發器配置的是
{base_template:system.cpu.util[,user].count(#3,85,"ge")}>1
該觸發器表示用戶空間占用的百分比三次監測超過85%進行告警。然后我通過機器上的top命令查看該值都是多少
看了這圖之后我發現跟我的認知有些不一樣了,我之前的理解cpus 應該是各個進程占用的總和才對呢,實際上並不是這樣。
先看下這兩條的基礎含義:
Cpu(s):表示用戶空間占用CPU的百分比。
%CPU:表示上次更新到現在的CPU時間占用百分比。
在看下每個邏輯cpu核占用的百分比
實際上Cpu(s) 表示所有用戶進程占用整個cpu的平均值,因為每一個核心占用的百分比不同,所以來看平均值。
%CPU顯示的是進程占用一個核的百分比,而不是整個cpu(16核)的百分比,有時候可能大於100,那是因為該進程啟用了多線程占用了多個核心,所以有時候我們看該值得時候會超過100%,但不會超過總核數*100。
這樣來看的話,監控的觸發器確實就不會被觸發了,為了能監控實際的數據進行告警,所以監控的策略觸發器需要調整下,將之前的觸發器上在添加一個或的條件進行觸發
{base_template:system.cpu.util[,idle].avg(1m)}<15
就是判斷空閑的百分比,當空閑小於15%即使用超過85%進行告警通知。
ps:cpu壓測觸發小事例
先用一個小一點的數字測試,觀察圖形之后再逐步加大
echo "scale=500; 4*a(1)" | bc -l -q
該命令是計算圓周率后面的500位