-use strict;
-use Time::HiRes qw(time);
-use RRDs;
-use IO::File;
-use Time::HiRes qw( usleep );
-
-sub create($$){
- my $file = shift;
- my $time = shift;
- my $start = time; #since we loaded HiRes
- RRDs::create ( $file.".rrd", "-b$time", qw(
- -s300
- DS:in:GAUGE:400:U:U
- DS:out:GAUGE:400:U:U
- RRA:AVERAGE:0.5:1:600
- RRA:AVERAGE:0.5:6:600
- RRA:MAX:0.5:6:600
- RRA:AVERAGE:0.5:24:600
- RRA:MAX:0.5:24:600
- RRA:AVERAGE:0.5:144:600
- RRA:MAX:0.5:144:600
- ));
- my $total = time - $start;
- my $error = RRDs::error;
- die $error if $error;
- return $total;
-}
-
-sub update($$){
- my $file = shift;
- my $time = shift;
- my $in = rand(1000);
- my $out = rand(1000);
- my $start = time;
- my $ret = RRDs::updatev($file.".rrd", $time.":$in:$out");
-# print join("",map {" $_ " . $ret->{$_}."\n" } grep /AVERAGE.\[1\]/, sort keys %$ret)."\n** $time\n\n";
- # sync updates to disk immediately
-# usleep(1) if (rand(3) <1 );
- my $total = time - $start;
- my $error = RRDs::error;
- die $error if $error;
- return $total;
-}
-
-sub tune($){
- my $file = shift;
- my $start = time;
- RRDs::tune ($file.".rrd", "-a","in:U","-a","out:U","-d","in:GAUGE","-d","out:GAUGE");
- my $total = time - $start;
- my $error = RRDs::error;
- die $error if $error;
- return $total;
-}
-
-sub infofetch($){
- my $file = shift;
- my $start = time;
- my $info = RRDs::info ($file.".rrd");
- my $error = RRDs::error;
- die $error if $error;
- my $lasttime = $info->{last_update} - $info->{last_update} % $info->{step};
- my $fetch = RRDs::fetch ($file.".rrd",'AVERAGE','-s',$lasttime-1,'-e',$lasttime);
- my $total = time - $start;
- my $error = RRDs::error;
- die $error if $error;
- return $total;
-}
-
-sub stddev ($$$){ #http://en.wikipedia.org/wiki/Standard_deviation
- my $sum = shift;
- my $squaresum = shift;
- my $count = shift;
- return sqrt( 1 / $count * ( $squaresum - $sum*$sum / $count ))
-}
-
-sub makerrds($$$$){
- my $count = shift;
- my $total = shift;
- my $list = shift;
- my $time = shift;
- my @files;
- for (1..$count){
- my $id = sprintf ("%07d",$total);
- $id =~ s/^(.)(.)(.)(.)(.)//;
- push @$list, "$1/$2/$3/$4/$5/$id";
- -d "$1" or mkdir "$1";
- -d "$1/$2" or mkdir "$1/$2";
- -d "$1/$2/$3" or mkdir "$1/$2/$3";
- -d "$1/$2/$3/$4" or mkdir "$1/$2/$3/$4";
- -d "$1/$2/$3/$4/$5" or mkdir "$1/$2/$3/$4/$5";
- push @files, $list->[$total];
- create $list->[$total++],$time-2;
- print STDERR ".";
- }
- for (@files){
- my $fd = new IO::File("$_.rrd","r");
- if (defined $fd) {
- $fd->sync;
- $fd->close;
- } else {
- warn "failed to sync $_\n";
- }
- }
- return $count;
-}
-
-
-sub main (){
- mkdir "db-$$" or die $!;
- chdir "db-$$";
-
- my $step = 200000; # number of rrds to creat for every round
-
- my @path;
- my $time=int(time);