Server-Monitoring mit RRDTool

theton

theton

Bitmuncher
Da ich keinen besseren Platz gefunden habe, schreibe ich das folgende also einfach mal hier rein.

Performance-Monitoring - Eine kleine Howto-Geschichte
Oder: Wie mache ich meinem Chef kleine bunte Bildchen zur Server-Auslastung


Als ich in meiner Firma anfing, war von Server-Monitoring keine Spur. Es gab
zwar ein paar Skripte, mit denen man sich ein paar Statistiken aus den Logs
erstellen konnte und auch der Traffic wurde gemessen, aber Realtime-Monitoring
war hier ein Fremdwort. Nun, da ich eh das komplette Netzwerk umdesignen
wollte, weil mein Vorgaenger mir eigentlich nur ein grosses Chaos hinterlassen
hatte, machte ich mich auch ans Werk und richtete auf einem Server, der nun nur
noch fuer das Monitoring zustaendig ist, Nagios ein. Damit wurde ich zumindest
schonmal ueber meinen Pager informiert, wenn ein Server ausfiel. Stellte sich
mir nur die Frage nach einer sinnvollen Loesung um auch die Performance im
Auge zu behalten, denn schon in den ersten Tagen machte ich die Erfahrung, dass
einige der Server regelmaessig ueberlastet waren (ein Grund, warum ich mich
fuer den kompletten Neuaufbau des Netzwerks entschieden habe). BigSister gab
mir zumindest die Moeglichkeit Alarmmeldungen zu empfangen, wenn mal ein
Server ueberlastet war oder kein Platz mehr auf einer Festplatte hatte. Damit
waren die kritischen Punkte abgedeckt, aber es gab nichts, was der Chef sehen
konnte. Gut, er konnte sich bei Nagios und BigSister das Webinterface
anschauen, aber damit sah er auch nur den aktuellen Status und eine kurze
History ueber die "kritischen" Ereignisse der letzten Zeit. Hinzu kam, dass
Worte wie Apache-Webserver oder LDAP ein fremdwort waren. Er verstand also
nicht, was er da zu sehen bekam. Es musste also was her, das nach etwas aussah
und ihm alles schoen auf einem Blick moeglichst grafisch anzeigte.

1. Welche Software wird benoetigt?

Nachdem ich also eine Weile recherchiert hatte zum Thema Server-Monitoring
fiel mir auf, dass ein grossteil der Berichte auf ein Programm namens RRDTool
verwies. Bei freshmeat.net war das Programm auch nicht schwer zu finden und
schnell war es vom Server runtergeladen. Wie ich es ueblicherweise machte,
habe ich die Sourcen entpackt und erstmal mit ein paar Standard-Optionen
installiert. Das ging ganz einfach mit

Code:
bash# ./configure --with-gnu-ld --prefix=/usr/local && make && make install

Naja, wegen ein paar Bibliotheken meckerte configure dann schon noch rum, aber
die entsprechenden devel-Pakete waren schnell nachinstalliert und somit ging
die Installation recht zuegig und ohne grosse Komplikationen ab. Spaeter
stellte sich dann heraus, dass ich tatsaechlich mit diesen Optionen fuer
configure total richtig lag. "Das war ja einfach" dachte ich mir und gab
gleich mal

Code:
bash# man rrdtool

ein. Naja, ziemlich mager, was sich mir da praesentierte, allerdings gab es
noch einige Manpages zu den einzelnen Tools, die RRDTool mitbringt. Erst
spaeter fand ich heraus, dass es eigentlich nur Aliases fuer bestimmte
Funktionen von RRDTool sind. Hmm, sollte das etwa alles sein, was der mir an
Dokumentation installiert hat? Konnte ich mir eigentlich nicht vorstellen. Da
ich nach /usr/local installiert hatte, warf ich also mal einen Blick in
/usr/local/share/doc/rrdtool-<version> und siehe da, ich fand dort ein
html-Verzeichnis mit einer sehr ausfuehrlichen Doku. Das war mir dann aber
doch etwas zuviel. Mal zuviel, mal zuwenig, blieb also mal wieder nur mein
Freund das Internet. Ich brauchte auch nicht lange suchen und fand einige
Howtos zum Thema Performance-Monitoring mit RRDTool. Alle hatten nur einen
Haken... sie funktionierten nicht richtig. Bei jedem lief irgendwas schief,
wenn ich es ausprobierte. Naja, zumindest erhielt ich beim Lesen der Howtos
eine Einfuehrung in RRDTool und erfuhr, dass eine Round Robin Datenbank eine
Datenbank ist ist, deren "Speicherpunkte" kreisfoermig angeordnet sind und
ein Zeiger immer auf den aktuellen Punkt zeigt. Kommt der Zeiger wieder beim
ersten "Speicherpunkt" an, wird dieser ueberschrieben, so dass immer nur eine
aktuelle, aber begrenzte Datenmenge in der DB steht. Naja, und einige
nuetzliche Erklaerungen zu den Parametern fand ich auch.
Da ich bei der Systemadministration zum Ablegen von Daten und Skripten immer
auf den Servern ein Verzeichnis /root/scripts habe, erstellt ich mir da drin
einfach ein Verzeichnis fuer den ganzen RRDTool-Kram, denn ich ahnte schon,
dass es etwas mehr werden koennte.

