内存OOM

报警描述

业务[XX业务],虚拟机[X.X.X.X]内存-OOM状态报警,状态为剩余内存逼近内存水位底线

说明

这里的OOM是指系统即将触发Linux内部的OOM-Killer机制,这意味着系统将要杀死进程以释放内存。
参考文档:
http://blog.chinaunix.net/uid-29634482-id-5127275.html
根据内存OOM最低水位线和当前的剩余内存进行比较,如果符合下述公式,则报警:
|(内存最低水位线 - 剩余内存) / 内存最低水位线 | < 0.5
例如,内存水位线为 67,584 约67M,当前剩余内存为12,892,约128M,则套用公式:
|(内存最低水位线 - 剩余内存) / 内存最低水位线 | = |(67584 - 12892) / 67584| = 0.80924
此值大于0.5,则不会报警。
又如,内存水位线为 67,584 约67M,当前剩余内存为88,131,约88M,则套用公式:
|(内存最低水位线 - 剩余内存) / 内存最低水位线 | = |(67584 - 88131) / 67584| = 0.30402
此值小于0.5,则会触发报警。

监控对象

Linux操作系统。

监控方式

Linux

检测脚本如下

#!/bin/bash
min_free=`cat /proc/sys/vm/min_free_kbytes`
cur_free=`vmstat |grep -v procs|grep -v swpd|awk '{print$4}'`
echo "MIN=$min_free"
echo "CUR=$cur_free"
for proc in $(find /proc -maxdepth 1 -regex '/proc/[0-9]+'); do
    printf "OOM=%d,%d\n" \
        "$(cat $proc/oom_score)" \
        "$(basename $proc)"
done

输出

MIN=67584
CUR=1033328
OOM=0,1
OOM=0,2
OOM=0,3
OOM=0,5
OOM=0,7
OOM=0,8
OOM=0,9
OOM=0,10
OOM=0,11
OOM=0,12
...
OOM=0,82308
OOM=0,82314
OOM=0,82318
OOM=0,82330
OOM=0,83822
OOM=0,83989
OOM=0,84026
OOM=0,84131
OOM=0,84198
OOM=0,84205

这里采用命令输出中的MIN和CUR的值进行计算。
MIN是内存OOM的最低水位线,CUR是当前剩余内存的数量。当剩余内存逼近OOM最低水位线时,触发报警。

规则

默认为报警级别。