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:输出信息的单位。

命令参数:

事件间隔:状态信息刷新的时间间隔;
次数:显示报告的次数。

解答:

命令行测试:
[root@myhost ~]# 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次。
 
[root@myhost ~]# 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行表头开始往下取值

[root@myhost ~]# vmstat 1 5 | sed -n '3,$p' | awk '{x = x + $15} END {print x/5}' 
99.6
[root@myhost ~]# vmstat 1 5 | sed -n '3,$p' | awk '{x = x + $15} END {print x/5}'  | awk  '{print $1}' 
99.6
[root@myhost ~]#CpuNum=$(printf "%.2f" `echo "scale=2;100-99.6"| bc`)
[root@myhost ~]#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

猜你喜欢

转载自blog.csdn.net/yuki5233/article/details/84061420
今日推荐