Code:
bash# mkdir -p /root/scripts/rrdtool

2. Erstellen der RRDs

Danach also in dieses Verzeichnis gewechselt

Code:
bash# cd /root/scripts/rrdtool

und dann stand ich vor dem grossen Loch. Wie erstellt man nun so eine Datenbank
und in welcher Reihenfolge muss ich die Parameter angeben? Also doch nochmal
die Manpage zu Rate ziehen. Na das fing ja toll an. Wie ich Manpages hasse.
Warum kann man eine Software nicht so machen, dass ein einfaches --help als
Parameter genuegt und man bekommt eine Hilfe, die alles erklaert? Nunja,
aendern konnte ich es nicht, sonst haette die Sache noch laenger gedauert,
denn dann haette ich erstmal die Quelltexte modifizieren muessen. Nach vielem
Kopfzerbrechen und etwas rumprobieren kam ich dann letztendlich dazu eine Reihe
von Befehlen zusammenzustellen, die ich mir schnell in eine Datei schrieb,
damit sie nie wieder verloren gingen. Mit diesen konnte ich nun endlich die
richtigen RRDs erstellen. Zuerst einmal wollte ich eine RRD, in der ich die
Anzahl der Prozesse ablegen konnte

Code:
bash# /usr/local/bin/rrdtool create process.rrd --step 60 DS:processes:GAUGE:120:U:U RRA:AVERAGE:0.5:1:2160 RRA:AVERAGE:0.5:5:2016 RRA:AVERAGE:0.5:15:2880 RRA:AVERAGE:0.5:60:8760 RRA:MAX:0.5:1:2160 RRA:MAX:0.5:5:2016 RRA:MAX:0.5:15:2880 RRA:MAX:0.5:60:8760

Dann noch eine fuer den Speicherverbrauch

Code:
bash# /usr/local/bin/rrdtool create memory.rrd --step 60 DS:fram:GAUGE:120:U:U DS:fswap:GAUGE:120:U:U RRA:AVERAGE:0.5:1:2160 RRA:AVERAGE:0.5:5:2016 RRA:AVERAGE:0.5:15:2880 RRA:AVERAGE:0.5:60:8760

Eine fuer die Durchschnittslast

Code:
bash# /usr/local/bin/rrdtool create loadavg.rrd --step 60 DS:load1:GAUGE:120:0:U DS:load5:GAUGE:120:0:U DS:load15:GAUGE:120:0:U RRA:AVERAGE:0.5:1:2160 RRA:AVERAGE:0.5:5:2016 RRA:AVERAGE:0.5:15:2880 RRA:AVERAGE:0.5:60:8760

Und fuer die 2 Partitionen wollte ich natuerlich auch Daten sammeln

Code:
bash# /usr/local/bin/rrdtool create diskhda1.rrd --step 300 DS:hda1:GAUGE:600:0:U RRA:AVERAGE:0.5:1:432 RRA:AVERAGE:0.5:1:2016 RRA:AVERAGE:0.5:3:2880 RRA:AVERAGE:0.5:12:8640
Code:
bash# /usr/local/bin/rrdtool create diskhda3.rrd --step 300 DS:hda3:GAUGE:600:0:U RRA:AVERAGE:0.5:1:432 RRA:AVERAGE:0.5:1:2016 RRA:AVERAGE:0.5:3:2880 RRA:AVERAGE:0.5:12:8640

Das wichtigste habe ich mir wie immer zum Schluss aufgehoben, damit ich genug
Zeit habe es zu vergessen und so erstellte ich, nachdem ich merkte, dass mir
was fehlte, auch noch eine RRD fuer die Netzwerklast der Netzwerkkarte des
Servers

Code:
bash# /usr/local/bin/rrdtool create networketh0.rrd --step 60 DS:eth0r:COUNTER:120:0:U DS:eth0t:COUNTER:120:0:U RRA:AVERAGE:0.5:1:2160 RRA:AVERAGE:0.5:5:2016 RRA:AVERAGE:0.5:15:2880 RRA:AVERAGE:0.5:60:8760 RRA:MAX:0.5:1:2160 RRA:MAX:0.5:5:2016 RRA:MAX:0.5:15:2880 RRA:MAX:0.5:60:8760

3. Sammeln der Daten

