-
-
Save litmleong/c2b62393d7ec49150af5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Show the rate of swapping (in number of pages) between executions | |
OK=0 | |
WARNING=1 | |
CRITICAL=2 | |
UNKNOWN=-1 | |
EXITFLAG=$OK | |
WARN_THRESHOLD=1 | |
CRITICAL_THRESHOLD=100 | |
IN_DATAFILE="/var/tmp/nagios_check_swap_pages_in.dat" | |
OUT_DATAFILE="/var/tmp/nagios_check_swap_pages_out.dat" | |
VALID_INTERVAL=600 | |
# Rotate the data files if they exceed this size | |
MAX_LOG_SIZE=65536 | |
function usage() | |
{ | |
echo "usage: $0 --warn=<pages per second in or out> --critical=<pages per second in or out>" | |
echo "Script checks for any swap usage" | |
} | |
while [ "$1" != "" ]; do | |
PARAM=`echo $1 | awk -F= '{print $1}'` | |
VALUE=`echo $1 | awk -F= '{print $2}'` | |
case $PARAM in | |
--warn) | |
WARN_THRESHOLD=$VALUE | |
;; | |
--critical) | |
CRITICAL_THRESHOLD=$VALUE | |
;; | |
-h | --help) | |
usage | |
exit 0; | |
;; | |
esac | |
shift | |
done | |
NOW=`date +%s` | |
min_valid_ts=$(($NOW - $VALID_INTERVAL)) | |
CURRENT_PAGES_SWAPPED_IN=`vmstat -s | grep 'pages swapped in' | awk '{print $1}'` | |
CURRENT_PAGES_SWAPPED_OUT=`vmstat -s | grep 'pages swapped out' | awk '{print $1}'` | |
mkdir -p $(dirname $IN_DATAFILE) | |
if [ ! -f $IN_DATAFILE ]; then | |
echo -e "$NOW\t$CURRENT_PAGES_SWAPPED_IN" > $IN_DATAFILE | |
echo "Missing $IN_DATAFILE; creating" | |
EXITFLAG=$UNKNOWN | |
fi | |
if [ ! -f $OUT_DATAFILE ]; then | |
echo -e "$NOW\t$CURRENT_PAGES_SWAPPED_OUT" > $OUT_DATAFILE | |
echo "Missing $OUT_DATAFILE; creating" | |
EXITFLAG=$UNKNOWN | |
fi | |
if [ $EXITFLAG != $OK ]; then | |
exit $EXITFLAG | |
fi | |
function swap_rate() { | |
local file=$1 | |
local current=$2 | |
local rate=0 | |
mv $file ${file}.previous | |
while read ts swap_count; do | |
if [[ $ts -lt $min_valid_ts ]]; then | |
continue | |
fi | |
if [[ $ts -ge $NOW ]]; then | |
# we can't use data from the same second | |
continue | |
fi | |
# calculate the rate | |
swap_delta=$(($current - $swap_count)) | |
ts_delta=$(($NOW - $ts)) | |
rate=`echo "$swap_delta / $ts_delta" | bc` | |
echo -e "$ts\t$swap_count" >> $file | |
done < ${file}.previous | |
echo -e "$NOW\t$current" >> $file | |
echo $rate | |
} | |
function rotate_log() { | |
local file=$1 | |
current_size=`stat -c "%s" $file` | |
if [ $current_size -gt $MAX_LOG_SIZE ]; then | |
tail -65 $file > $file.tmp #make sure that doesn't exceed max_size | |
mv $file.tmp $file | |
fi | |
} | |
in_rate=`swap_rate $IN_DATAFILE $CURRENT_PAGES_SWAPPED_IN` | |
out_rate=`swap_rate $OUT_DATAFILE $CURRENT_PAGES_SWAPPED_OUT` | |
for f in $IN_DATAFILE $OUT_DATAFILE; do | |
rotate_log $f | |
done | |
echo "swap in/out is $in_rate/$out_rate pages per second|swap_in: $in_rate, swap_out: $out_rate" | |
if [[ $in_rate -ge $CRITICAL_THRESHOLD ]] || [[ $out_rate -ge $CRITICAL_THRESHOLD ]]; then | |
exit $CRITICAL | |
fi | |
if [[ $in_rate -ge $WARN_THRESHOLD ]] || [[ $out_rate -ge $WARN_THRESHOLD ]]; then | |
exit $WARNING | |
fi | |
exit $OK |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment