Downsampel für bestimmes Munin-Plugin

aplatac

New Member
Hallo,

ich suche nach einer Möglichkeit einen Munin-node daran zu hindern, durch 5-Minütiges Pollen der Smart-Wertre die Platten wach zu halten. Wenn ich das richtig sehe, dann führt jedes Auslesen der HDD-Temperatur mit hddtemp_smartctl (oder auch hddtemp und hddtemp2) zu einem neuen Anstoßen des Standbytimers der Platte. Das heißt Munin weckt die Platten zwar nicht aber wenn sie einmal laufen gehen sie auch nicht mehr schlafen ohne dass man das selber anstößt. Ich kann mir jetzt aussuchen, ob ich die Temperatur loggen oder die Platten schlafen lassen will. Das regelmäßige senden von hdparm -Y finde ich etwas ungeschickt und müsste mindestens um eine Abfrage erweitert werden ob die betreffende Platte gerade benutzt wird, oder besser in den letzten x Minuten benutzt wurde. Ich denke es würde reichen den Standbytimer der Platten unter das Pollingintervall von Munin zu bekommen um ein automatisches Einschlafen zu ermöglichen, aber zum einen sind 5 Min. sehr wenig und zum anderen nehmen die Platten so geringe Werte nicht an. Ich könnte mir eine Lösung vorstellen, bei der nur das hddtemp_smartctl-plugin mit einer verringerten Frequenz von 21 Min. und der Standbytimer mit 20 Min. läuft. Leider ist das Verändern der Pollingfrequenz scheinbar nicht so einfach vorgesehen oder?

vielen Dank :-)
 
Naja, die Plugins selbst werden immer lokal ausgeführt. Somit könntest du das Plugin schlichtweg mit einem Caching Mechanismen versehen.
Sind Cache-Daten vorhanden und jünger als 20 Minuten, dann werden die an den Munin Server zurückgegeben, sind keine vorhanden oder älter als 20 Minuten werden sie halt frisch via SMART ausgelesen.
Einfachste Möglichkeit wäre ein Temp-File auf eine aktiven Platte oder Ram-Disk. Alternative Möglichkeit wäre Memcache.
 
Hm, das wird wohl meine Fähigkeiten etwas überfordern. Ein simples 5 suchen und durch 21 ersetzen wird wohl nix?
 
Eben mal ersetzen? Nein, das geht nicht. munin-node ist kein popeliges Bash-Skript.
Das ist was für Perl-Programmierende mit Wissen und Erfahrung.
 
Er soll nicht Munin umschreiben, sondern nur ein Caching in das einzelne Modul reinbauen. Das ist ein Aufwand von 5 Minuten.
Und je nach Modul sind das sehr wohl Bash Scripte. ;)
 
Ausgehend von dem Code den GwenDragon verlinkt hat. Müsste dies die Zeile 226 ersetzen.
Der Code ist nur unabhängig vom Munin Plugin mit Dummy-Daten getestet. Er sollte aber auch im Plugin funktionieren.
Meine Perl-Kenntnisse sind etwas eingerostet, und das ist sicher nicht die schönste Lösung. Aber für ein Quick&Dirty Hack wirds reichen. :)

Code:
$cache_file="/dev/shm/munin_smartctl_cache_" . $drive;

if (-e $cache_file) {
	$threshhold = 1200;
	$mtime=(stat($cache_file))[9];
	$currenttime = time();
	if( ($currenttime - $mtime) > $threshhold){
		$output = `$cmd`;
		open(CACHE, '>', $cache_file); 
		print CACHE $output; 
		close(CACHE); 
	}
	else {
		open(CACHE, '<', $cache_file); 
		while (<CACHE>) { $output.=$_; }
		close(CACHE);
	}
}
else {
	$output = `$cmd`;
	open(CACHE, '>', $cache_file); 
	print CACHE $output; 
	close(CACHE); 
}
 
Ich kann das Plugin+Schnippsel jetzt aus Zeitgründen nicht testen und überarbeiten, aber ich sehe da schnell folgende Schwächen:
  1. Race-Condition beim Dateitestoperator -e
  2. fehlende Dateisperren nach open im Schreibmodus
  3. globale Dateideskriptoren
 
Back
Top