Juchhu, ich hatte es geschafft. Yeah, endlich standen die RRDs und waren
bereit von mir mit Daten gefuettert zu werden. Kaum kam der Gedanke an die
Daten ging meine Euphorie auch schon wieder davon. Wie ich beim Studium der
Manpages gesehen hatte, musste ich dafuer wieder so elende Befehle ausfuehren.
"Nunja", dachte ich mir, "wenn ich die einmal habe, landen sie in einer Datei
und ich muss nie wieder etwas daran aendern." Gluecklicherweise sollte ich mit
dieser Vermutung Recht behalten. Ich hatte also nun 6 RRDs in meinem Verzeich-
nis: diskhda1.rrd, diskhda3.rrd, loadavg.rrd, memory.rrd, networketh0.rrd und
process.rrd. Fuer jede brauchte ich einen Befehl oder ein Skript um sie mit
Daten zu fuettern. Ich begann also bei den Festplatten. Die Belegung einer
Platte kann man wunderbar mit 'df' ermitteln und mit 'tr' und 'cut' die Zeichen
entfernen, die man nicht braucht. Ich kam also zu dem Befehl

Code:
bash# df|grep hda3|tr -s [:blank:]| cut -f3 -d" "

Damit erhielt ich die aktuelle Belegung als einzelne Zahl und hatte einen Wert,
mit dem ich arbeiten konnte. Um nun das ganze in die RRD zu fuettern, bastelte
ich mir ein kleines Skript

Code:
bash# cat >> disk.sh
#!/bin/bash
OHDA3=`df|grep hda3|tr -s [:blank:]| cut -f3 -d" "`
HDA3=$(expr $OHDA3 \* 1024)
/usr/local/bin/rrdtool update /root/scripts/rrdtool/diskhda3.rrd N:$HDA3

OHDA1=`df|grep hda1|tr -s [:blank:]| cut -f3 -d" "`
HDA1=$(expr $OHDA1 \* 1024)
/usr/local/bin/rrdtool update /root/scripts/rrdtool/diskhda1.rrd N:$HDA1

[STRG+D]

Als ich dieses Skript nun also ausfuehrbar machte

Code:
bash# chmod u+x disk.sh

konnte ich die Datenbank nun also mit den aktuellen Daten fuettern. Blieb nur
noch ein kleines Problem zu loesen. Wie sorge ich dafuer, dass dies in
bestimmten Abstaenden passiert? Wenn es um zeitgesteuerte Dinge ging, war Cron
schon immer mein Freund und so nahm ich mir vor erstmal alle Skripte fertig zu
machen und dann spaeter einfach Cron-Eintraege zu erstellen um sie in bestimm-
ten zeitlichen Abstaenden aufzurufen. Gedacht... getan.

Die Durchschnittslast kann man von der proc-Datei /proc/loadavg abfragen.
Schnell war also auch dafuer ein Skript gebastelt, das mir die 3 Werte fuer
die Durchschnittslast in der letzten Minute, den letzten 10 Minuten und der
letzten viertel Stunde getrennt mit Doppelpunkten gab und sie in die RRD
schrieb.

Code:
bash# cat >> loadavg.sh
#!/bin/bash
# in der Praxis zeigte sich, dass die Last verfaelscht war,
# wenn dieses Skript zusammen mit den anderen lief. Warten wir
# also erstmal auf die anderen.
sleep 10
# Hier bekommen wir unsere 3 Werte 1min/10min/15min
LOAD=$(awk '{print $1":"$2":"$3}' < /proc/loadavg)
# rein damit in die RRD
/usr/local/bin/rrdtool update /root/scripts/rrdtool/loadavg.rrd N:$LOAD

[STRG+D]

Dieses war der zweite Streich. Weiter ging es mit dem Speicher. Ueber den
erfaehrt man besonders viel ueber /proc/meminfo und wenn ich wieder die
unbrauchbaren Teile einfach abschnitt, bekam ich auch wieder Werte, die ich
verwenden konnte.

Code:
bash# cat >> memory.sh
#!/bin/bash
# die Daten rund um RAM und SWAP kommen aus /proc/meminfo
# freier RAM
FREERAM=`grep MemFree: /proc/meminfo|tr -s [:blank:]|cut -f2 -d" "`
# freier Swap
FREESWAP=`grep SwapFree: /proc/meminfo|tr -s [:blank:]|cut -f2 -d" "`
# rein damit in die RRD
/usr/local/bin/rrdtool update /root/scripts/rrdtool/memory.rrd N:$FREERAM:$FREESWAP

[STRG+D]

Nun fehlten also nur noch Netzwerk und Anzahl der Prozesse. Zuerst das
Netzwerk, diesmal wollte ich das Wichtigste mal ausnahmsweise nicht zuletzt
machen und alphabetisch gesehen kam in meinem 'ls'-Output jetzt auch die
network.rrd. Netzwerkinterface-Informationen konnte ich auch einfach aus
/proc/net/dev beziehen, um das Loopback nicht mit drin zu haben, filterte ich
also zuerst einmal alles aus, was mit eth0 zu tun hatte. Nun hatte ich
schonmal Informationen, die nur dieses Device betrafen. Die fuer mich
brauchbaren Informationen konnte ich mir also ganz einfach mit 'awk' ausfil-
tern. Dabei entstand dann also das vorletzte Skript zum Fuettern der RRDs.

