监控机器负载

背景说明

明天就是周末,你却发现程序有bug!!!在某些情况下会进入极度消耗资源的暴走模式,时间在一分一秒的过去,可就是找不着原因。幸运的是,你发现只要一重启问题便消失了,只是不定什么时候又出现,所以机警如你立刻想到,不如用个定时脚本来监控处理重启吧。

问题分析

首先,通过“uptime”命令可以得到近一段时间的机器负载情况;
然后,为了防止误伤,通过ps命令获取目标程序的cpu使用率;
作为保险,还可以再添加多一个接口超时的判断
最后,当机器5分钟负载以及目标程序cpu占用都超过阈值的时候,重启~~

解决方案

#! /bin/sh
# 确定警告阈值
MAX_LOAD=1
MAX_CPU=450

# 获取最近5分钟的机器负载情况
LOAD=`uptime | awk -F 'load average: ' '{print $2}'|awk '{print $2}'`
echo "load 5min: ${LOAD}"

# 首先获取程序PID,然后通过PID获取进程CPU占用率
PROGRAM_PID=`ps -elf|grep "FuckProgram"|grep -v "grep"|awk '{print $4}'`
echo "program pid: ${PROGRAM_PID}"
PROGRAM_CPU=`ps -p ${PROGRAM_PID} -o pcpu |grep -v CPU |awk '{print $1}'`
echo "program cpu: ${PROGRAM_CPU}"

# 比较警告阈值与当前值
resultLoad=`awk -v num1=${LOAD} -v num2=${MAX_LOAD} 'BEGIN{print(num1>num2)?"1":"0"}'`
resultCPU=`awk -v num1=${PROGRAM_CPU} -v num2=${MAX_CPU} 'BEGIN{print(num1>num2)?"1":"0"}'`

# 作为双保险的接口超时判断
MAX_CONNECT_SEC=5
MAX_TRANS_SEC=10
URL="http://some_fuck_url"
RESP=`curl --connect-timeout ${MAX_CONNECT_SEC} -m ${MAX_TRANS_SEC} "${URL}"`
result=$(echo ${RESP} | grep "some fuck content")
resultCURL=1
if [ -n "${result}" ];then
    resultCURL=0
fi

if [ $resultLoad -eq 1 ] ; then
    if [ $resultCPU -eq 1 ] ; then
        if [ $resultCURL -eq 1 ] ; then
            echo `date`" restart"
            restart.sh
        fi
    fi
fi

把以上脚本保存至单独文件,然后添加到crontab每分钟执行,便可以开心的下班过周末了。

results matching ""

    No results matching ""