oom_of_squid
用于监控服务器上的squid进程,保证对用户服务的稳定。
此进程意欲以守护进程模式运行,可以这样使用:./oom_of_squid &
主要功能:
监控配置过的每个squid进程,保证它的内存占用看似正常;
确保进程PID和PID文件一致;
squid进程挂掉后启动之;
squid进程占用的内存超过设置的阀值则重启之;
系统可用内存低于阀值,则选择一个squid进程重启之;
默认每3秒检查一次;

注意事项:
`echo squid7[0-9].conf`在gentoo和CentOS上的行为不一样,到CentOS下应用可能需要改为`ls squid7[0-9].conf`;
/proc/$PID/comm 在较新的内核上才有这个接口,使用旧内核需要另想办法;
/etc/init.d/squid_multi_instance是我重写过的进程管理脚本(还有bug),使用“标准”脚本的人需要自己改一下;
系统可用内存阀值应该适当高于系统自身的oom阀值;
用于全内存式缓存更好,因为不用顾忌状态文件的同步。
我设置的配置文件中,squid7[0-9].conf是carp-child,用于缓存文件;squid8[0-9].conf是carp-parent,用于决定URL在集群中的分布。

附件为脚本。望用的上的同仁多提宝贵意见!!!

#!/bin/bash
# 功能:
#    在系统可用内存很小时选取一个squid进程重启
#    检查各进程健康状况

MAIL="gongfan193@gmail.com"        # 设置自己的邮箱
MAIL_FROM="oom_of_squid@gwbnsh.net.cn"
CHECK_INTERVAL="3s"        # 检查时间间隔
THRESHOLD_LOW_MEM="90"            # MB,低内存阀值; 必须大于vm.min_free_kbytes
THRESHOLD_CHILD_MAX_MEM="200"    # MB,child持有内存大于此值就重启
THRESHOLD_EMERG="100"            # MB,LEVEL="emerg"时重启进程的阀值
LEVEL="normal"    # 内存级别,可用内存较低时设置为emerg; 正常情况下应该是空变量
LOG="$0.log"

# 探测配置文件,70-79之间的端口为parent,80-87为child
CONFIG_LOCATION="/etc/squid/"
PARENT_CONF=$(cd $CONFIG_LOCATION; echo squid7[0-9].conf)
CHILD_CONF=$(cd $CONFIG_LOCATION; echo squid8[0-9].conf)
ALL_CONF="$PARENT_CONF $CHILD_CONF"

# disable killing by oom
echo "-17" > /proc/self/oom_adj

