Falls man den I/O der logischen Festplatten unter MS-Betriebssystemen nicht per check_nt und dem Performancemonitor von Windows monitoren will, kann auf SNMP zurückgreifen. Nun bietet leider die MS-Standard-MIB nicht die Möglichkeit die Festplatten-I/O's zu überwachen. Hier greift ein nettes kleines Zusatztool, welches einen zusätzlichen sog. „Performance provider agent“ zur Verfügung stellt. Dieser klinkt sich mittels der „MS Performance Data Helper API“ in das „Windows Performance Monitor subsystem“. Dadurch werden zusätzliche Performance Counter per SNMP verfügbar.
Das erwähnte Zusatztool ist unter link verfügbar und nennt sich „snmp-informant“. (Die Grundversion ist frei verfügbar)
Laut der Herstellerseite werden alle Windows-Version ab 2000 unterstützt. Ich kann sagen, dass mit XP Pro und Windows Server 2003, R2, englisch wie auch deutsch keine Probleme gab.
Das Tools läßt sich per GUI oder per Kommandozeilen-Parameter leicht installieren. In meiner Umgebung habe ich ausschließlich die Kommandozeile mit folgendem Aufruf verwendet:
informant-std-16.exe /verysilent /LOG="C:\snmp-informant-install.log" /NOCANCEL /NORESTART /NOICONS /GROUP="SNMP for NAGIOS"
Die einzelnen Parameter sind einzeln in einem PDF erklärt, welches in dem herunterzuladendem ZIP-Paket enthalten.
Wenn SNMP-Informant installiert wurde, sind die zugehörigen MIB's in dem Installationsverzeichnis “(SNMP-Informant)\standard\mibs\[SMIv1|SMIv2]“ zu finden (SNMP v1 und v2).
Nun muss natürlich noch eine SNMP-Abfrage auf der Nagios-Server-Seite geschehen um die IO-Daten abzufragen. Hierfür bietet sich „snmpget“ an.
Eine mögliche „snmpget“-Abfrage für die gelesenen Bytes pro Sekunde für die Platte C lautet so:
/usr/bin/snmpget -c YOURCOMMUNITY -v1 xxx.xxx.xxx.xxx 1.3.6.1.4.1.9600.1.1.1.1.15.2.67.58
Hier existiert noch ein „Stolperstein“… die genannte OID setzt sich aus 2 Teilen zusammen:
1.3.6.1.4.1.9600.1.1.1.1.15.2 steht für den Bereich „gelesene Bytes pro Sekunde“ 67.58 steht für die Festplatte C
Das heißt, wenn nun die gelesenen Bytes pro Sekunde für die Festplatte D abgefragt werden möchte, heißt die komplette OID 1.3.6.1.4.1.9600.1.1.1.1.15.2.68.58
Somit existiert folgende Aufschlüsselung für die einzelnen logischen Platten:
Für die Nagios-Integration habe ich eine kleines Shell-Skript gestrickt. Dieses ist bei weitem nicht Code-conform. Aber mir reicht es völlig. Also wer hier noch Verbesserung anbringen möchte… immer ran:
#!/bin/bash
# Skriptname lautet "check_performance_logicaldisc_NT"
. /usr/local/nagios/libexec/utils.sh
ECHO=/bin/echo
READ_OID=1.3.6.1.4.1.9600.1.1.1.1.15.2
WRITE_OID=1.3.6.1.4.1.9600.1.1.1.1.18.2
while /usr/bin/test -n "$1"; do
case "$1" in
-H)
HOST=$2;
shift;
;;
-D)
DRIVE=$2;
shift;
;;
*)
$ECHO "FALSCH"
exit $STATE_UNKNOWN
esac
shift
done
case "$DRIVE" in
C)
DRIVE=67.58;
;;
D)
DRIVE=68.58;
;;
E)
DRIVE=69.58;
;;
F)
DRIVE=70.58;
;;
G)
DRIVE=71.58;
;;
H)
DRIVE=72.58;
;;
I)
DRIVE=73.58;
;;
J)
DRIVE=74.58;
;;
K)
DRIVE=75.58;
;;
L)
DRIVE=76.58;
;;
*)
$ECHO "Unbekannter Laufwerksbuchstabe"
exit $STATE_UNKNOWN
esac
SUM_read=0
SUM_write=0
ERROR_COUNTER=0
for i in 1 2 3 4 5 6 7 8 9 10
do
read_VALUE=$(/usr/bin/snmpget -c YOURCOMMUNITY -v1 $HOST $READ_OID.$DRIVE | awk '{print $NF}')
write_VALUE=$(/usr/bin/snmpget -c YOURCOMMUNITY -v1 $HOST $WRITE_OID.$DRIVE | awk '{print $NF}')
if [ ! $write_VALUE ] || [ ! $read_VALUE ]
then
let ERROR_COUNTER=$ERROR_COUNTER+1
fi
SUM_read=`echo "scale=2 ; $SUM_read + $read_VALUE" | bc`
SUM_write=`echo "scale=2 ; $SUM_write + $write_VALUE" | bc`
sleep 1
done
if (( $ERROR_COUNTER >= 10 ))
then
echo "UNKNOWN: Unable to get SNMP-information ($ERROR_COUNTER faulty trails)"
exit $STATE_UNKNOWN
fi
SUM_read=`echo "scale=2 ; $SUM_read / 10240" | bc`
SUM_write=`echo "scale=2 ; $SUM_write / 10240" | bc`
echo "Leserate (KBytes/sec): $SUM_read ; Schreibrate (KBytes/sec): $SUM_write|Read=$SUM_read;;;; Write=$SUM_write;;;;"
exit $STATE_OK
Eine entsprechender Aufrauf für die Platte D sieht folgendermaßen aus:
./check_performance_logicaldisc_NT -H xxx.xxx.xxx.xxx -D D
Hier in dem Skript ist zu sehen, dass ich 10 Sekunden lang pro Sekunde eine Anfrage stelle, diese summiere, den Durchschnitt und die KiloBytes errechne und nagioskonform ausgebe. Sicherlich ist es der Nagios-Server-Performance ziemlich abträglich ein aktives Plugin künstlich 10 Sekunden laufen zu lassen, aber ich habe bisher noch keine bessere Möglichkeit gefunden.