免费国外空间,国外免费空间,'s Archiver

idc886 发表于 2014-7-25 17:54

检测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   
如此循环。。

一楼这个原贴是没做低于多少判断的。  
所以到时会一直启动-停止-启动-停止。。

idc886 发表于 2014-7-25 17:59

本文分享一例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 进程。

idc886 发表于 2014-7-25 18:07

另一参考脚本: (此脚本,有一个高负载时停止,达到低负载时启动。)

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未做测试,只使用了此脚本的 高负载停低负载启动代码。

leisun321 发表于 2014-7-25 21:59

重启 就好了吧  停止的话 一般 都会停止很久。。。

379920779 发表于 2014-7-29 20:19

大家··看的我花里花俏的···怎么不打包好啊[quote]大家··看的我花里花俏的···怎么不打包好啊··无语了:([/quote]

loneil 发表于 2015-5-5 20:54

不错。来看看。

admln52 发表于 2015-7-31 11:40

非常有用,尝试一下

kxinbbs 发表于 2015-10-15 11:58

非常有用,尝试下,防止502

a877059905 发表于 2015-12-1 22:23

谢谢大家

aizhu 发表于 2016-9-4 04:08

重启 就好了吧  停止的话 一般 都会停止很久。。。

页: [1]


Powered by Discuz! Archiver 7.2  © 2001-2012 Comsenz Inc.