Code:
bash# cat >> network.sh
#!/bin/bash
# erstmal alles, was mit eth0 zu tun hat
ETH0=$(grep eth0 /proc/net/dev)
# hier merken wir uns den Downstream
E0DOWN=$(echo $ETH0|tr \: \ |awk '{print $2}')
# und hier wird der Upstream zwischengespeichert
E0UP=$(echo $ETH0|tr \: \ |awk '{print $10}')
# rein damit in die RRD
/usr/local/bin/rrdtool update /root/scripts/rrdtool/networketh0.rrd N:$E0DOWN:$E0UP

[STRG+D]

Damit war auch das geschafft. Die Prozesse wurden nun ein Kinderspiel. Ich
brauchte ja einfach nur zu zaehlen, wieviele Zeilen der Output eines
vollstaendigen 'ps' hat. Schnell war also das letzte Skript fertig gestellt

Code:
bash# cat >> process.sh
#!/bin/bash
# da spaeter noch andere Skripte laufen, die wir nicht mitzaehlen wollen,
# warten wir, bis diese fertig sind
sleep 15
# jetzt zaehlen wir die Prozesse
PROZESSE=$(ps hax|wc -l)
# rein damit in die RRD
/usr/local/bin/rrdtool update /root/scripts/rrdtool/process.rrd N:$PROZESSE

[STRG+D]

4. Erstellen der Grafiken

Es war vollbracht. Ich hatte nun also Skripte, die alle RRDs mit den Daten
versorgen konnten, die ich haben wollte. Nun konnte ich aber schlecht meinem
Chef diese Dateien praesentieren und ihm sagen, dass da unsere Server-
Performance-Statistiken fuer die letzten 36 Stunden drin sind. Ich wollte ihm
ja was grafisches mit Kurven und so praesentieren. Etwas, was er anschauen
konnte, was schoen bunt war und ihm das Gefuehl gab, dass auf seine Server gut
aufgepasst wird. Fuer mich versteht es sich natuerlich von selbst, dass ich
meine Babies huete und ueberwache, wo es nur geht, aber das wusste er nicht,
dazu hatte ich zu wenig mit ihm zu tun. Ich musste aus diesen Daten also
irgendwie Bilder machen. Auch das ist mit RRDTool kein Problem. Ich erstellt
mir natuerlich auch dafuer ein Skript

