#!/usr/bin/perl =head1 NAME rrdcached-size.pl - estimate the IO and memory requirements for rrdcached =head1 SYNOPSIS B [B<-rrds>EI] [B<-step>EI] [B<-update>EI] [B<-file>EI] [B<-io>EI] [B<-w>EI] [B<-f>EI] [B<-pagesize>EI] =head1 OPTIONS =over 4 =item B<-rrds> I Specify the number of RRDs in the working set. =item B<-step> I Specify the RRD step value for each file. =item B<-update> I Average update string length. For this calculation, the time value must be specified as a C, not C. For example, this update string would lead to B<-update>EI<43> : 1226936851:0:0:101113914:0:0:0:25814373:0:0 =item B<-file> I Specify the average file name length. For this calculation, use the full path of the file. =item B<-io> I Specify the number of RRD files that your system can write per second. =item B<-w> I Specifies the B<-w> timer used with rrdcached. For more information, see the B documentation. =item B<-f> I Specifies the B<-f> timer used with rrdcached. For more information, see the B documentation. =item B<-pagesize> I Manually specify the system page size, in case it is not detected properly. =back =cut use strict; use warnings; my $filename_len = 60; my $update_len = 128; my $rrds = 100; my $step = 300; my $rrd_per_sec = 200; my $rrdc_write = 300; my $rrdc_flush = 3600; my $pagesize = `pagesize` || 4096; ################################################################# use Getopt::Long; GetOptions('rrds=i' => \$rrds, 'step=i' => \$step, 'update=i' => \$update_len, 'file=i' => \$filename_len, 'io=i' => \$rrd_per_sec, 'w=i' => \$rrdc_write, 'f=i' => \$rrdc_flush, 'pagesize=i' => \$pagesize, 'h' => \&usage, ) or die "Options failure"; @ARGV and die "Extra args: @ARGV\n"; ################################################################# my $MEG = 1024*1024; my $write_time = int($rrds / $rrd_per_sec); my $write_busy = int(100 * $write_time / $rrdc_write); my $buffered_pdp = $rrdc_write / $step; my $max_ram = $rrds * ($filename_len + ( $rrdc_write / $step ) * $update_len) / $MEG; my $journal_size = $rrds * (length("update") + $filename_len + $update_len + 3) * ($rrdc_flush/$step) * 2 # 2 logs / $MEG; my $journal_rate = (($journal_size*$MEG/2))/$rrdc_flush; my $journal_page_rate = $journal_rate / $pagesize; $_ = sprintf("%.1f", $_) for ($write_time, $write_busy, $buffered_pdp, $max_ram, $journal_size, $journal_rate, $journal_page_rate, ); print <<"EOF"; RRD files : $rrds files RRD step : $step seconds Update length : $update_len bytes IO writes/sec : $rrd_per_sec rrd/sec write timer : $rrdc_write seconds flush timer : $rrdc_flush seconds ----------------------------------------------------------------- Time to write all RRDs: $write_time sec ($write_busy\% busy) $buffered_pdp PDPs will be buffered per file RAM usage: $max_ram MB Journal size: $journal_size MB (total size for two journals) Journal write rate: $journal_page_rate page/sec ($journal_rate byte/sec) EOF sub usage { system("perldoc $0"); exit(1); }