Systemüberwachung

Das System läßt sich vielfältig überwachen. Eine praktische Variante ist, die gesammelten Informationen grafisch darzustellen. Dadurch läßt sich ein guter Überblick gewinnen und es sieht auch noch gut aus. Es gibt diverse Programme, die diese Aufgabe erfüllen und weit mehr Funktionalität bieten, als hier erwähnt. Für ein paar Infos reichen aber durchaus einige Shellskripte aus. Folgende Informationen sollen hier erfaßt und grafisch dargestellt werden.

  • CPU Temperatur
  • Festplatten Temperatur
  • Netzwerkauslastung

Das Ganze wird mit Hilfe von Shellskripten periodisch ermittelt und dann mit RRDTool aufbereitet und grafisch dargestellt. RRDTool findet sich in den Ports unter net/rrdtool.

RRDTool ist für solche Aufgaben hervorragend geeignet, da es die Daten in einer Round Robin Datenbank ablegt. Dies bedeutet, es wird je Zeitschlitz nur eine festgelegte Anzahl an Werten gespeichert. Zusätzlich werden dann die Werte über einen größeren Zeitraum konsolidiert und in den nächsten Zeitschlitz geschrieben. Durch dieses Verfahren ist zum einem die Größe der Datenbank festgelegt und ändert sich auch nicht, zum anderen können so die Daten über einen großen Zeitraum gespeichert werden.

Anlegen der RRDTool Datenbank

Als erstes muß die Datenbank angelegt werden. Dazu muß angegeben werden, wie die Daten organisiert und welche Konsolidierungsfunktionen verwendet werden sollen.

Datenorganistion

RRDTool muß wissen, wieviele Zeitschlitze vorhanden sein und wann diese Daten konsolidiert werden sollen.

Jede Datenbank enthält mindestens eine Data Source (DS), die angibt von welchem Typ die erhobenen Daten sind.

  • GAUGE, z.B. Temperatur Daten
  • COUNTER, z.B. Bytes/s Netzwerkdurchsatz
  • ABSOLUT Werte, die nach dem Lesen zurückgesetzt werden oder schnell zu einem Überlauf führen
  • DERIVE z.B. um den Anteil der Leute festzustellen, die einen Raum betreten/verlassen

(Die Beispiele sind aus der man-page.)

Dann enthält jede Datenbank noch verschiedene Round Robin Archive (RRA), die festlegen, wieviele Daten für den jeweiligen Zeitschlitz konsolidiert werden sollen.

Temperatur Datenbank erstellen

Um die Temperatur zu messen, eignet sich eine Data Source vom Typ GAUGE sehr gut, da hier keine Durchschnittswerte für das jeweilige Zeitintervall gebildet werden. Nun muß noch festgelegt werden, in welchem Intervall die Daten erhoben und konsolidiert werden. Am besten läßt sich dies an realen Werten nachvollziehen.

Für 1 Woche (7 Tage) sollen die Daten in 5-Minute Intervallen vorliegen, d.h es müssen 2016 Werte gespeichert werden.

2016 Werte / 7 Tage = 288 Werte pro Tag
288 Werte pro Tag / 24 Stunden = 12 Werte pro Stunde
12 Werte pro Stunde = alle 5 Minuten 1 Wert

Für dieses Archiv brauchen wir alle 5 Minuten 1 Wert.

Da damit aber die Daten für maximal eine Woche gespeichert werden und das etwas wenig ist, sollen für 38 Tage (1 Monat und 1 Woche) die Daten konsolidiert und in 30 Minuten Intervallen gespeichert werden. Dafür werden 1824 Werte benötigt.

1824 Werte / 38 Tage = 48 Werte pro Tag
48 Werte pro Tag / 24 Stunden = 2 Werte pro Stunde (alle 30 Minuten 1 Wert)

Nur mit diesen beiden Archiven würden die Daten für ca. 1 Monat und 1 Woche vorliegen.

Entsprechend setzt sich die Berechnung fort. Im Überblick sieht das Ganze dann so aus:

