題目要求:使用shell腳本監控伺服器整個系統CPU負載
分析:
在對伺服器進行維護時,有時也遇到由于系統 CPU(使用率)負載 過量導緻業務中斷的情況。伺服器上可能運作多個程序,檢視單個程序的 CPU 都是正常的,但是整個系統的 CPU 負載可能是異常的。通過腳本對系統 CPU 負載進行時時監控,可以在異常時及時發送告警,便于維護人員及時處理,預防事故發生。
我們可以使用 vmstat 取 5 次系統 CPU 的 idle(空閑時間百分比) 值,取平均值,然後通過與 100 取差得到目前 CPU 的實際占用值。如果此時系統實際占用值超過90%(可以根據實際情況進行調整),則輸出告警,否則輸出正常資訊。
解答:
指令:
vmstat指令的含義為顯示虛拟記憶體狀态(“Virtual Memory Statistics”),但是它可以報告關于程序、記憶體、I/O等系統整體運作狀态。
文法格式:vmstat(選項)(參數)
指令選項:
-a:顯示活動内頁;
-f:顯示啟動後建立的程序總數;
-m:顯示slab資訊;
-n:頭資訊僅顯示一次;
-s:以表格方式顯示事件計數器和記憶體狀态;
-d:報告磁盤狀态;
-p:顯示指定的硬碟分區狀态;
-S:輸出資訊的機關。
指令參數:
事件間隔:狀态資訊重新整理的時間間隔;
次數:顯示報告的次數。
解答:
指令行測試:
[[email protected] ~]# vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 15112500 317484 9520400 0 0 0 1 0 0 0 0 100 0 0
0 0 0 15112488 317484 9520468 0 0 0 104 1242 2201 0 0 99 0 0
0 0 0 15112488 317484 9520468 0 0 0 0 1187 2191 0 0 100 0 0
0 0 0 15112520 317484 9520468 0 0 0 0 1180 2145 0 0 100 0 0
0 0 0 15111948 317484 9520488 0 0 0 0 1235 2177 0 0 100 0 0
#解釋:每隔1秒重新整理一次狀态資訊,每次顯示報告5次。
[[email protected] ~]# vmstat 1 5 | sed -n '3,$p'
0 0 0 15111284 317484 9521456 0 0 0 1 0 0 0 0 100 0 0
0 0 0 15111196 317484 9521476 0 0 0 24 1450 2372 1 0 99 0 0
0 0 0 15111004 317484 9521484 0 0 0 0 1255 2305 0 0 100 0 0
0 0 0 15111004 317484 9521488 0 0 0 232 1438 2284 1 0 99 0 0
0 0 0 15111356 317484 9521516 0 0 0 32 1563 2725 1 0 99 0 0
#注意:sed -n '3,$p' 的作用是去掉前3行表頭開始往下取值
[[email protected] ~]# vmstat 1 5 | sed -n '3,$p' | awk '{x = x + $15} END {print x/5}'
99.6
[[email protected] ~]# vmstat 1 5 | sed -n '3,$p' | awk '{x = x + $15} END {print x/5}' | awk '{print $1}'
99.6
[[email protected] ~]#CpuNum=$(printf "%.2f" `echo "scale=2;100-99.6"| bc`)
[[email protected] ~]#echo $CpuNum
0.40
腳本:
#!/bin/sh
source /etc/profile
#define variable
averageIdle=`vmstat 1 5 |sed -n '3,$p'|awk '{x = x + $15} END {print x/5}' |awk '{print $1}'`
echo "averageIdle is " ${averageIdle}
CpuNum=$(printf "%.2f" `echo "scale=2;100-${averageIdle}"| bc`)
echo "CpuNum is " ${CpuNum}
if [ ${CpuNum} -gt 90 ];
then
echo "The usage of system cpu is larger than 90%"
else
echo "The usage of system cpu is ok"
fi