lundi 10 mai 2010

Test du module RRD perl

Je suis en ce moment en train de finir mes scripts de migration de la base MySQL ndoutils vers des bases RRD gérées par pnp4nagios.

Globalement, le script est terminé et je suis juste en train de faire quelques tests. A cette occasion, j'ai voulu connaître le différentiel de performance entre RRD via le binaire et via la bibliothèque Perl.

Pour se faire, j'ai donc écrit le script suivant :


#!/usr/bin/perl
use RRDs;
$use_system = 1;

$current = time();
$step = 30;
$range = 3600 * 24 * 7;
$start = $current - $range;
print "Début : ".scalar(localtime())."\n";
if($use_system) {
system("rrdtool create test.rrd --start $start --step $step DS:valeur_test:GAUGE:600:U:U RRA:AVERAGE:0.5:1:".($range / $step));
} else {
RRDs::create("test.rrd", "--start", $start, "--step", $step, "DS:valeur_test:GAUGE:600:U:U", "RRA:AVERAGE:0.5:1:".($range / $step));
}

$j = 0.;
$| = 1;
$i = 0;
for($t = $start; $t < $current; $t += $step) {
$value = int(200.5 + cos($j) * 100.);
if($use_system) {
system("rrdtool update test.rrd $t:$value");
} else {
RRDs::update("test.rrd", "$t:$value");
}
$j += 0.001;
$i++;
}
print "Insertion de $i valeurs\n";
if($use_system) {
system("rrdtool graph speed.png --start $start --end $current DEF:def=test.rrd:valeur_test:AVERAGE LINE1:def#000000 -w 1000 -h 400");
} else {
RRDs::graph("speed.png", "--start", $start, "--end", $current,
"DEF:def=test.rrd:valeur_test:AVERAGE", "LINE1:def#000000", "-w", 1000, "-h", 400);
}
print "Fin : ".scalar(localtime())."\n";
system("gwenview speed.png");


En gros, le script génère une sinusoïde que j'affiche ensuite sous gwenview (prenez votre lecteur d'image préféré).

Un rapide test nous donne le résultat suivant :
* via l'utilisation de la bibliothèque :

drayan@robinet:~/nagios/RRD$ ./generate_rrd.pl
Début : Mon May 10 22:45:56 2010
Insertion de 20160 valeurs
Fin : Mon May 10 22:45:57 2010

* via l'utilisation des binaires :

Début : Mon May 10 22:46:08 2010
ERROR: test.rrd: illegal attempt to update using time 1272919568 when last update time is 1272919568 (minimum one second step)
Insertion de 20160 valeurs
1081x449
Fin : Mon May 10 22:48:57 2010


Donc 1 seconde contre environ 3 minutes dans le second cas. On va donc passer par la bibliothèque !