Intervall Anzahl Werte Dauer
5 Minuten 2016 7 Tage
30 Minuten 1824 31 Tage (+ 7 Tage)
1 Stunde 1656 31 Tage (+ 31 Tage + 7 Tage)
2 Stunden 1176 60 Tage (+ 31 Tage + 7 Tage)
1 Tag 830 732 (+ 60 Tage + 31 Tage + 7 Tage)

Ob diese Einteilung sinnvoll ist oder nicht, ist ein anderes Thema. Sicherlich könnte man zwischen den Werten für einem Monat und 2 Jahren die Daten noch monatsweise konsolidieren und das Archive mit den Durchschnittswerten im 2 Stunden Intervall entfernen.

Per Default ist der zeiltliche Abstand zwischen 2 Werten 300 Sekunden, d.h. die Daten werden so konsolidiert, als wären sie alle 5 Minuten eingefügt worden.

Die Datenbank wird nun mit folgendem Befehl angelegt:

rrdtool create temperature.rrd                                       \
  DS:cpu_temp:GAUGE:600:0:U                                          \
  DS:hdd_temp:GAUGE:600:0:U                                          \
  RRA:AVERAGE:0.5:1:2016                                             \
  RRA:AVERAGE:0.5:6:1824                                             \
  RRA:AVERAGE:0.5:12:1656                                            \
  RRA:AVERAGE:0.5:24:1176                                            \
  RRA:AVERAGE:0.5:288:830                                            \
  RRA:MIN:0.5:1:2016                                                 \
  RRA:MIN:0.5:6:1824                                                 \
  RRA:MIN:0.5:12:1656                                                \
  RRA:MIN:0.5:24:1176                                                \
  RRA:MIN:0.5:288:830                                                \
  RRA:MAX:0.5:1:2016                                                 \
  RRA:MAX:0.5:6:1824                                                 \
  RRA:MAX:0.5:12:1656                                                \
  RRA:MAX:0.5:24:1176                                                \
  RRA:MAX:0.5:288:830

Noch ein paar Informationen zu den Parametern:

  • DS gibt die Data Source an
    • der Name kann frei gewählt werden
    • GAUGE ist der Typ
    • 600 gibt an, daß maximal 2 Werte (10 Minuten = 600 Sekunden) kein Wert geschrieben werden darf, bevor ein Wert von UNKNOWN angenommen wird
    • 0 und U sind Minimum bzw. Maximum Werte; U steht hier für UNKNOWN und entspricht keiner Obergrenze

Nach den Data Sources kommen die Archive mit den Konsolidierungsfunktionen, denen die oben erklärten Berechnungen zu Grunde liegen.

  • RRA gibt das Round Robin Archive an
    • AVERAGE ist die Konsolidierungsfunktion
    • 1 gibt an, wieviele Werte zur Konsolidierung benötigt werden
    • 2016 gibt an wieviele Werte gespeichert werden

In diesem Beispiel werden sowohl Mittelwert, Minimun und Maximum Werte gespeichert. Daneben gibt es noch die „Konsolidierungsfunktion“ LAST, die den letzten Wert angibt. Diese „Funktion“ steht aber immer zur Verfügung und muß nicht angegeben werden.

Über den Data Source Namen kann später auf die gespeicherten Konsolidierungsfunktionen zugegriffen werden, um die Werte zu visualisieren.

Nun ist die Datenbank angelegt und kann gefüllt werden.

Temperatur Protokollierung

Eine nützliche Information ist die Temperatur der CPU und der Festplatte. Die CPU Temperatur läßt sich unter FreeBSD praktisch mittels sysctl auslesen. Bei den anderen *BSDs hab ich das nicht getestet, dort sollte aber ähnliches funktionieren. Es wäre gut, wenn diejenigen, die dort Informationen haben, diese hier ergänzen.

