检测VPS负载过高时重启php,监测php-fpm并重启,IP连接数监控
看看我的负载监控记录 (每2分钟监控一次,每周清空一次)[url=http://www.idc866.com/tsphp.txt]http://www.idc866.com/tsphp.txt[/url]
IP连接数实时监控: (每2分钟监控一次)
[url=http://www.idc866.com/tsip.txt]http://www.idc866.com/tsip.txt[/url]
centos系统中使用:yum -y install bc 安装上bc。
Debian系统中使用:apt-get -y install [size=12px]bc[/size]
[b][color=royalblue]执行脚本:
[/color][/b]**** Hidden Message *****
[color=blue]添加定时执行: crontab -e (2分钟检测一次)[/color]
*/2 * * * * /root/check-php.sh >>/home/wwwroot/default/check-php.txt
[color=blue]测试执行: sh /root/check-php.sh[/color]
显示:
14-07-30 11:21:17 up 15 min, 2 users, load average: 0.00, 0.02, 0.00
无其它提示,则说明正常,
就可以直接用IP访问日志了:[color=royalblue]ip/check-php.txt
[/color] 和IP连接数记录:[color=royalblue]ip/check-ip.txt[/color]
[b][color=#ff0000]注:[/color][/b]一楼check-php.sh 采用二楼脚本代码,最后增加了一个IP连接数记录。
关于check-ip.txt 和 check-php.txt 名可自行修改,免得人家访问。
监控时间都设为2分钟自动执行任务,如果想更快更精准,到时设1分钟即可。
负载监控是 负载高于3时停止php,低于1时启动php,每周清空一次记录
以后 修改脚本经后放出一楼 (结合二楼、三楼脚本)。
现贴出原贴相关脚本:
[size=12px](原脚本这个里面的 /etc/init.d/php-fpm 是与 LNMP的php5.3+的 兼容的 )[/size]
注:
二楼他这些脚本就是有一点点不完美,需结合3楼的方法使用。
就是当你负载超过多少时就会停止php
3分钟后,再检查php是否运行,如果没有运行,则启动php
这就存在一个问题,不管你负载是多少都再次执行启动php。
3分钟后检查负载高了再停止php,再3分钟检查无php进程再启动php
如此循环。。
一楼这个原贴是没做低于多少判断的。
所以到时会一直启动-停止-启动-停止。。 本文分享一例shell脚本,用于检测当Linux负载过高时重启php,监测php-fpm并重启,效果不错,有需要的朋友参考下。
服务器的php-fpm经常负载高,于是写了一个shell脚本来检查负载并重启php。
可以根据服务器的情况来决定要负载超过多少时重启php。
系统:centos 5.9 64位 ([b]注:[/b]支持其它 linux 系统)
[color=blue]shell脚本内容:
[/color]vi /root/check-php.sh
[color=blue]复制代码,保存退出。[/color] 代码示例:
#!/bin/sh
#
TOP_SYS_LOAD_NUM=1
SYS_LOAD_NUM=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`
echo $(date +"%y-%m-%d") `uptime`
if [ `echo "$TOP_SYS_LOAD_NUM < $SYS_LOAD_NUM"|bc` -eq 1 ]
then
echo "#0#" $(date +"%y-%m-%d %H:%M:%S") "pkill php-fpm" `ps -ef | grep php-fpm | wc -l`
/etc/init.d/php-fpm stop
sleep 8
pkill php-fpm
sleep 8
for i in 1 2 3
do
if [ `pgrep php-fpm | wc -l` -le 0 ]
then
/etc/init.d/php-fpm start
sleep 30
echo "#1#" $(date +"%y-%m-%d %H:%M:%S") "start php-fpm" `ps -ef | grep php-fpm | wc -l`
fi
done
else
if [ `pgrep php-fpm | wc -l` -le 0 ]
then
/etc/init.d/php-fpm start
sleep 30
echo "#2#" $(date +"%y-%m-%d %H:%M:%S") "start php-fpm" `ps -ef | grep php-fpm | wc -l`
fi
fi
[color=blue]设置执行权:
[/color]chmod -R 755 /root/check-php.sh
[color=blue]添加定时执行: crontab -e (3分钟检测一次)[/color]
*/3 * * * * /root/check-php.sh >>/home/wwwroot/default/check-php.txt
就可以直接用IP访问日志了:[color=royalblue]ip/check-php.txt
[/color]
[color=blue]测试执行: sh /root/check-php.sh[/color]
显示:
14-07-30 11:21:17 up 15 min, 2 users, load average: 0.00, 0.02, 0.00
无其它提示,则说明正常, 使用上面的IP就能查看记录。
间隔时间,修改 */2为2分钟检测一次 , */1为1分钟检测一次。
[color=red]在运行脚本时,可能会出现如下的错误提示:
[/color]: line 6: bc: command not found
: line 6: [: -eq: unary operator expected
这说明没有找到bc命令,
centos系统中使用:yum -y install bc 安装即可。
Debian系统中使用:apt-get -y install [size=12px]bc[/size]
注:复制原文,中间只把文件位置,和日志地址更改了一下,方便直接查看日志。
复制地址:http://www.jbxue.com/article/12446.html
原地址:http://blog.csdn.net/liuxuejin/article/details/8621268
他这个原贴是没做低于多少判断的。 所以到时会一直启动-停止-启动-停止。。
注: 此脚本支持监控重启其它应用,如nginx,Apache,等。
只要注意中间的 /etc/init.d/php-fpm 启动文件位置,和 php-fpm 进程。 另一参考脚本: (此脚本,有一个高负载时停止,达到低负载时启动。)
http://blog.163.com/lgh_2002/blog/static/4401752620131402842625/
Linux脚本:根据CPU负载及内存使用率自动重启服务进程
[p=20, 2, left] 2013-02-04 12:37:16[/p][p=20, 2, left]
为了让服务器能稳定运行,所以做个脚本能自动检测系统负载,在系统负载很高的时候(当负载或内存占用达到设置值后),自动重启有问题的程序以避免宕机:[/p][p=20, 2, left]# 设置最大内存占用百分比
PID_MEM_MAX=”85″[/p][p=20, 2, left]# 设置最大系统负载
SYS_LOAD_MAX=”1″[/p][p=20, 2, left]# 设置需要监控的服务名称
NAME_LIST=”php5-cgi mysql”[/p][p=20, 2, left]for NAME in $NAME_LIST
do
# 初始化内存统计
PID_MEM_SUM=0[/p][p=20, 2, left]# 获取该程序总进程数
PID_NUM_SUM=`ps aux | grep $NAME | wc -l`[/p][p=20, 2, left]# 列出每个进程内存占用百分比
PID_MEM_LIST=`ps aux | grep $NAME | awk ‘{print $4}’`[/p][p=20, 2, left]# 计算所有进程总内存占用
for PID_MEM in $PID_MEM_LIST
do
PID_MEM_SUM=`echo $PID_MEM_SUM + $PID_MEM | bc`
done[/p][p=20, 2, left]# 获取最近一分钟系统负载
SYS_LOAD=`uptime | awk ‘{print $(NF-2)}’ | sed ‘s/,//’`[/p][p=20, 2, left]# 比较内存占用和系统负载是否超过阀值
MEM_VULE=`awk ‘BEGIN{print(‘”$PID_MEM_SUM”‘>=’”$PID_MEM_MAX”‘?”1″:”0″)}’`
LOAD_VULE=`awk ‘BEGIN{print(‘”$SYS_LOAD”‘>=’”$SYS_LOAD_MAX”‘?”1″:”0″)}’`[/p][p=20, 2, left]# 如果系统内存占用和系统负载超过阀值,则进行下面操作。
if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then
# 写入日志
echo $(date +”%y-%m-%d %H:%M:%S”) “killall $NAME” “(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)”>> /var/log/autoreboot.log
# 正常停止服务
/etc/init.d/$NAME stop
sleep 3
# 强制关闭
pkill $NAME[/p][p=20, 2, left]# 重启
/etc/init.d/$NAME start
#写入日志
echo $(date +”%y-%m-%d %H:%M:%S”) “start $NAME” “(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)” >> /var/log/autoreboot.log
else
echo “$NAME very health!(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)” > /dev/null
fi
done
以上代码保存为一个文件,例如:auto_reboot.sh[/p][p=20, 2, left] 添加计划任务,设置每分钟检查一次(注意文件的位置要搞正确)
crontab -e
* * * * * /bin/bash/root/auto_reboot.sh[/p][p=20, 2, left] 请确保您的Linux系统中已经安装了bc,否则会出现错误。查看是否安装了bc可以使用命令:
bc -v
如果没有安装,centos可以用 yum -y install bc 安装,然后执行命令:
sh /bin/bash/root/auto_reboot.sh[/p][p=20, 2, left] CentOS VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本:
# !/bin/sh
# usage: */2 * * * * root /root/checkload.sh
# [CentOS]VPS服务器根据CPU负载及内存占用自动重启脚本
# 设置最小剩余内存,一般至少要剩余50M可用(单位兆)
FREE_MEM_MIN=”50″
# 设置最大系统负载
SYS_LOAD_MAX=”3″
# 设置重启服务的最小剩余内存(单位兆)
RESTART_FREE_MEM_MIN=”500″
# 设置需要监控的服务名称
NAME_LIST=”httpd mysqld”
for NAME in $NAME_LIST
do
# 获得剩余内存(单位兆)
FREE_MEM=`free -m|grep Mem|awk ‘{print $4}’`
# 获得已用内存(单位兆)
# FREE_MEM=`free -m|grep Mem|awk ‘{print $3}’`
# 获取最近一分钟系统负载
SYS_LOAD=`uptime | awk ‘{print $(NF-2)}’ | sed ‘s/,//’`
# 比较内存占用和系统负载是否超过阀值
MEM_VULE=`awk ‘BEGIN{print(‘”$FREE_MEM”‘<’”$FREE_MEM_MIN”‘?”1″:”0″)}’`
LOAD_VULE=`awk ‘BEGIN{print(‘”$SYS_LOAD”‘>=’”$SYS_LOAD_MAX”‘?”1″:”0″)}’`[/p][p=20, 2, left]# 测试结果
# LOAD_VULE=”1″
# echo $(date +”%y-%m-%d %H:%M:%S”) “DEBUG $NAME” “(FREE_MEM:$FREE_MEM|$MEM_VULE,LOAD:$SYS_LOAD|$LOAD_VULE)”>> /var/log/autoreboot_debug.log[/p][p=20, 2, left]# 如果系统内存占用和系统负载超过阀值,则进行下面操作。
if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then
# 写入日志
echo $(date +”%y-%m-%d %H:%M:%S”) “killall $NAME” “(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)”>> /var/log/autoreboot.log
# 正常停止服务
service $NAME stop
sleep 3
# 强制关闭
skill $NAME
# 重启
sleep 10
for i in 1 2 3
do
FREE_MEM=`free -m|grep Mem|awk ‘{print $4}’`
MEM_VULE=`awk ‘BEGIN{print(‘”$FREE_MEM”‘>=’”$RESTART_FREE_MEM_MIN”‘?”1″:”0″)}’`
if [ `pgrep $NAME | wc -l` -le 0 ] && [ $MEM_VULE = 1 ]
then
service $NAME start
sleep 15
echo “AutoStart:” $(date +”%y-%m-%d %H:%M:%S”) “start $NAME” `ps -ef | grep $NAME | wc -l` > /var/log/autoreboot.log
fi
done[/p][p=20, 2, left]# 写入日志
echo $(date +”%y-%m-%d %H:%M:%S”) “start $NAME” “(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)” >> /var/log/autoreboot.log
else
MEM_VULE=`awk ‘BEGIN{print(‘”$FREE_MEM”‘>=’”$RESTART_FREE_MEM_MIN”‘?”1″:”0″)}’`
if [ `pgrep $NAME | wc -l` -le 0 ] && [ $MEM_VULE = 1 ]
then
service $NAME start
sleep 15
echo “AutoStart:” $(date +”%y-%m-%d %H:%M:%S”) “start $NAME” `ps -ef | grep $NAME | wc -l` > /var/log/autoreboot.log
else
echo “$NAME very health!(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)” > /dev/null
fi
fi
done[/p]
注:此脚本,idc886未做测试,只使用了此脚本的 高负载停低负载启动代码。 重启 就好了吧 停止的话 一般 都会停止很久。。。 大家··看的我花里花俏的···怎么不打包好啊[quote]大家··看的我花里花俏的···怎么不打包好啊··无语了:([/quote] 不错。来看看。 非常有用,尝试一下 非常有用,尝试下,防止502 谢谢大家 重启 就好了吧 停止的话 一般 都会停止很久。。。
页:
[1]