rrdtool-Graphen skalieren
Ein Problem mit rrdtool ist die Skalierung der X-Achse, die so gelegt wird dass alle Datenpunkte gut in den Graphen passen. — Ist erstmal ein sinnvolles Verhalten, das gut implementiert ist und für viele Daten gute Ergebnisse liefert. Es stört aber wenn die Daten große Schwankungen und Ausreißer enthalten. Dann reicht z.Bsp. eine Lastspitze oder das Backup über’s Netz um den Graphen unbrauchbar zu machen, weil außer der Lastspitze garnichts mehr zu erkennen ist.
Um dem abzuhelfen hatte ich sogar mal die Skalierungsfunktion dahingehend geändert, dass nicht der Maximalwert, sondern das 99. Perzentil die Obergrenze bestimmt; dass also die größten Werte bei der Skalierung ignoriert werden. Das war aber alles nicht so schön und lag seitem in der Kategorie “Code-Schnipsel den ich mal überarbeiten muss bevor ich ihn vielleicht als Patch einreiche”.
Zu einer viel bessere Lösung führte mich die Tage ein Hinweis von Tobi Oetiker auf der Mailingliste: mit VDEF:var=datum,99,PERCENT
lässt sich der Wert auch berechnen und dann mit PRINT
ausgeben.
Damit lässt sich in einem Skript erst die gewünschte Obergrenze berechnen und dann mit --upper-limit
auf alle Graphen der Datenreihe anwenden (ich erzeuge z.B. immer Graphen für Monat, Woche, Tag– da ist es gut wenn die gleich skaliert sind).
Jetzt aber zum eigentlichen, den nötigen Kommandos.
#! /usr/local/bin/bash hostlist="fax" times[1]="--start end-24h" times[2]="--start end-8d" common_options="-R light -a PNG -h 150 -w 500" # Perzentil zur Skalierung percentile=98 # Zeitraum zur Berechnung der Skalierung percentile_time=--start end-8d for host in $hostlist; do limit=`rrdtool graph netio.png ${percentile_time} DEF:InOctets=${host}-netio.rrd:ifInOctets:AVERAGE DEF:OutOctets=${host}-netio.rrd:ifOutOctets:AVERAGE CDEF:pct0=InOctets,OutOctets,MAX,1024,/ VDEF:pct=pct0,${percentile},PERCENT 'PRINT:pct:%lf' | tail -1` for i in 1 2; do rrdtool graph netio.png -t "${host} Network I/O" -v "KBytes/sec" $common_options ${times[$i]} --upper-limit ${limit} --rigid DEF:InOctets=${host}-netio.rrd:ifInOctets:AVERAGE DEF:OutOctets=${host}-netio.rrd:ifOutOctets:AVERAGE 'AREA:InOctets#00FF00:Bandwith In ' 'LINE1:KBout#0000FF:Bandwith Out' done done