Da ich gerne so viel wie möglich über meinen Rechner weiß, möchte ich gerne auch ganz genau bescheid wissen, wie warm mein System wann ist und wie die Auswirkung von CPU-Last auf die Temperatur ist. Die ganzen Sensordaten möchte ich am liebsten in einem Zeitreihendiagramm haben um den Überblick zu gewinnen.

1. Wie sollen die Sensordaten später dargestellt werden?


Um das Ergebnis schon mal vorweg zu nehmen. So soll’s später aussehen:

Sensordaten der letzten 20 Minuten

Sensordaten der letzten 20 Minuten. 23:10 Uhr: sysbench mit 4/4 Threads. 23:18 Uhr: Ein wenig WordPress. 23:23 Uhr Youtube-Video.

Die Tools, die ich dafür verwende sind:

lm-sensors Für das auslesen der Lüfter- und Temperaturwerte
uptime Für den Last-Wert der CPU
rrdtool Für die Datenbank und Diagramm
imagemagick Für die Zusammenstellung der drei Diagramme zu einem Bild
bash Um das Ganze umzusetzen

2. Lösung


Als erstes benötigt man für die Daten eine passende Datenbank. Eine Möglichkeit wäre, jeden gemessenen Wert mit einem Zeitstempel in eine Datenbank zu schreiben. Das möchte ich hier nicht. Für die Anwendung, die ich im Sinn habe benötige ich nur Sensorwerte maximal der letzten wenigen Stunden. Alte Werte sollen also nach einer Zeit wieder rausfliegen.

2.1 RRDtool

Hier bietet sich die unter GPL veröffentlichte, von Tobias Oetiker entwickelte Software für Ringpufferdatenbanken RRDtool an. Eine solche RRD wird sofort mit einer festen Größe initialisiert und ändert diese nie. Schon von Beginn an ist klar wie vielen Daten die Datenbank platz bieten wird. Ältere Daten werden überschrieben.

Mit Zeile 1 installiert man natürlich erstmal das Programm. Mit Zeile 2 lege ich fest, dass ich eine Datenbank in der Datei sensors.rrd anlegen möchte, wobei ich festlege, dass jedes Messintervall 5 Sekunden lang ist. Kommt in 5 Sekunden mehr als ein Messwert an, dann werden die Messwerte automatisch gemittelt.

In Zeile 3 bis 10 definiere ich die Datenquellen (Data Source) nach dem Schema

Von links nach rechts:

  • DS ist klar.
  • Der type ist bei mir immer GAUGE, weil es sich bei meinen Messwerten um absolute, zeitlich unabhängige Messwerte handelt.
  • Der heartbeat ist die Zeit die vergehen muss bevor, ohne das eintreffen eines Messwertes der Wert in der Datenbank als „nicht vorhanden“ angenommen wird.
  • Die beiden letzen min_wert und max_wert legen das Intervall fest, in dem sich die Messwerte bewegen werden.

In Zeile 11 bis 14 folgen die Definitionen der Round Robin Archives. Sie legen fest, wie lange Werte in welcher Zeitlichen Genauigkeit aufgehoben werden. Für das obere Bild reicht eigentlich Zeile 11 aus.  Sie legt fest, dass die genauen Durchschnittswerte Werte für jedes einzelne Intervall 2160 Intervalle lang – also 3 Stunden (5sek x 2160 = 10800sek = 180min = 3h) – aufgehoben werden.

Zeile 12, 13, und 14 sind quasi gleich und bewirken zusammen, dass die Höchst-, Tiefst- und Durchschnittsmesswerte zu je 5-minütigen Intevallen für 24 Stunden aufbewahrt werden, denn 60 x 5sek x 288 = 86400sek = 24h. Diese Werte benutze ich aber hier nicht.

Eine ausführliche Erklärung zum Erzeugen von RRDs gibts hier.

 2.2 Das shell-Skript

Achtung. Voraussetzungen! Mein shell-Skript legt in Zeile 2 in eine Datei im Ordner /tmp/ als Ausgabedatei fest. Dieses Ziel liegt bei mir in einer RAM-disk um unnötige Schreibarbeit auf der Festplatte zu verhindern. Such dir einen Platz, wo die temporäre Datei liegen soll und ändere Zeile 2 entsprechend. Außerdem muss natürlich lm-sensors installiert und die entsprechenden Werte vorhanden sein. In meinem Artikel habe ich erklärt wie das geht.

Dieses Skript  läuft, solange man es nicht beendet und holt sich die Temperaturen der 4 CPU-Kerne, die Systemtemperatur, die zwei Lüftergeschwindigkeiten sowie die durchschnittliche CPU-Last der letzen Minute. Die Ausgabe der jweils aktuellem Sensordaten in Zeile 15 ist nur zum live Zusehen und kontrollieren.

Die Datei für das Skript kannst du erzeugen mit den beiden Befehlen

Bei Fragen zum Skript oder Anpassungproblemen an deine Voraussetzungen schreib mir doch einfach.

2.3 Bilder erzeugen

Achtung. Voraussetzungen! Mein shell-Skript legt in Zeile 6 in einen Ordner /tmp/ als Ausgabeordner fest. Dieses Ziel ist bei mir in eine RAM-disk um unnötige Schreibarbeit auf der Festplatte zu verhindern. Such dir einen Platz, wo die temporären Dateien liegen sollen und ändere Zeile 6 entsprechend. Außerdem musst du image magick installiert haben.

Dieses umfangreiche Skript erzeugt von Zeile 8 bis 33 drei Bilder mit je einem Diagramm. Imagemagick verrichtet dann in Zeile 35 bis 38 seinen Dienst und klebt die Bilder zusammen.

  • Zeile 4-5: Definition der Breite und Höhe jedes der drei Diagrammbilder.
  • Zeile 6: Legt den Ordner fest, wo die Bilder landen sollen.
  • Zeile 8-9 erzeugen ein Diagramm in der Datei 20minutes_temps.png. Die Option -D gibt an, dass die fertige Datei die angegebenen Dimensionen haben soll (und nicht das Diagramm an sich). Das -A betrifft die Achsenskalierung und sorgt dafür dass die Werte über die komplette y-Achse gestreckt werden. Hinter -s und -e stehen jeweils die relativen Zeitpunkte von wann bis wann das Diagramm gezeichnet werden soll.
  • Zeile 10-13 und 15 legen die Datenquellen fest. Format:
    DEF:[Name]=[Datenbankdatei]:[Datenquelle]:[MIN/MAX/AVERAGE]
  • Zeile 14 ist ein Ausdruck in umgekehrt Polnischer Notation und heißt sorgt dafür dass cpu der Mittelwert der vier cpu-Kerne ist.
  • Zeile 16-21 legt nun die 6 Linien fest, die gezeichnet werden sollen. Format:
    LINE[dicke]:[datenquelle]#[rrggbb]:"[Legende]"
  • Zeile 23-33: Analog für die andern beiden Diagramme
  • Zeile 35-37: montage (ein Teil von Imagemagick) bekommt die drei gerade erzeugten Dateien und bastelt sie zu einer Datei zusammen.
  • Zeile 37: -tile 1×3 heißt, dass die drei Bilder übereinander angeordnet sein werden. -geometry +0+0, sorgt dafür dass kein Rand zwischen den Einzelbildern entsteht.

Das war’s. Man kann dieses letzte Skript auch mit einem Cronjob in regelmäßigen Abständen starten lassen und so stets ein Livebild der Sensordaten der letzten zwanzig Minuten zur Verfügung haben.


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.