318 lines
10 KiB
Plaintext
318 lines
10 KiB
Plaintext
|
#!/bin/sh
|
||
|
#
|
||
|
# Copyright (C) 2006-2008 Holger Levsen, Micah Anderson
|
||
|
#
|
||
|
# This program is free software; you can redistribute it and/or
|
||
|
# modify it under the terms of the GNU General Public License
|
||
|
# as published by the Free Software Foundation; version 2 dated June,
|
||
|
# 1991.
|
||
|
#
|
||
|
# This program is distributed in the hope that it will be useful,
|
||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
# GNU General Public License for more details.
|
||
|
#
|
||
|
# You should have received a copy of the GNU General Public License
|
||
|
# along with this program; if not, write to the Free Software
|
||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||
|
|
||
|
# Graph Vserver resource usage and limits
|
||
|
#
|
||
|
# Configuration variables
|
||
|
# vservers - specify the vservers to include in the graph (default: all)
|
||
|
# resource - specify the resource to be monitored (no default)
|
||
|
# limits - if true, turn on limit graphing (default: false)
|
||
|
#
|
||
|
# NOTE: If no configuration variables are set, the defaults will be used
|
||
|
|
||
|
# Example /etc/munin/plugin-conf.d/munin-node
|
||
|
#
|
||
|
# The following monitors the RSS value for the vservers named
|
||
|
# "vserver1 vserver2 vserver3 vserver4" and looks to see if the
|
||
|
# resource limit has been breached, if so it sends a message to nagios
|
||
|
# via send_nsca, and sends an email to notify that this has happened:
|
||
|
#
|
||
|
# [vserver_resources]
|
||
|
# user root
|
||
|
# env.vservers vserver1 vserver2 vserver3 vserver4
|
||
|
# env.resource RSS
|
||
|
# env.limits 1
|
||
|
# contacts nagios email
|
||
|
# contact.nagios.command /usr/bin/send_nsca -H your.nagios-host.here -c /etc/send_nsca.cfg
|
||
|
# contact.email.command mail -s "Munin-notification for ${var:group} :: ${var:host}" your@email.address.here
|
||
|
#
|
||
|
# This second example monitors the VM value for all vservers on the system and
|
||
|
# has no limit notifications turned on:
|
||
|
#
|
||
|
# [vserver_resources]
|
||
|
# user root
|
||
|
# env.vservers vserver5 vserver6 vserver7
|
||
|
# env.resource VM
|
||
|
# env.limits 0
|
||
|
#
|
||
|
# This last example monitors all the resources for vserver5. Note that
|
||
|
# this will be a busy graph, and it would be really useless if you
|
||
|
# specified more than one vserver when the resource is set to ALL:
|
||
|
#
|
||
|
# [vserver_resources]
|
||
|
# user root
|
||
|
# env.vservers vserver5
|
||
|
# env.resource ALL
|
||
|
# env.limits 0
|
||
|
|
||
|
# Possible values for env.resource are:
|
||
|
#
|
||
|
# ALL - all the below resources
|
||
|
# PROC - number of processes
|
||
|
# VM - sum of all virtual pages inside the guest
|
||
|
# VML - sum of all virtual pages locked into memory
|
||
|
# RSS - number of pages currently present in RAM
|
||
|
# ANON - number of anonymous memory pages
|
||
|
# FILES - number of open files
|
||
|
# OFD
|
||
|
# LOCKS
|
||
|
# SOCK
|
||
|
# MSGQ
|
||
|
# SHM - number of shared memory pages
|
||
|
|
||
|
# Changelog
|
||
|
# version 0.1 - 2006 April xx
|
||
|
# Holger Levsen <debian@layer-acht.org>
|
||
|
# - initial author
|
||
|
# version 0.2 - 2006 April 24
|
||
|
# Micah Anderson <micah@riseup.net>
|
||
|
# - Add dynamic arch page size determination
|
||
|
# - Some cleanup and clarification
|
||
|
# version 0.3 - 2006 May 3
|
||
|
# Micah Anderson <micah@riseup.net>
|
||
|
# - Add ability to group vservers via environment vars
|
||
|
# - Fix missing close quotes and standardize indents
|
||
|
# - Add limit notification
|
||
|
# - Update documentation to include info on groups and limits
|
||
|
# version 0.4 - 2006 Jun 22
|
||
|
# Micah Anderson <micah@riseup.net>
|
||
|
# - Fix error that results if NodeName is set to include a domain name
|
||
|
# version 0.5 - 2006 Oct
|
||
|
# Micah Anderson <micah@riseup.net>
|
||
|
# - fixed changelog entries so more changes can happen per version
|
||
|
# - standardized changelog date and name format
|
||
|
# - added myself to copyright
|
||
|
# - standardized indentation
|
||
|
# - abstracted from just RSS to be usable for any resource specified
|
||
|
# Holger Levsen <debian@layer-acht.org>
|
||
|
# - Fix hypens in NodeNames, replace them with underscores
|
||
|
# - Fix the fix from version 0.4
|
||
|
# - allow specifying the ressource by linking
|
||
|
# (ln -s vserver_resources vserver_VM)
|
||
|
# - provided info about all resources
|
||
|
# - code cleaned
|
||
|
# - errors if an invalid resource is specified
|
||
|
# - handle identical vserver-names by using the vserver-id internally
|
||
|
# version 0.6 - 2007 Oct
|
||
|
# Micah Anderson <micah@riseup.net>
|
||
|
# - removed BASENAME - plugin isn't a wildcard plugin any longer
|
||
|
# - added $NAMELOC - fixes plugin so it works with VCI_SPACES (> 2.6.19) as well as older version
|
||
|
#
|
||
|
# TODO:
|
||
|
# - make it so you can specify more than one resource to be graphed?
|
||
|
# or define combined ressource-display: VM+RSS+ANON+SHM and FILES+OFD+LOCK+SOCK
|
||
|
# (for one vserver only)
|
||
|
# - and/or make it so you can graph all resources for one vserver
|
||
|
# - set a default for the resource if it is unset?
|
||
|
# - use /proc less often (100 times more overhead than talking to the kernel directly)
|
||
|
# i.e. use something like pagesize=`perl -MPOSIX -e 'print POSIX::sysconf(_SC_PAGESIZE), "\n";'`
|
||
|
# - ALL resource is broken
|
||
|
|
||
|
VSERVERS="$vservers"
|
||
|
LIMITS="$limits"
|
||
|
RESOURCE="$resource"
|
||
|
|
||
|
INFO=(`sed 's/.*:\t//' /proc/virtual/info 2>/dev/null || echo '<none>'`)
|
||
|
KCIN="$[ 16#${INFO[2]} ]";
|
||
|
|
||
|
# If this is 1, then VCI_SPACES is present in the kernel (new in 2.6.19)
|
||
|
if [ $[ (KCIN >> 10) & 1 ] -eq 1 ]
|
||
|
then
|
||
|
NAMELOC="nsproxy"
|
||
|
else
|
||
|
NAMELOC="cvirt"
|
||
|
fi
|
||
|
|
||
|
if [ -z "$VSERVERS" ] ; then
|
||
|
XIDS=`find /proc/virtual/* -type d -exec basename {} \;`
|
||
|
else
|
||
|
# it's really more performant to specify vservers by ids or not at all
|
||
|
XIDS=""
|
||
|
for i in $VSERVERS ; do
|
||
|
if [ -d /proc/virtual/$i ] ; then
|
||
|
XIDS="${XIDS}${i} "
|
||
|
else
|
||
|
for j in `find /proc/virtual/* -type d -exec basename {} \;` ; do
|
||
|
if [ "$i" = "`cat /proc/virtual/$j/$NAMELOC |grep NodeName |cut -f2`" ] ; then
|
||
|
XIDS="${XIDS}${j} "
|
||
|
fi
|
||
|
done
|
||
|
fi
|
||
|
done
|
||
|
fi
|
||
|
|
||
|
if [ "$1" = "config" ]; then
|
||
|
case "$RESOURCE" in
|
||
|
PROC)
|
||
|
echo 'graph_title Processes used by vserver'
|
||
|
echo 'graph_args --base 1024k -l 0'
|
||
|
echo 'graph_vlabel Processes'
|
||
|
echo 'graph_info Shows the number of processes used by each vserver.'
|
||
|
;;
|
||
|
VM)
|
||
|
echo 'graph_title Virtual memory used by vserver'
|
||
|
echo 'graph_args --base 1024k -l 0'
|
||
|
echo 'graph_vlabel VM pages'
|
||
|
echo 'graph_info Shows virtual memory (human readable) used by each vserver.'
|
||
|
;;
|
||
|
VML)
|
||
|
echo 'graph_title Locked memory used by vserver'
|
||
|
echo 'graph_args --base 1024k -l 0'
|
||
|
echo 'graph_vlabel VML pages'
|
||
|
echo 'graph_info Shows locked memory (human readable) used by each vserver.'
|
||
|
;;
|
||
|
RSS)
|
||
|
echo 'graph_title Resident set size used by vserver'
|
||
|
echo 'graph_args --base 1024k -l 0'
|
||
|
echo 'graph_vlabel RSS pages'
|
||
|
echo 'graph_info Shows resident set size (human readable) used by each vserver.'
|
||
|
;;
|
||
|
ANON)
|
||
|
echo 'graph_title Anonymous memory used by vserver'
|
||
|
echo 'graph_args --base 1024k -l 0'
|
||
|
echo 'graph_vlabel ANON pages'
|
||
|
echo 'graph_info Shows anonymous memory (human readable) used by each vserver.'
|
||
|
;;
|
||
|
FILES)
|
||
|
echo 'graph_title Files used by vserver'
|
||
|
echo 'graph_args --base 1024k -l 0'
|
||
|
echo 'graph_vlabel Files'
|
||
|
echo 'graph_info Shows files used by each vserver.'
|
||
|
;;
|
||
|
OFD)
|
||
|
echo 'graph_title Open filedescriptors used by vserver'
|
||
|
echo 'graph_args --base 1024k -l 0'
|
||
|
echo 'graph_vlabel Open filedescriptors'
|
||
|
echo 'graph_info Shows open filedescriptors used by each vserver.'
|
||
|
;;
|
||
|
LOCKS)
|
||
|
echo 'graph_title Locks used by vserver'
|
||
|
echo 'graph_args --base 1024k -l 0'
|
||
|
echo 'graph_vlabel Locks'
|
||
|
echo 'graph_info Shows locks used by each vserver.'
|
||
|
;;
|
||
|
SOCK)
|
||
|
echo 'graph_title Sockets used by vserver'
|
||
|
echo 'graph_args --base 1024k -l 0'
|
||
|
echo 'graph_vlabel Sockets'
|
||
|
echo 'graph_info Shows sockets used by each vserver.'
|
||
|
;;
|
||
|
MSGQ)
|
||
|
echo 'graph_title Message queues used by vserver'
|
||
|
echo 'graph_args --base 1024k -l 0'
|
||
|
echo 'graph_vlabel Message queues'
|
||
|
echo 'graph_info Shows message queues used by each vserver.'
|
||
|
;;
|
||
|
SHM)
|
||
|
echo 'graph_title Shared memory used by vserver'
|
||
|
echo 'graph_args --base 1024k -l 0'
|
||
|
echo 'graph_vlabel SHM pages'
|
||
|
echo 'graph_info Shows shared memory (human readable) used by each vserver.'
|
||
|
;;
|
||
|
*)
|
||
|
echo "$RESOURCE not defined."
|
||
|
exit 1
|
||
|
;;
|
||
|
esac
|
||
|
echo 'graph_category vserver'
|
||
|
|
||
|
|
||
|
# do not assume we are on i386 where pagesize is 4096...
|
||
|
pagesize=`perl -MPOSIX -e 'print POSIX::sysconf(_SC_PAGESIZE), "\n";'`
|
||
|
|
||
|
for xid in $XIDS ; do
|
||
|
|
||
|
LABEL=`cat /proc/virtual/$xid/$NAMELOC |grep NodeName |cut -f2`
|
||
|
NAME=`echo $LABEL | cut -d. -f1 | tr '-' '_'`
|
||
|
|
||
|
case "$RESOURCE" in
|
||
|
PROC)
|
||
|
echo "$NAME.label $LABEL: processes"
|
||
|
echo "$NAME.info Number of processes used by $LABEL."
|
||
|
;;
|
||
|
VM)
|
||
|
echo "$NAME.label $LABEL: Virtual memory"
|
||
|
echo "$NAME.info Size of virtual memory used by $LABEL. (Number multipled by $pagesize to make it human readable)"
|
||
|
echo "$NAME.cdef $NAME,$pagesize,*"
|
||
|
;;
|
||
|
VML)
|
||
|
echo "$NAME.label $LABEL: Locked memory"
|
||
|
echo "$NAME.info Size of locked memory used by $LABEL. (Number multipled by $pagesize to make it human readable)"
|
||
|
echo "$NAME.cdef $NAME,$pagesize,*"
|
||
|
;;
|
||
|
RSS)
|
||
|
echo "$NAME.label $LABEL: Resident set size"
|
||
|
echo "$NAME.info Size of resident set size used by $LABEL. (Number multiplied by $pagesize to make it human readable)"
|
||
|
echo "$NAME.cdef $NAME,$pagesize,*"
|
||
|
;;
|
||
|
ANON)
|
||
|
echo "$NAME.label $LABEL: Anonymous memory"
|
||
|
echo "$NAME.info Size of anonymous memory used by $LABEL. (Number multiplied by $pagesize to make it human readable)"
|
||
|
echo "$NAME.cdef $NAME,$pagesize,*"
|
||
|
;;
|
||
|
FILES)
|
||
|
echo "$NAME.label $LABEL: Files"
|
||
|
echo "$NAME.info Number of files used by $LABEL."
|
||
|
;;
|
||
|
OFD)
|
||
|
echo "$NAME.label $LABEL: Open filedescriptors"
|
||
|
echo "$NAME.info Number of open filedescriptors used by $LABEL."
|
||
|
;;
|
||
|
LOCKS)
|
||
|
echo "$NAME.label $LABEL: Locks"
|
||
|
echo "$NAME.info Number of locks used by $LABEL."
|
||
|
;;
|
||
|
SOCK)
|
||
|
echo "$NAME.label $LABEL: Sockets"
|
||
|
echo "$NAME.info Number of sockets used by $LABEL."
|
||
|
;;
|
||
|
MSGQ)
|
||
|
echo "$NAME.label $LABEL: Message queues"
|
||
|
echo "$NAME.info Number of message queues used by $LABEL."
|
||
|
;;
|
||
|
SHM)
|
||
|
echo "$NAME.label $LABEL: Shared memory"
|
||
|
echo "$NAME.info Size of shared memory used by $LABEL. (Number multiplied by $pagesize to make it human readable)"
|
||
|
echo "$NAME.cdef $1,$pagesize,*"
|
||
|
;;
|
||
|
*)
|
||
|
echo "$RESOURCE not defined."
|
||
|
exit 1
|
||
|
;;
|
||
|
esac
|
||
|
|
||
|
if [ ! -z "$LIMITS" -a "$LIMITS" = 1 ]; then
|
||
|
LIMIT=`cat /proc/virtual/$xid/limit | grep $RESOURCE | cut -f4`
|
||
|
if [ ${LIMIT:-0} -gt 0 ]; then
|
||
|
echo "$NAME.critical $LIMIT"
|
||
|
fi
|
||
|
fi
|
||
|
done
|
||
|
exit 0
|
||
|
fi
|
||
|
|
||
|
|
||
|
for xid in $XIDS ; do
|
||
|
LABEL=`cat /proc/virtual/$xid/$NAMELOC |grep NodeName |cut -f2`
|
||
|
NAME=`echo $LABEL | cut -d. -f1 | tr '-' '_'`
|
||
|
cat /proc/virtual/$xid/limit | awk -v name="${NAME}" -v resource="${RESOURCE}:" \
|
||
|
'{ if ( $1 == resource )
|
||
|
printf "%s.value %d\n", name, $2 }'
|
||
|
done
|
||
|
|