Unter FreeBSD liest folgendes kleines Shellskript die CPU Temperatur und die Festplatten Temperatur aus. Wichtig: Das Auslesen der Festplatten Temperatur hängt davon ab, ob smartctl mit der Festplatte funktioniert. Die ID zum Auslesen der Temperatur Information variiert von Hersteller zu Hersteller. Es sollte in jeden Fall auf der Seite der smartmontools und des Herstellers nachgeschaut werden. smartctl -A /dev/ad0 listet alle hersteller-spezifischen Informationen zur ersten IDE Platte auf. Damit das Skript als Nicht-root Benutzer ausgeführt werden kann, muß der jeweilige Benutzer Mitglied der Gruppe operator sein, da dieser Lesezugriff auf /dev/ad0 hat.

Hier nun das Skript:

#!/bin/sh

cpu_temp="hw.acpi.thermal.tz0.temperature"
disk="/dev/ad0"

smartctl="/usr/local/sbin/smartctl"
smartarg="-A"
option="194"  # smart option for temp
cmd="/sbin/sysctl"
rrdtool="/usr/local/bin/rrdtool"
rrdfile="temperature.rrd"

h=`$smartctl $smartarg $disk | grep $option | awk '{print $10}'`
t=`$cmd $cpu_temp | awk '{print $2}' | sed -e s/C//`

# RRD Datenbank aktualisieren
$rrdtool update $rrdfile N:$t:$h

In der letzten Zeile werden die Werte in die RRD Datenbank geschrieben. Die Konsolidierung übernimmt RRDTool. Mit dem Parameter N übernimmt RRDTool die aktuelle Zeit und schreibt die Daten in den aktuellen passenen Zeitschlitz. Alternativ könnte man auch anstelle von N die aktuelle Zeit in Seconds since Epoch angeben.

Netzwerk Datenbank erstellen

Der Netzwerkdurchsatz soll von RRDTool analog behandelt werden, d.h. es werden zwar andere Typen für die Data Sources verwendet, die Auflösung und die Konsolidierungsfunktionen bleiben aber gleich. Hier nun der Aufruf, um die Datenbank zu erzeugen:

rrdtool create network.rrd                                           \
  DS:inbytes:COUNTER:600:0:U                                         \
  DS:outbytes:COUNTER:600:0:U                                        \
  RRA:AVERAGE:0.5:1:2016                                             \
  RRA:AVERAGE:0.5:6:1824                                             \
  RRA:AVERAGE:0.5:12:1656                                            \
  RRA:AVERAGE:0.5:24:1176                                            \
  RRA:AVERAGE:0.5:288:830                                            \
  RRA:MIN:0.5:1:2016                                                 \
  RRA:MIN:0.5:6:1824                                                 \
  RRA:MIN:0.5:12:1656                                                \
  RRA:MIN:0.5:24:1176                                                \
  RRA:MIN:0.5:288:830                                                \
  RRA:MAX:0.5:1:2016                                                 \
  RRA:MAX:0.5:6:1824                                                 \
  RRA:MAX:0.5:12:1656                                                \
  RRA:MAX:0.5:24:1176                                                \
  RRA:MAX:0.5:288:830

Hier wird der Typ COUNTER verwendet, der keine absoluten Werte speichert, sondern in diesem Fall die Anzahl der Bytes, die im Mittel in den letzten 5 Minuten gesendet/empfangen wurden. Ein Overflow der Bytes, die meistens ja in 32bit Integern gezählt werden, erkennt RRDTool automatisch. Sollten 64bit Integer benutzt werden, kommt RRDTool auch damit klar und erkennt den Overflow.

Netzwerk Durchsatz protokollieren

Mit dem Programm statgrab (in den Ports unter deve/libstatgrab zu finden) lassen sich sehr bequem die benötigten Werte ermitteln.

Zum einen gibt es ein curses-basiertes Tool (saidar), um die Daten live anzuzeigen, zum anderen das Tool statgrab, das die Daten ähnlich wie sysctl ausgibt. Dadurch wird die Ermittlung der gewünschten Daten stark vereinfacht.

Um beispielsweise für die Interfaces tun0, ste0 und ste1 die Daten zu sammeln und in die Datenbank einzutragen, kann folgendes Shellscript verwendet werden.

#!/bin/sh

file="/path/to/rrdfiles/hostname_IF.rrd"
statgrab="/usr/local/bin/statgrab"
rrdtool="/usr/local/bin/rrdtool"
ifaces="tun0 ste0 ste1"