Code:
bash# cat >> make_png.sh
#!/bin/bash
# Anzahl der Prozesse
nice -n 19 /usr/local/bin/rrdtool graph /root/scripts/rrdtool/proc36h-server1.png --start -129600 -a PNG --vertical-label "Prozesse" -w 600 -h 100 DEF:auswertung=/root/scripts/rrdtool/process.rrd:processes:AVERAGE LINE1:auswertung#ff0000:"Anzahl Prozesse" VDEF:auswertung1=auswertung,AVERAGE GPRINT:auswertung1:"Durchschnitt Anzahl Prozesse\: %lg" DEF:maxaus=/root/scripts/rrdtool/process.rrd:processes:MAX VDEF:maxaus1=maxaus,MAXIMUM GPRINT:maxaus1:"Hoechste Anzahl Prozesse\: %lg\j" > /dev/null
# RAM und Swap
SWAPT=`grep SwapTotal: /proc/meminfo|tr -s [:blank:]|cut -f2 -d" "`
MEMT=`grep MemTotal: /proc/meminfo|tr -s [:blank:]|cut -f2 -d" "`
MEMTOTAL=$(expr $MEMT \* 1024)
SWAPTOTAL=$(expr $SWAPT \* 1024)
nice -n 19 /usr/local/bin/rrdtool graph /root/scripts/rrdtool/ramswap-server1.png -b 1024 --start -129600 -a PNG -t "RAM und SWAP" --vertical-label "Bytes" -w 700 -h 100 DEF:fram=/root/scripts/rrdtool/memory.rrd:fram:AVERAGE DEF:fswap=/root/scripts/rrdtool/memory.rrd:fswap:AVERAGE CDEF:framb=fram,1024,* CDEF:fswapb=fswap,1024,* CDEF:bram=$MEMTOTAL,framb,- CDEF:bswap=$SWAPTOTAL,fswapb,- CDEF:brammb=bram,1048576,/ CDEF:frammb=framb,1048576,/ CDEF:bswapmb=bswap,1048576,/ CDEF:fswapmb=fswapb,1048576,/ VDEF:brammb1=brammb,LAST VDEF:frammb1=frammb,LAST VDEF:bswapmb1=bswapmb,LAST VDEF:fswapmb1=fswapmb,LAST AREA:bram#99ffff:"belegter RAM,  letzter\: " GPRINT:brammb1:"%7.3lf MB " LINE1:framb#ff0000:"freier RAM,  letzter\: " GPRINT:frammb1:"%7.3lf MB     Grafik erzeugt am\n" LINE1:bswap#000000:"belegter SWAP, letzter\: " GPRINT:bswapmb1:"%7.3lf MB " LINE1:fswapb#006600:"freier SWAP, letzter\: " GPRINT:fswapmb1:"%7.3lf MB    $(/bin/date "+%d.%m.%Y %H\:%M\:%S")" > /dev/null
# Durchschnittslast
nice -n 19 /usr/local/bin/rrdtool graph /root/scripts/rrdtool/loadavg-server1.png --start -129600 -a PNG -t "Load Average" --vertical-label "Average Load" -w 600 -h 100 -M DEF:load1=/root/scripts/rrdtool/loadavg.rrd:load1:AVERAGE DEF:load5=/root/scripts/rrdtool/loadavg.rrd:load5:AVERAGE DEF:load15=/root/scripts/rrdtool/loadavg.rrd:load15:AVERAGE VDEF:load1l=load1,LAST VDEF:load5l=load5,LAST VDEF:load15l=load15,LAST AREA:load1#ff0000:"1 Minute,   letzter\:" GPRINT:load1l:"%5.2lf\n" AREA:load5#ff9900:"5 Minuten,  letzter\:" GPRINT:load5l:"%5.2lf     Grafik erzeugt am\n" AREA:load15#ffff00:"15 Minuten, letzter\:" GPRINT:load15l:"%5.2lf    $(/bin/date "+%d.%m.%Y %H\:%M\:%S")" LINE1:load5#ff9900:"" LINE1:load1#ff0000:"" > /dev/null
# Netzwerk
nice -n 19 /usr/local/bin/rrdtool graph /root/scripts/rrdtool/eth0-server1.png --start -129600 -a PNG -t "Network Interface eth0" --vertical-label "Bytes/s" -w 600 -h 100 -M DEF:eth0r=/root/scripts/rrdtool/networketh0.rrd:eth0r:AVERAGE DEF:eth0t=/root/scripts/rrdtool/networketh0.rrd:eth0t:AVERAGE CDEF:eth0tn=eth0t,-1,* VDEF:eth0ra=eth0r,AVERAGE VDEF:eth0rm=eth0r,MAXIMUM VDEF:eth0rc=eth0r,LAST VDEF:eth0ta=eth0t,AVERAGE VDEF:eth0tm=eth0t,MAXIMUM VDEF:eth0tc=eth0t,LAST COMMENT:"               Durchschnitt           Maximum          aktuell   pro Sekunde\n" AREA:eth0r#00dd00:"Receive " GPRINT:eth0ra:"%12.3lf %sb" GPRINT:eth0rm:"%12.3lf %sb" GPRINT:eth0rc:"%12.3lf %sb\n" AREA:eth0tn#0000ff:"Transmit" GPRINT:eth0ta:"%12.3lf %sb" GPRINT:eth0tm:"%12.3lf %sb" GPRINT:eth0tc:"%12.3lf %sb" > /dev/null
# hda3
nice -n 19 /usr/local/bin/rrdtool graph /root/scripts/rrdtool/hda3-server1.png  -b 1024 --start -129600 -t "Belegung hda3 (EXT2)" --vertical-label "Bytes belegt" -w 600 -h 100 DEF:hda3=/root/scripts/rrdtool/diskhda3.rrd:hda3:AVERAGE AREA:hda3#00ff00:"belegter Platz" > /dev/null
# hda1
nice -n 19 /usr/local/bin/rrdtool graph /root/scripts/rrdtool/hda1-server1.png  -b 1024 --start -129600 -t "Belegung hda1 (EXT2)" --vertical-label "Bytes belegt" -w 600 -h 100 DEF:hda1=/root/scripts/rrdtool/diskhda1.rrd:hda1:AVERAGE AREA:hda1#00ff00:"belegter Platz" > /dev/null

[STRG+D]

5. Automatisierung

Als ich dieses Skript ausfuehrte, fand ich in meinem Verzeichnis tatsaechlich
die von mir gewuenschten Bilder. Ich kopierte sie also in das Webroot-Verzeich-
nis meines Webservers und als ich sie mir anschaute, konnte man tatsaechlich
ein paar kurze Striche darauf erkennen. Das waren die Daten von meinen Test,
die dort aufgezeichnet wurden. Es war nun also an der Zeit dafuer zu sorgen,
dass das ganze auch in regelmaessigen Abstaenden aktualisiert wurde, damit
Chef immer einigermassen aktuelle Daten sehen konnte. Ich fuegte also an meine
/etc/crontab ein paar Zeilen an, die dafuer sorgten, dass jede Minute neue
Daten in den RRDs landeten und alle 10 Minuten neue Bilder generiert wurden

