天天看點

Shell程式設計---監控伺服器整個系統CPU負載

題目要求:使用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
           

繼續閱讀