for i in ${ifaces}; do \
    ibts=`${statgrab} -u net.${i}.rx`; \
    obts=`${statgrab} -u net.${i}.tx`; \
    rrdfile=`echo ${file} | sed -e "s/IF/${i}/"`; \
    call="${rrdtool} update ${rrdfile} N:${ibts}:${obts}"; \
    `${call}`
done

Die for-Schleife iteriert über die Liste der Interfaces, liest die Werte aus, bildet den Namen der RRD Datei und schreibt die Werte. Vermutlich lässt sich das Ganze auch einfacher gestalten, aber so funktioniert es erstmal. ;-)

für Faule

statgrab unterstützt auch MRTG. Mit statgrab-make-mrtg-config kann man sich eine entsprechende Konfiguration erzeugen und statgrab-make-mrtg-index hilft bei der Erstellung der Index HTML Seite. Verwendet man diese Tools, hat man eine Übersicht der Last, der Netzwerkauslastung, der Dateisystembelegegung und noch einige weitere Details.

Crontab

Um diese Skripte nun alle 5 Minuten auch auszuführen und die Datenbank zu aktualisieren, sind folgende 2 Zeilen in der crontab notwendig.

*/5 * * * * temperature.sh
*/5 * * * * network.sh

Grafische Auswertung

Es gibt verschiedene Möglichkeiten, die Daten grafisch darzustellen.

  • Die Shellskripte, die alle 5 Minute laufen, erzeugen jeweils die Grafiken und stellen sie zur Verfügung (z.B. über einen Webserver).
  • Auf einem Webserver liegt ein CGI Skript, daß die Graphen erzeugt. Dies geht z.B. sehr praktisch über Perl mit RRDs oder RRDTool::OO.

Shellskript

Für das Shellskript muß rrdtool graph aufgerufen werden.

rrdtool graph temperature.png                                \
 --start -1d                                                 \ # die Daten des letzten Tages
 --title "CPU/HDD Temperatur"                                \
 --vertical-label "°C"                                       \
 --width 400 --height 150                                    \
 --alt-y-grid                                                \ # bessere Y-Achsen Skalierung
 --interlaced                                                \ # interlaced PNG Image
 'DEF:cpu_temp=temperature.rrd:cpu_temp:AVERAGE'             \ # CPU Temperatur im Mittel
 'DEF:hdd_temp=temperature.rrd:hdd_temp:AVERAGE'             \ # HDD Temperatur im Mittel
 'LINE:cpu_temp#00ff00:CPU Temperatur'                       \
 'LINE:hdd_temp#0000ff:HDD Temperatur'

Perl

RRDTool::OO findet sich in der Ports unter devel/p5-RRDTool-OO.

#!/usr/bin/perl -w

use strict;
use RRDTool:OO;

my $rrd = RRDTool::OO->new(file => "network.rrd");

$rrd->graph("network.png",
            title          => "Traffic ste0",
            interlaced     => undef,
            vertical_label => "kBytes/s",
            units_exponent => 3,
            start          => "-1d",
            width          => 400,
            height         => 150,
            draw           => { dsname => "inbytes",
                                cfunc  => "AVERAGE",
                                type   => "area",
                                color  => "008800",
                                legend => "Incoming Bytes/s"
            },
            draw           => { dsname => "outbytes",
                                cfunc  => "AVERAGE",
                                type   => "line",
                                color  => "55cc02",
                                legend => "Outgoing Bytes/s"
            }
           );

Zusammenfassung

Diese Seite deckt sicherlich nur einen Teil der Möglichkeiten von RRDTool ab. Ein Link zur RRDTool Seite findet sich am Ende der Seite. Dort finden sich eine gute Dokumentation und eine Gallerie, um zu sehen, was andere Leute so überwachen.

Es gibt viele Tools, die viel mehr Informationen sammeln und abdecken, von der Inode Nutzung bis zur Apache Auslastung. Dennoch gibt es Informationen, die diese nicht abdecken, oder man muß diesen Tools ein eigenes Skript unterschieben.

Verweise