all_free_mem() {
    free -m | awk '/^Mem:/ {print ($4 + $6 + $7)}'    # 单位是MB
}
squid_instance_mem() {
    INSTANCE=${CONF%.conf}
    PID_FILE="/var/run/$INSTANCE.pid"
    [[ -e $PID_FILE ]] && PID_FROM_FILE=`cat $PID_FILE` || PID_FROM_FILE=""
    # 检查名称和进程号是否对应
    if [ -e $PID_FILE ]; then
        [[ x$PID_FROM_FILE != "x" ]] && grep -q squid /proc/$PID_FROM_FILE/comm || false
    else
        echo "$INSTANCE pid file not match to squid" >> $LOG
    fi
    # 占用的内存数量
    RSS=`awk '/^VmRSS:/ {printf "%d\n", $2/1024}' /proc/$PID_FROM_FILE/status`
}
keep_processes_health() {
    # 检查所有进程,如果挂了,修正一下
    for CONF in $ALL_CONF; do
        INSTANCE=${CONF%.conf}
        PID_FILE="/var/run/$INSTANCE.pid"
        STATE_FILE="/var/lib/init.d/started/$INSTANCE"
        [[ -e $PID_FILE ]] && PID_FROM_FILE=`cat $PID_FILE` || PID_FROM_FILE=""
        PID_RUNNING=`ps axo user,pid,cmd | awk '/^squid/ && /'$CONF'/ {print $2}'`

if [ x$PID_RUNNING = "x" ]; then
            # 进程不存在: 启动进程
            process_state="not_running"
            echo "`date +%F\ %T` $INSTANCE state is $process_state, restarted" >> $LOG
            [[ -e $PID_FILE ]] && /bin/rm -f $PID_FILE
            [[ -e $STATE_FILE ]] && /bin/rm -f $STATE_FILE
            /etc/init.d/squid_multi_instance start ${INSTANCE#squid} >/dev/null 2>&1
            notify_admin &
        elif [ x$PID_FROM_FILE = "x" ]; then
            # pid文件有问题: 修正
            process_state="bad_pid_file"
            if echo $PID_RUNNING > $PID_FILE; then
                process_state="good"
                echo "fixed pid file of $INSTANCE at `date +%F\ %T`" >> $LOG
            else
                echo "can not write $PID_FILE" >> $LOG
                process_state="pid_file_not_writeable"
                notify_admin &
            fi
        elif [ x$PID_FROM_FILE != x$PID_RUNNING ]; then
            # 什么情况下会这样呢...
            process_state="pid_not_equal"
            if echo $PID_RUNNING > $PID_FILE; then
                echo "fixed $process_state of $INSTANCE at `date +%F\ %T`" >> $LOG
                notify_admin &
            else
                echo "can not write $PID_FILE" >> $LOG
                process_state="$process_state pid_file_not_writeable"
                notify_admin &
            fi
        elif [ x$PID_FROM_FILE = x$PID_RUNNING ]; then
            # 运行良好
            process_state="good"
            continue
        else
            process_state="unknow"
            notify_admin &
        fi
    done
    unset process_state
}
restart_process() {
    INSTANCE=${CONF%.conf}
    /etc/init.d/squid_multi_instance restart ${INSTANCE#squid} >/dev/null 2>&1
    notify_admin &
}
pick_and_restart_parent() {
    # 重启占用内存最大的进程
    for CONF in $PARENT_CONF; do
        squid_instance_mem
        PARENT_MEM="$PARENT_MEM\n$RSS $CONF"
    done
    PARENT_MEM_MAX=`echo -e $PARENT_MEM | sort -n | tail -1`
    if [ -n $PARENT_MEM_MAX ]; then
        CONF=`echo $PARENT_MEM_MAX | awk '{print $2}'`
        restart_process
        echo "restarted parent ${CONF%.conf} at `date +%F\ %T`" >> $LOG
    else
        echo "unknow error in pick_and_restart_parent" >> $LOG
    fi
}
pick_and_restart_child() {
    # 正常情况下重启内存大于300M的进程; 紧急情况下重启大于100M的进程
    for CONF in $CHILD_CONF; do
        squid_instance_mem
        if [ $RSS -gt $THRESHOLD_CHILD_MAX_MEM ]; then
            process_state="over_THRESHOLD_CHILD_MAX_MEM"
            echo "$process_state restarted child ${CONF%.conf} at `date +%F\ %T`" >> $LOG
            restart_process
        else
            true
        fi
    done
    if [ x$LEVEL = "xemerg" ]; then
        for CONF in $CHILD_CONF; do
            squid_instance_mem
            [[ $RSS -gt $THRESHOLD_EMERG ]] && (process_state="over_THRESHOLD_EMERG"; restart_process)
        done
    else
        true
    fi
}
pick_and_restart_one() {
    # restart a child first
    pick_and_restart_child
    
    # memory still low, restart a parent
    [[ `all_free_mem` -lt $THRESHOLD_LOW_MEM ]] && pick_and_restart_parent
    
    # memory still low, restart all child
    [[ `all_free_mem` -lt $THRESHOLD_LOW_MEM ]] && \
    (CONF="child"; restart_process)
}
notify_admin() {
    sendmail -t -f $MAIL_FROM <<EOF
To: $MAIL
From: $MAIL_FROM
Subject: $INSTANCE on `hostname` restarted

重启过了 `hostname` 上的 $INSTANCE
进程 $INSTANCE 的最后状态为: $process_state

当前系统总剩余内存为: `all_free_mem`
.
EOF
}
while true; do
    keep_processes_health

# child占用内存大于THRESHOLD_CHILD_MAX_MEM就重启,不等总内存过低
    pick_and_restart_child

if [ `all_free_mem` -lt $THRESHOLD_LOW_MEM ]; then
        LEVEL="emerg"
        echo "low memory at `date +%F\ %T`" >> $LOG
        pick_and_restart_one
    else
        LEVEL="normal"
        sleep $CHECK_INTERVAL
    fi
done
# vim: set sw=4 ts=4:

转载于:https://blog.51cto.com/lzy821218/1135325

squid内存监控脚本相关推荐

  1. python移动端内存、电量监控脚本

    python移动端内存.电量监控脚本,自动输出到本地txt adb命令查电量 adb shell dumpsys battery 电量监控脚本 内存监控脚本,适用于监控内存泄漏 第一次写博客,大家凑合 ...

  2. linux系统CPU,内存,磁盘,网络流量监控脚本

    前序 1, #cat /proc/stat/  信息包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累积到当前时刻 2, #vmstat –s   或者 #vmstat    虚拟内存统 ...

  3. 编写监控脚本,监控集群内所有服务存活状态,内存、磁盘剩余率检测,异常则发送报警邮件...

    发送邮件Python程序 #!/usr/bin/python # -*- coding: UTF-8 -*- import sys import smtplib import email.mime.m ...

  4. Oracle性能监控脚本

    Oracle性能监控脚本 2011-09-05      0 个评论       收藏    我要投稿 1. 监控事例的等待 select event,sum(decode(wait_Time,0,0 ...

  5. monit 内存 监控_如何借助Monit搭建服务器监控系统?(1)

    许多Linux管理员依赖一种集中式远程监控系统(比如Nagios或Cacti),检查网络基础设施的健康状况.虽然集中式监控系统为管理员在处理许多主机和设备时简化了工作,但专用的监控设备显然成了单一故障 ...

  6. linux100day(day8)--shell监控脚本练习

    这是一个大型的监控脚本,方便于查看硬盘,网络,负载,内核版本等系统信息. 本脚本来自于github的atarallo,我对脚本做出了改编和一些注释,尽量让新手也能理解,这个脚本逻辑清楚简单,适合用于练 ...

  7. 几个常用的Linux操作系统监控脚本

    为大家提供五个常用Linux监控脚本(查看主机网卡流量.系统状况监控.监控主机的磁盘空间,当使用空间超过90%就通过发mail来发警告.监控CPU和内存的使用情况.全方位监控主机),有需要的朋友不妨看 ...

  8. [Linux] linux服务器主机性能、空间监控脚本

    1.下载SendEmail: 2.建立监控脚本: [oracle@db1 scripts]$ cat check_system_warning.sh #!/bin/sh #定义变量 v_datetim ...

  9. Linux命令之系统五大负载(监控脚本及问题详解)

    文章目录 一.I/O 1.监控脚本 2.I/O过高异常如何解决 二.网络流量 1.监控脚本 2.网络流量异常如何解决 三.硬盘 1.监控脚本 2.硬盘满了如何解决df -h 四.cpu 1.监控脚本 ...

  10. 利用Python实现系统监控脚本

    利用Python实现系统监控脚本 简介 该 Python 脚本,用于监控计算机或网络的性能和状态.该脚本可用于跟踪各种指标,例如 CPU 使用率.内存使用率.磁盘空间.网络流量和系统正常运行时间.该脚 ...

最新文章

  1. libevent中的bufferevent
  2. yar java_Yar 的传输协议学习以及 Java 版本的实现
  3. bzoj 1179 抢掠计划atm (缩点+有向无环图DP)
  4. oracle中lead函数,oracle lead()函数 | 学步园
  5. OpenGL定向光的投影阴影
  6. 计算机房消防知识培训,通信机房消防知识培训课件.ppt
  7. get与post的区别与联系
  8. 帝国cms搜索php分页,帝国cms V7.2自定义分页(列表分页,内容分页)样式步骤
  9. http中的请求头各部分都是什么意思_硬核!30 张图解 HTTP 常见的面试题
  10. 关键字:auto、static、register、const、volatile 、extern 总结
  11. Jenkins教程(Windows版)
  12. 正交试验软件测试用例设计方法【建议收藏】
  13. grub引导删除双系统中的linux的正确姿势
  14. CNZZ埋点及点击量统计方法
  15. 警惕“不续签劳动合同”式裁员
  16. 数学建模与数据分析中的主成分分析
  17. zxr10交换机配置手册vlan_中兴ZXR10配置说明.doc
  18. 如何在Android上玩经典复古游戏
  19. mysql架设手游_战神引擎手游架设教程
  20. 2015,GECCO,Comparison of Semantic-aware Selection Methods in Genetic Programming

热门文章

  1. Silverlight中的ControlTemplate
  2. LOJ2392 JOISC2017 烟花棒 二分、贪心
  3. 关于阿里巴巴发布普惠体的一些思考
  4. 移动端数据爬取和Scrapy框架
  5. [算法]tarjan
  6. 怎么去掉word标题前的黑点
  7. 095 issubclass和isinstance
  8. 数值类型小数点后是否可以接零问题
  9. 男孩应该懂的,女孩应该懂的
  10. 【转】c语言位域操作—_结构体内冒号:的使用