Code:
*/1 * * * * root /root/scripts/rrdtool/process.sh >> /var/log/monitoring.log
*/1 * * * * root /root/scripts/rrdtool/memory.sh >> /var/log/monitoring.log
*/1 * * * * root /root/scripts/rrdtool/loadavg.sh >> /var/log/monitoring.log
*/1 * * * * root /root/scripts/rrdtool/network.sh >> /var/log/monitoring.log
*/1 * * * * root /root/scripts/rrdtool/disk.sh >> /var/log/monitoring.log
*/10 * * * * root /root/scripts/rrdtool/make_png.sh >> /var/log/monitoring.log

Nachdem ich eine halbe Stunde gewartet hatte konnte ich klar erkennen, dass
alles tatsaechlich so funktionierte wie ich mir das vorgestellt hatte. Nun
fehlte nur noch der Feinschliff, denn meinem Chef eine Liste von Links zu den
Bildern zu schicken, war auch nicht fein. Ich musste sie also zentral auf
einem Webserver sammeln und schoen in einer kleinen Homepage verpacken. Zum
Testen hatte ich mir mittlerweile eh schon eine kleine HTML-Datei geschrieben,
die die Bilder schoen beschriftet anzeigte.

6. Zentrales Sammeln der Grafiken auf einem Server

Wie ich es schon oft gemacht hatte, wenn ich Daten von einem Server auf einen
anderen kopieren wollte, griff ich also wieder einmal zu 'man ssh-keygen'.
Wann werde ich mir diese verflixten Parameter endlich merken koennen? Beim
Lesen kam ich dann wieder drauf. Doch um eine Hostkey-Authentifizierung
aufzusetzen musste ich noch ein paar Vorbereitungen treffen. Ich deaktivierte
die Cronjobs voruebergehend und aenderte die Rechte fuer mein rrdtool-Verzeich-
nis so, dass sie nicht mehr root, sondern einem extra dafuer angelegten User
gehoerten.

Code:
bash# groupadd monitoring
bash# useradd -g monitoring -d /root/scripts/rrdtool monitoring
bash# chown -R monitoring:monitoring /root/scripts/rrdtool/

Nun aenderte ich noch die Cronjobs entsprechend, so dass sie mit den Rechten
des neuen Users ausgefuehrt wurden und wechselte meine Identitaet

Code:
bash# su - monitoring

Jetzt war ich bereit die SSH-Schluessel zu generieren.

Code:
bash$ ssh-keygen -t dsa -f ssh-server1.key

Dadurch erhielt ich 2 Dateien, ssh-server1.key und ssh-server1.key.pub. Den
oeffentlichen Schluessel aus der .pub-Datei musste ich nur noch in die Datei
authorized_keys im Verzeichnis .ssh/ des Webserver-Homeverzeichnisses ein-
tragen. Nun musste ich nach dem generieren der Bilder diese nur noch mit

