RRDTool

Auf der Seite MRTG Monitoring wurde schon mehrfach das Programm RRDTOOL aufgeführt worden. Auch andere Programme wie z.B. NTOP, und viele andere (Siehe RRDWorld auf https://oss.oetiker.ch/rrdtool/rrdworld/index.en.html) nutzen RRDTOOL. Also ist es an der Zeit diese Komponente etwas genauer unter die Lupe zu nehmen:

Round Robin Database

Wer heute Daten erfasst und speichert, wird immer mit dem Wachstum der Datenbank konfrontiert. Wenn ich jede Minute z.B. die Auslastung eines Netzwerkports erfasse, d.h. Paket rein/raus und Bytes rein/raus und jeder Wert eine 32bit zahl ist, dann liefert mir die Messung 16 Byte/Minute. Das hört sich nicht viel an, aber wenn ich einen 24-Port-Switch habe, dann sind das schon 384 Byte/Minute und pro Tag und 500Kilobyte/Tag oder 182 Megabyte/Jahr. Wenn Sie mehr als nur die 24 Ports erfassen, wächst die Monitoring-Datenbank immer weiter. Daher muss man anfangen, Daten abzuschneiden.

Eine "Round Robin Datenbank" hat eine fixe Größe und alte Daten werden immer wieder durch neue Daten überschrieben. Wie in einem Ringpuffer.

Wenn mich also nur die letzten 24 Stunden interessieren, dann speichere ich da 1 Messung pro Minute oder 60x24 = 1440 Messwerte. Ich kann auch pro Prüfstelle eine eigene Datenbank anlegen aber wie wird nie weiter wachsen. Leider verliere ich natürlich jeden Zugriff auf ältere Informationen.

Wenn ich historische Daten und einen überschaubaren Speicherbedarf möchte, muss ich Daten reduzieren. Das funktioniert z.B., in dem ich mehrere Tabellen anlege, die unterschiedliche Auflösungen haben. Hier ein Beispiel für minütliche Messungen und Überträge in "kältere" Datenbanken.

Tabelle 1 Tag 7 Tage 30 Tage 365 Tage

Anzahl Messwerte

1440

1440

1440

1440

Größe (bei 4 Werten a 4 Byte)

23040 Bytes

23040 Bytes

23040 Bytes

23040 Bytes

Auflösung

1 Minute

7 Minuten

30 Minuten

365 Minuten

Eine Software müsste einfach nur jede Minute die Tagesdatenbank vollschreiben und wenn immer 7 Messwerte dazu gekommen sind, darüber einen Mittelwertbilden und diese in die 7-Tage-Datenbank schreiben. Die gleiche Logik analog für die 30 Tage und 365 Tage Datenbank.

Der Preis dieses Verfahrens ist natürlich, dass Informationen, je weiter Sie in der Vergangenheit liegen, immer ungenauer werden. Kann das Beispiele z.B. den letzten Tag noch auf die Minute genau auflösen, so sind Aussagen von Werten vor einigen Monaten ungenauer aber für eine Trendabschätzung vollkommen ausreichend.

Warum RRDTool?

So arbeitet MRTG als Perl-Skript schon länger aber es gibt ja auch andere Anforderungen solche Daten zu schreiben. Hier kommt dann RRDTool.EXE zum Einsatz, welches Werte per Kommandozeile annimmt und in die Datenbanken schreibt. Die Datenbanken bleiben immer gleich groß, das RRDTool bei jedem Durchlauf sehr alte Werte einfach zusammenfasst. Herr Oetiker hat dazu RRDTOOL als Modul bereit gestellt. RRDTOOL wird selten losgelöst verwendet, sondern wird seinerseits in andere Programme eingebunden. Dabei sind im wesentlichen folgende Funktionen verfügbar:

  • Anlegen einer Datenbank
  • Hinzufügen von Werten samt Übertrag in historische Daten
  • Erstellen von Grafiken

Um RRDTOOL daher nutzen zu können, müssen Sie entweder eine vorgefertigte Software nutzen oder selbst entsprechende Programme oder Skripte schreiben. RRDTOOL steht dabei als EXE-Programme oder PERL-Modul zur Verfügung. Diese drei wesentlichen Tätigkeiten möchte ich an Hand eines einfachen Beispiels für Windows erläutern.

Anlegen einer Datenbank

Der erste und einmalige Schritt ist die Anlage einer Datenbank. RRDTOOL wird dazu unter Angabe eines Dateinamens gestartet. Zusätzlich müssen die Werte angegeben werden,  die in der Datenbank gespeichert werden sollen. In einer Datenbank können problemlos auch mehrere Werte parallel gespeichert werden, so dass Sie zur Ablage von 100 Werten nicht 100 Dateien nutzen müssen. Ein Aufruf könnte z.B.: so aussehen (Alles in einer Zeile):

rrdtool create cpu.rrd --start 1023654125 --step 120
        DS:CPULast:GAUGE:240:0:100
        RRA:AVERAGE:0.5:12:5

(Achtung: Die Zeilenumbrüche sind zur Lesbarkeit addiert worden) Die Bedeutung der einzelnen Parameter ist:

  • create cpu.rrd
    Lege eine Datenbank mit dem Namen CPU.RRD an.
  • --start xxx --step xxx
    Zeit ab wann die Datenbank beginnt (UNIX Ticks) und wie oft ein neuer Wert (120sek) eingetragen wird.
    Wenn Sie später häufiger Werte eintragen wollen, ignoriert RRDTOOL diese. Fehlen Werte, so werden diese interpoliert.
  • DS:"varname":<typ>:Heartbeat:min:man
    Definition der Variable mit Name, dem Typ, wie viele Sekunden ein Wert Ausbleiben muss ehe er als "unbekannt" gespeichert wird und in welchem Bereich (Min/Max) sich der Wert bewegt.
  • RRA:Konsolidierung:
    Hier wird angegeben, wie viele Werte (12) in die nächste Zeile übernommen werden und wie viele dieser Stufen (5) vorgehalten werden. D.h. bei diesem Beispiel wird alle 100 Sekunden ein Wert aufgenommen. Aus 12 Werten wird eine Summe gebildet. Aus 12 Summen dann wieder die nächste Stufe bis die 5te Stufe erreicht ist.

Das klingt alles erst mal schrecklich aber SQL und andere Datenbanken machen es einem auch nicht einfacher.

Werte addieren

Nachdem die Datenbank nun mal erzeugt ist, müssen wir diese mit Daten füllen. Dazu wird ebenfalls wieder RRDTOOL aufgerufen.

RRDTOOL Update cpu.rrd N:50

Damit sagen wir RRDTOOL, dass er für den aktuellen Zeitpunkt den Wert 50 eintragen soll. Wir können nun immer wieder (idealer weise alle 100 Sekunden im Beispiel) RRDTOOL aufrufen, um weiter Werte in die Datenbank zu bringen.

Wenn ich Daten aus einer CSV-Datei importieren will, dann mache ich das aktuell über eine For-Schleife und starte RRDTool entsprechend oft. Allerdings muss man dann das "N" durch einen Zeitstempel ersetzen.

Daten ausgeben

Die Daten in der Datenbank können wir auf zwei Arten ausgeben lassen;

  • Textausgabe
    Dies ist besonders hilfreich, wenn Sie noch am experimentieren sind und eigentlich wissen wollen, welche Zahlen nun in der Datenbank stehen
  • Grafik
    Viel schöner ist die Möglichkeit mit RRDTOOL fertige Grafiken zu erzeugen. In Verbindung mit RRD_CGI können diese sogar on the fly erzeugt werden.

Die Textausgabe können Sie z.B. wie folgt erzeugen:

rrdtool dump cpu.rrd

RRDTool gibt ihnen eine einfache Liste der Werte als XML-Format aus. Die Grafikausgabe ist sehr viel leistungsfähiger.

Installation (Windows)

Je nach der Quelle der Installation finden Sie ein Windows-ZIP-Archiv, in dem eine eigenständige RRDTOOL.EXE einfach drin liegt oder sie finden einen Installer, der RRDTOOL per GUI auf ihrem Windows PC installiert. Natürlich gibt es RRDTOOL auch als Unix-Version. da kommt es ja ursprünglich her.

Interessanterweise ist die Version 1.3.8 nicht mehr als EXE alleine lauffähig, sondern benötigt auch die DLLs. Die Version 1.2.30 ist allein mit der EXE zufrieden.

Achtung: Zumindest ein RRDTool-Installiert hat mir meine globale PATH-Variable durch "C:\Program Files (x86)\RRDtool" ersetzt, was natürlich einiges gestört hat.

# Windows 7 Standard
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\

Prüfen Sie daher vorher in der Systemsteuerung die Umgebungsvariablen

RRDTool und PowerShell

RRDTool ist unter Windows eine EXE und kann natürlich aus jedem Programm gestartet werden. Es ist leider kein COM-Object oder .NET Modul.

Weitere Links