Memory Usage in Nagios

Ich hatte für mein Nagios ein Plugin gesucht, was die RAM auslastung anzeigt und Performancedaten liefert. Es gab mehrere zur Auswahl, welche aber alle nicht so toll waren und unterschiedliche Daten ausgaben. Also hab ich mir eins davon ausgesucht und es umgeschrieben. Die Auswahl fiel auf das Script von Vinicius de Figueiredo Silva (Link). Ich passte mir das Script so an, dass es mir den wirkliche benutzen RAM anzeigt, den Ge-cache-ten und Freien anzeigt. Und das Beste an dem Script von Vinicius de Figueiredo Silva war, das es mir Performancedaten liefert. Das ist zwar nichts Aufwendiges, ich wusste aber nicht wie man so etwas macht, bevor ich sein Script sah.

Was ich zu anfang an Vinicius de Figueiredo Silva’s Script nicht so gut fand war, das es nicht den wirklich benutzen RAM anzeigte. sondern den „belegten“, wozu auch ge-cached-ter und bufferd RAM zählen. Dadurch war der RAM-Zustand fast immer kritisch. Denn Linux ist so ausgelegt, dass es sich fast den gesamten RAM sichert und dann selbst verwaltet. Dies sieht dann für den Laien so aus, als ob der gesamte RAM belegt wäre.

Ist er aber nicht! Viele andere Scripts die ich sah, gingen davon aus, dass die erste zeile vom Kommando „free“ die entscheidene sei. Leider ist dem nicht so, denn im eigentlichen zählt erst die zweite Zeile.


		total		used		free		shared		buffers		cached
Mem:		2025		1959		65		0 		258		1031
-/+ buffers/cache:669		1356
Swap:		2000		0		2000

Auf Grundlage dessen hab ich mir dann das Script angepasst.

Das Script hier zum Download: Link

Oder das Script selbst:

#!/bin/bash
#
# RAM usage monitor plugin for Nagios
# Written by Vinicius de Figueiredo Silva (viniciusfs@gmail.com)
# Last Modified: 27-11-2007
# Modified by Robert Waffen (zero0ne@zero0ne.de)
#
# Usage: ./check_ram
#
# Description:
# This plugin checks how much percentage of RAM is in use.
# Tested only in Linux (Debian, Ubuntu, CentOS and Red Hat Enterprise)
# and Solaris 8/9.
#
#
# Extension:
# 	* shows cached memory
# 	* realy used memory
# 	* free memory
#######################################################################

STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

MB_MODE=0

RAM_TOTAL=0
RAM_FREE=0
RAM_CACHED=0
RAM_INUSE=0

print_help() {
        echo "CHECK_RAM - RAM usage monitor plugin for Nagios"
        echo "Copyright (c) 2007 Vinicius de Figueiredo Silva (viniciusfs@gmail.com)"
        echo ""
        echo "This script checks for RAM usage and generates an alarm when"
        echo "RAM usage is over threshold values."
        echo ""
        echo "Options:"
        echo "  -m"
        echo "     Prints output and performance data in MB instead of percentage."
        echo ""
        print_usage
        echo ""
        echo "Example: check_ram 80 90"
        echo ""
        echo "This example will generates a warning alarm when RAM usage is over 80%"
        echo "and a critical alarm when RAM usage is over 90%."
}

print_usage() {
        echo "UUsage: check_ram2   "
}

case "$1" in
        --help|-h)
                print_help
                exit $STATE_OK
                ;;
        *)
                if [ $# -lt 2 ]; then
                        print_usage
                        exit $STATE_UNKNOWN
                elif [ $1 -ge $2 ]; then
                        print_usage
                        echo "Warning value must be greater than Critical value."
                        exit $STATE_UNKNOWN
                elif [ $1 -lt 1 ] || [ $1 -gt 100 ] || [ $2 -lt 1 ] || [ $2 -gt 100 ]; then
                        print_usage
                        echo "Values are out of range [0-100]."
                        exit $STATE_UNKNOWN
                fi
                ;;
esac

WARN=$1
CRIT=$2

OS=`uname -a | awk '{ print $1 }'`

case "$OS" in
        Linux)
                RAM_TOTAL=`free -m | grep -i mem | awk '{ print $2 }'`
                RAM_INUSE=`free -m | grep -e "-/+" | awk '{ print $3 }'`
		RAM_FREE=`free -m | grep -e "-/+" | awk '{ print $4 }'`
                RAM_CACHED=`free -m | grep -i mem | awk '{ print $7 }'`
                ;;
        SunOS)
                RAM_TOTAL=`prtconf | grep ^"Memory size" | awk '{print $3}'`
                RAM_FREE=`vmstat 1 5 | tail -1 | awk '{print $5}'`
                RAM_FREE=$(($RAM_FREE/1000))
                RAM_INUSE=$(($RAM_TOTAL-$RAM_FREE))
                ;;
esac

PERC_INUSE=$(((100*$RAM_INUSE)/$RAM_TOTAL))
PERC_FREE=$(((100*$RAM_FREE)/$RAM_TOTAL))
PERC_CACHED=$(((100*$RAM_CACHED)/$RAM_TOTAL))
PERFDATA="used=$PERC_INUSE%;free=$PERC_FREE%;chached=$PERC_CACHED%;$WARN;$CRIT;0;100"

if [ $3 ] && [ $3 = "-m" ]; then
        MB_MODE=1
        RAM_WARN=$((($RAM_TOTAL*$WARN)/100))
        RAM_CRIT=$((($RAM_TOTAL*$CRIT)/100))
	RAM_C=$((($RAM_TOTAL*$RAM_CACHED)/100))
	RAM_F=$((($RAM_TOTAL*$RAM_FREE)/100))
        PERFDATA="used=${RAM_INUSE}MB;free=${RAM_FREE}MB;cached=${RAM_CACHED}MB;$RAM_WARN;$RAM_CRIT;0;$RAM_TOTAL"
fi

if [ $PERC_INUSE -ge $CRIT ]; then
        if [ $MB_MODE -eq 1 ]; then
                echo "RAM CRITICAL - ${RAM_INUSE}MB of ${RAM_TOTAL}MB in use, free= ${RAM_FREE}MB, cached= ${RAM_CACHED}MB |$PERFDATA"
        else
                echo "RAM CRITICAL - RAM usage in $PERC_INUSE%, free= $PERC_FREE%, chached=$PERC_CACHED% |$PERFDATA"
        fi
        exit $STATE_CRITICAL
elif [ $PERC_INUSE -ge $WARN ]; then
        if [ $MB_MODE -eq 1 ]; then
                echo "RAM WARNING - ${RAM_INUSE}MB of ${RAM_TOTAL}MB in use, free= ${RAM_FREE}MB, cached= ${RAM_CACHED}MB |$PERFDATA"
        else
                echo "RAM WARNING - RAM usage in $PERC_INUSE%, free= $PERC_FREE%, chached=$PERC_CACHED% |$PERFDATA"
        fi
        exit $STATE_WARNING
else
        if [ $MB_MODE -eq 1 ]; then
                echo "RAM OK - ${RAM_INUSE}MB of ${RAM_TOTAL}MB in use, free= ${RAM_FREE}MB, cached= ${RAM_CACHED}MB |$PERFDATA"
        else
                echo "RAM OK - RAM usage in $PERC_INUSE%, free= $PERC_FREE%, chached=$PERC_CACHED% |$PERFDATA"
        fi
        exit $STATE_OK
fi