Code:
bash$ cat >> make_png.sh
scp -i /root/scripts/rrdtool/ssh-server1.key /root/scripts/rrdtool/*.png \
webserver.meinefirma.de:/webhome/monitoring/

[STRG+D]

auf den Webserver kopieren und konnte sie dort in einem Webinterface benutzen.
Die ganze Prozedur machte ich also auf allen unseren Servern, Rootservern wie
"lokalen", und praesentierte meinem Chef ein paar Tage spaeter ein Webinter-
face, in dem er sich all' die tollen bunten Bildchen anschauen konnte. Der war
happy, kann ich euch sagen. Ihr seht also, dass Chefs ganz einfach gluecklich
gemacht werden koennen. :)

Aber damit ihr auch noch was zum Nachdenken habt, erzaehle ich euch erst spae-
ter, wie ich die Uebersichten fuer eine ganze Woche gemacht habe. Wer aber
dieser Anleitung folgt, weiss zumindest, was in den letzten 36 Stunden auf
seinem Server passiert ist. Sicherlich lassen sich noch viele andere Sachen
auf diese Weise grafisch ueberwachen (denkbar waere z.B. die Ueberwachung der
Hardware mit lmsensors o.ae.), aber auch das ueberlasse ich ganz der Fantasie
des geneigten Lesers. Viel Spass beim Basteln.
 
sehr poetisches howto, gefaellt mir ;-) kommt noch eine fortsetzung ? wir warten seit fast 3 monaten !
 
Ja, kommt noch, hab aber momentan arbeitstechnisch viel zu tun. Muss mal sehen, wann sich die Zeit findet den Rest zu schreiben. Ist aber auf jeden Fall nicht in Vergessenheit geraten. :)
 
Irgendwie war mir klar, dass irgendwer wieder mit Cacti und Ntop ankommt. Kannst ja mal deinen Chef (wir gehen einfach mal von aus, dass er totaler technischer Laie ist) vor Ntop oder Cacti setzen. Der versteht wahrscheinlich nichts und wenn, dann maximal nur die Haelfte von dem, was er sieht. Ausserdem sind beide Tools nicht unbedingt geeignet um z.B. in ein (selbst erstelltes) zentrales Administrationsinterface eingefuegt zu werden. Abgesehen davon frisst Cacti nach meiner Erfahrung so unnoetig viele Ressourcen, dass ich mittlerweile versuche drauf zu verzichten, wenn es moeglich ist.
Und ich weiss immer noch nicht, wie ich mit Cacti an die Daten von lsensors rankomme ohne groessere Modifikationen machen zu muessen.

Fazit: Man muss nicht immer gleich zur 20mm-Kanone greifen, wenn man mal einen Spatzen erlegen will. :D
 
du bist viel zu sehr auf Konfrontation aus, calm down :). Ich habe nur zwei Links präsentiert.
 
Nix Konfrontation. :) Ich hatte nur irgendwie erwartet, dass irgendwer mich irgendwann mal anquatscht, dass es sowas doch schon mir Cacti gibt. Nun warst zufaelligerweise du es, aber keine Sorge, ich nehme es schon nicht persoenlich. :D Ich wollte nur klar machen, warum ich in unserer Firma was "eigenes" einsetze, warum ich dieses Howto geschrieben habe und warum solche "Fertig-Tools" nicht immer brauchbar sind. Ich denke, das ist mir gelungen. :)
 
Wieso sollte er mit cacti nix anfangen können ?

Wir reden doch von http://www.cacti.net/ - das is doch sehr simpel.
Hab das heute mittag auf nem Testserver ausprobiert ... ich finds easy.
 
Daher sagte ich ja, dass wir mal davon ausgehen, dass er ein technischer Laie ist, so wie ich es kennen gelernt habe. Es gibt Leute, die koennen mit Begriffen wie Partition oder Fan Speed nichts anfangen. Die brauchen dort etwas "genauere" Erklaerungen dran. Eine Partition muss dann halt eine Festplatte werden, aus User-Time wird hauptsaechlich von Programmen verbrauchte CPU-Zeit und Fan-Speed wird die Drehgeschwindigkeit des Prozessor-Luefters.
Mein Chef ist nunmal ein Mensch, der (dank Windows) alles als Platten bezeichnet, wo er drauf speichert, egal ob das ein eingehaengter Netzwerk-Ordner oder eine lokale Partition ist. Das sind dann halt die Platten C-Z. Internet besteht fuer ihne aus WWW und Email. (Gut, von Datenbanken hat er auch schon gehoert und weiss, dass man darin Daten ablegen kann, die spaeter auf einer Homepage benutzt werden koennen.)
Glaub mir, so jemand kann mit Cacti nichts anfangen und ist mit der Fuelle der Infos und den Fachwoertern total ueberfordert.
 
Aber wäre er dann mit deinem rrdtool nich erst recht überfordert?
Cacti bietet dir da ne einfach Methode zur Installation und Konfiguration von rrdtool ;)

Oder missverstehe ich jetzt was?

Aber is auch wurst ;) - Können wir dein Howto ins Wiki nehmen ?
 
theton schrieb:
Nix Konfrontation. :) Ich hatte nur irgendwie erwartet, dass irgendwer mich irgendwann mal anquatscht, dass es sowas doch schon mir Cacti gibt. Nun warst zufaelligerweise du es, aber keine Sorge, ich nehme es schon nicht persoenlich. :D Ich wollte nur klar machen, warum ich in unserer Firma was "eigenes" einsetze, warum ich dieses Howto geschrieben habe und warum solche "Fertig-Tools" nicht immer brauchbar sind. Ich denke, das ist mir gelungen. :)

ich wollte dein Howto nicht in Frage stellen, sondern nur ergänzend Alternativen erwähnen. Jeder soll es machen, wie er es braucht :).
 
devilz schrieb:
Aber wäre er dann mit deinem rrdtool nich erst recht überfordert?
Cacti bietet dir da ne einfach Methode zur Installation und Konfiguration von rrdtool ;)

Oder missverstehe ich jetzt was?

Aber is auch wurst ;) - Können wir dein Howto ins Wiki nehmen ?

Eingerichtet habe ich das ganze ja und ihm nen nettes kleines Webinterface gebastelt, mit dem er sich nun seine bunten Bildchen schoen einfach erlaeutert anschauen kann. :D

http://wiki.unixboard.de/index.php/Monitoring_mit_RRDTool ... Ich hatte es eh schonmal fuer unser Channel-Wiki in nen Format fuer MediaWiki gebracht. :)
 
@ theton:

Erst gestern habe ich mir Gedanken gemacht wie ich mir ähnliche Infos präsentieren kann und nun stoße ich auf diese Howto. Ich kann nur sagen super :) Ich versuche es bald mal richtig nachzuvollziehen (Erstmal richtig einlesen ;))
Steht einem Blick auf dein fertiges Werk was entgegen? :)

MfG PBeck
 
Sorry, da werden diverse Systemdaten inkl. IPs unserer Server angezeigt. Daher kann ich das leider nicht in der Oeffentlichkeit zur Verfuegung stellen. Eine Mini-Version habe ich dir aber gerade auf meinem Server schnell mal eingerichtet. Zu finden unter http://www.bitmuncher.de/monitoring/ Wird noch ein Weilchen dauern, bis die Graphen dort alle gefuellt sind, aber es ist nunmal frisch aufgesetzt. Erste Daten sieht man aber schon. Ist zwar nur eine simple HTML-Datei mit den eingefuegten Bildern, aber das Resultat des Howtos sind ja nunmal die Bilder und fuer tolles Styling hab ich jetzt keine Zeit. :)

PS: Neue Bilder sollten alle 10min generiert werden.
 
Zuletzt bearbeitet:
Vielen Dank. Sieht doch klasse aus und die Infos kommen rüber :) Ich hoffe ich werde bald die Zeit finden mich näher mit RRD und dem drum herum zu beschäftigen. Ist sehr nett um den Überblick zu bewahren und deine "Mini-Version" wird von den Graphen und gezeigten Infos bestimmt gute Dienste leisten ;)

MfG PBeck
 
Hätte dazu mal 2 Fragen ...

1. Prozessorlast

Es zeigt doe Prozessorlast als "100 m", "200 m" etc. an - das ist so wohl nicht gewollt oder? Wie ist dies zu ändern (z.B. in 0% - 100%)?

2. Ram

Bei Unixoiden Betriebssystemen ist der Arbeitsspeicher im Prinzip ja immer zu annähernd 100% voll und wird erst bei Bedarf wieder von nicht benötigtem Inhalt befreit. Dies kann man so ja auch anzeigen (den Teil, der theoretisch gelöscht werden könnte) - die Frage ist nur, wie?
 
Zu 1.: Er zeigt nicht die Prozessor-Last, sondern die Durchschnittslast an. Da dort keine %-Angaben moeglich sind, finde ich das 'm', um zu zeigen, dass es ein "Milli-Wert" ist, bei Last-Werte von 0.x recht passend. Eine Durchschnittslast von 0.5 wuerde dann z.B. als 500m angezeigt werden.

Zu 2.: Das kannst du gern tun, du musst ja nur im Skript vorher den genutzten Festplatten-Cache von der Gesamtmenge des benutzten Speichers abziehen. Alle dazu notwendigen Werte koennen der /proc/meminfo entnommen und (wie die von mir genutzten Werte auch) einfach mit grep extrahiert werden.
 
Ok, damit hast du natürlich Recht. Aber wenn die Serverbelastung zu dem Zeitpunkt 0.5 war, dann sollte auch 0.5 angezeigt werden und nicht 500. Ein Einfaches / 1000 funktioniert leider nicht, da dann aus 500m einfach 500u werden ...
 
Das kannst du erreichen, indem du beim Generieren des Graphen einen Einheiten-Exponent festlegst. So waere das in diesem Fall ein '-X 2' als zusaetzlicher Parameter. Allerdings laeuft man dann Gefahr, dass die Graphen ungenauer werden. Der Befehl zum Generieren des Graphen fuer die Durchschnittslast muesste dann wie folgt aussehen:
Code:
/usr/local/bin/rrdtool graph /root/scripts/rrdtool/loadavg-server1.png -X 2 \
--start -129600 -a PNG -t "Load Average" --vertical-label "Average Load" -w 600 \
-h 100 -M DEF:load1=/root/scripts/rrdtool/loadavg.rrd:load1:AVERAGE \
DEF:load5=/root/scripts/rrdtool/loadavg.rrd:load5:AVERAGE \
DEF:load15=/root/scripts/rrdtool/loadavg.rrd:load15:AVERAGE VDEF:load1l=load1,LAST \
VDEF:load5l=load5,LAST VDEF:load15l=load15,LAST AREA:load1#ff0000:"1 Minute,   \
letzter\:" GPRINT:load1l:"%5.2lf\n" AREA:load5#ff9900:"5 Minuten,  letzter\:" \
GPRINT:load5l:"%5.2lf     Grafik erzeugt am\n" AREA:load15#ffff00:"15 Minuten, letzter\:" \
GPRINT:load15l:"%5.2lf    $(/bin/date "+%d.%m.%Y %H\:%M\:%S")" \
LINE1:load5#ff9900:"" LINE1:load1#ff0000:""
Siehe dazu auch die Manpage zu 'rrdgraph' :)
 

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

Bash Skript: [[: not found Fehler

Shellskript - Fehler in Cron

NagiosGrapher 1.7.1 funktioniert nicht

Last mit etc/passwd anzeigen lassen

Zurück
Oben