Welcome to Linux Knowledge Base and Tutorial
"The place where you learn linux"
Let The Music Play: Join EFF Today

 Create an AccountHome | Submit News | Your Account  

Tutorial Menu
Linux Tutorial Home
Table of Contents

· Introduction to Operating Systems
· Linux Basics
· Working with the System
· Shells and Utilities
· Editing Files
· Basic Administration
· The Operating System
· The X Windowing System
· The Computer Itself
· Networking
· System Monitoring
· Solving Problems
· Security
· Installing and Upgrading
· Linux and Windows

Man Pages
Linux Topics
Test Your Knowledge

Site Menu
Site Map
Copyright Info
Terms of Use
Privacy Info
Masthead / Impressum
Your Account

Private Messages

News Archive
Submit News
User Articles
Web Links


The Web

Who's Online
There are currently, 74 guest(s) and 0 member(s) that are online.

You are an Anonymous user. You can register for free by clicking here




       Helping new RRDTool users to understand the basics of RRD­


       This manual is an attempt to assist beginners in under­
       standing the concepts of RRDTool. It sheds a light on dif­
       ferences between RRDTool and other databases. With help of
       an example, it explains structure of RRDTool database.
       This is followed by an overview of the "graph" feature of
       RRDTool.  At the end, it has sample scripts that illus­
       trates the usage/wrapping of RRDTool within Shell/Perl.

       What makes RRDTool so special?

       RDtool is GNU licensed software developed by Tobies
       Oetiker, a system manager at the Swiss Federal Institute
       of Technology. Though it is a database, there are distinct
       differences between RRDtool database and other databases
       as listed below:

       ·   RRDTool stores data; that makes it a back end tool.
           The RRDtool command set allows the creation of graphs;
           that makes it a front end tool as well. Other
           databases just stores data and can not create graphs.

       ·   In case of linear databases, new data gets appended at
           the bottom of the database table. Thus its size keeps
           on increasing, whereas size of an RRDtool database is
           determined at creation time. Imagine an RRDtool
           database as the perimeter of a circle. Data is added
           along the perimeter. When new data reaches the start­
           ing point, it overwrites existing data. This way, the
           size of an RRDtool database always remains constant.
           The name "Round Robin" stems from this attribute.

       ·   Other databases store the values as supplied. RRDtool
           can be configured to calculate the rate of change from
           the previous to the current value and store this
           information instead.

       ·   Other databases get updated when values are supplied.
           The RRDTool database is structured in such a way that
           it needs data at predefined time intervals. If it does
           not get a new value during the interval, it stores an
           UNKNOWN value for that interval. So, when using the
           RRDTool database, it is imperative to use scripts that
           runs at regular intervals to ensure a constant data
           flow to update the RRDTool database.

       RRDtool has a lot to do with time. With every data update,
       it also needs to know the time when that update occurred.
       RRDTool databases are primarily used for monitoring pur­
       poses and hence are very simple in structure. The parame­
       ters that need to be defined are variables that hold val­
       ues and archives of those values. Being time sensitive, a
       couple of time related parameters are also defined.
       Because of its structure, the definition of an RRDTool
       database also includes a provision to specify specific
       actions to take in the absence of update values. Data
       Source (DS), heartbeat, Date Source Type (DST), Round
       Robin Archive (RRA), and Consolidation Function (CF) are
       some of the terminologies related to RRDTool databases.

       The structure of a database and the terminology associated
       with it can be best explained with an example.

        rrdtool create target.rrd
                --start 1023654125
                --step 300

       This example creates a database named target.rrd. Start
       time (1023654125) is specified in total number of seconds
       since epoch (time in seconds since 01-01-1970). While
       updating the database, update time is also specified.
       This update time MUST occur after start time and MUST be
       in seconds since epoch.

       The step of 300 seconds indicates that database expects
       new values every 300 seconds. The wrapper script should be
       scheduled to run every step seconds so that it updates the
       database every step seconds.

       DS (Data Source) is the actual variable which relates to
       the parameter on the device that has to be monitored. Its
       syntax is


       DS is a key word. "variable_name" is a name under which
       the parameter is saved in database. There can be as many
       DSs in a database as needed. After every step interval, a
       new value of DS is supplied to update the database.  This
       value is also called as Primary Data Point (PDP). In our
       example mentioned above, a new PDP is generated every 300

       Note, that if you do NOT supply new datapoints exaclty
       every 300 seconds, this is not problem, RRDTool will
       interpolate the data accordingly.

       example). GAUGE does not save the rate of change. It saves
       the actual value itself. There are no divisions/calcula­
       tions. Memory consumption in a server is an ideal example
       of gauge. Difference among different types DSTs can be
       explained better with following example:

        Values       = 300, 600, 900, 1200
        Step         = 300 seconds
        COUNTER DS   =    1,  1,   1,    1
        DERIVE DS    =    1,  1,   1,    1
        ABSOLUTE DS  =    1,  2,   3,    4
        GAUGE DS     = 300, 600, 900, 1200

       The next parameter is heartbeat. In our example, heartbeat
       is 600 seconds. If database doesn not get a new PDP within
       300 seconds, it will wait for another 300 seconds (total
       600 seconds).  If it doesnt receive any PDP with in 600
       seconds, it will save an UNKNOWN value into database. This
       UNKOWN value is a special feature of RRDTool - it is much
       better than to assume a missing value was 0 (zero).  For
       example, the traffic flow counter on a router keeps on
       increasing. Lets say, a value is missed for an interval
       and 0 is stored instead of UNKNOWN. Now when next value
       becomes available, it will calculate difference between
       current value and previous value (0) which is not correct.
       So, inserting value UNKNOWN makes much more sense here.

       The next two parameters are the minimum and maximum value
       respectively. If variable to be stored has predictable
       maximum and minimum value, this should be specified here.
       Any update value falling out of this range will be saved
       as UNKNOWN.

       The next line declares a round robin archive (RRA). The
       syntax for declaring an RRA is


       RRA is the keyword to declare RRAs. The consolidation
       function (CF) can be AVERAGE, MINIMUM, MAXIMUM, and LAST.
       The concept of the consolidated data point (CDP) comes
       into the picture here. A CDP is CFed (averaged, maxi­
       mum/minimum value or last value) from step number of PDPs.
       This RRA will hold rows CDPs.

       Lets have a look at the example above. For the first RRA,
       12 (steps) PDPs (DS variables) are AVERAGEed (CF) to form
       one CDP. 24 (rows) of theses CDPs are archived. Each PDP
       occurs at 300 seconds. 12 PDPs represent 12 times 300 sec­
       onds which is 1 hour. It means 1 CDP (which is equal to 12
       PDPs) represents data worth 1 hour. 24 such CDPs represent
       1 day (1 hour times 24 CDPs). It means, this RRA is an
       create graphs. The "graph" command uses "fetch" command
       internally to retrieve values from the database. With the
       retrieved values, it draws graphs as defined by the param­
       eters supplied on the command line. A single graph can
       show different DS (Data Sources0) from a database. It is
       also possible to show the values from more than one
       databases into a single graph. Often, it is necessary to
       perform some math on the values retrieved from database,
       before plotting them. For example, in SNMP replies, memory
       consumption values are usually specified in KBytes and
       traffic flow on interfaces is specified in Bytes. Graphs
       for these values will be more senseful if values are rep­
       resented in MBytes and mbps. the RRDTool graph command
       allows to define such conversions. Apart from mathematical
       calculations, it is also possible to peform logical opera­
       tions such as greater than, less than, and if then else.
       If a database contains more than one RRA archive, then a
       question may arise - how does RRDTool decide which RRA
       archive to use for retrieving the values? RRDtool takes
       looks at several things when making its choice. First it
       makes sure that the RRA covers as much of the graphing
       time frame as possible. Second it looks at the resolution
       of the RRA compared to the resolution of the graph. It
       tries to find one which has the same or better resolution.
       With the "-r" option you can force RRDtool to assume a
       different resolution than the one calculated from the
       pixel width of the graph.

       Values of different variables can be presented in 5 dif­
       ferent shapes in a graph - AREA, LINE1, LINE2, LINE3, and
       STACK. AREA is represented by a solid colored area with
       values as the boundary of this area. LINE1/2/3 (increasing
       width) are just plain lines representing the values. STACK
       is also an area but it is "stack"ed on AREA or LINE1/2/3.
       Another important thing to note, is that variables are
       plotted in the order they are defined in graph command.
       So, care must be taken to define STACK only after defining
       AREA/LINE. It is also possible to put formatted comments
       within the graph.  Detailed instructions be found under
       graph manual.

       Wrapping RRDTool within Shell/Perl script

       After understanding RRDTool, it is now a time to actually
       use RRDTool in scripts. Tasks involved in network manage­
       ment are data collection, data storage, and data
       retrieval. In the following example, the previously cre­
       ated target.rrd database is used. Data collection and data
       storage is done using Shell scrip. Data retrieval and
       report generation is done using Perl script. These scripts
       are as shown below:

                            END {print tot_mem}' snmp_reply`
            # I can use N as a replacement for the current time
            rrdtool update target.rrd N:$total_mem
            # sleep until the next 300 seconds are full
            perl -e 'sleep 300 - time % 300'
        done # end of while loop

       Perl script (retrieves data from database and generates
       graphs and statistics)

        #!/usr/bin/perl -w
        #This script fetch data from target.rrd, creates graph of memory consumption
        on target (Dual P3 Processor 1 GHz, 656 MB RAM)

        #calling RRD perl module
        use lib qw( /usr/local/rrdtool-1.0.41/lib/perl ../lib/perl );
        use RRDs;
        my $cur_time = time();                # setting current time
        my $end_time = $cur_time - 86400;     # setting end time to 24 hours behind current time
        my $start_time = $end_time - 2592000; # setting start time to 30 days from end time

        my $time_variable = $start;
        foreach $line (@$data) {
          $vals[$rows][$columns] = $time_variable;
          $time_variable = $time_variable + $step;
          foreach $val (@$line) {
                  $vals[$rows][++$columns] = $val;}
          $columns = 0;
        my $tot_time = 0;
        my $count = 0;
        #saving values from 2-dimensional into 1-dimensional array
        for $i ( 0 .. $#vals )
            $tot_mem[$count] = $vals[$i][1];
        my $tot_mem_sum = 0;
        #calculating total of all values
        for $i ( 0 .. ($count-1) ) {
            $tot_mem_sum = $tot_mem_sum + $tot_mem[$i];
        #calculating average of array
        my $tot_mem_ave = $tot_mem_sum/($count);
        #creating graph
        RRDs::graph ("/images/mem_$count.gif",   \
                    "--title= Memory Usage",    \
                    "--vertical-label=Memory Consumption (MB)", \
                    "--start=$start_time",      \
                    "--end=$end_time",          \
                    "--color=BACK#CCCCCC",      \
                    "--color=CANVAS#CCFFFF",    \
                    "--color=SHADEB#9999CC",    \
                    "--height=125",             \
                    "--upper-limit=656",        \
                    "--lower-limit=0",          \
                    "--rigid",                  \
                    "--base=1024",              \
                    "DEF:tot_mem=target.rrd:mem:AVERAGE", \
                    "COMMENT:Memory Consumption between $start_time",\
                    "COMMENT:    and $end_time                     ",\
                    "HRULE:656#000000:Maximum Available Memory - 656 MB",\
                    "AREA:machine_mem#CCFFFF:Memory Unused",   \
                    "AREA:correct_tot_mem#6699CC:Total memory consumed in MB");
        my $err=RRDs::error;
        if ($err) {print "problem generating the graph: $err\n";}
        #printing the output
        print "Average memory consumption is ";
        printf "%5.2f",$tot_mem_ave/1024;
        print " MB. Graphical representation can be found at /images/mem_$count.gif.";

Show your Support for the Linux Tutorial

Purchase one of the products from our new online shop. For each product you purchase, the Linux Tutorial gets a portion of the proceeds to help keep us going.



Security Code
Security Code
Type Security Code

Don't have an account yet? You can create one. As a registered user you have some advantages like theme manager, comments configuration and post comments with your name.

Help if you can!

Amazon Wish List

Did You Know?
The Linux Tutorial welcomes your suggestions and ideas.


Tell a Friend About Us

Bookmark and Share

Web site powered by PHP-Nuke

Is this information useful? At the very least you can help by spreading the word to your favorite newsgroups, mailing lists and forums.
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters. Articles are the property of their respective owners. Unless otherwise stated in the body of the article, article content (C) 1994-2013 by James Mohr. All rights reserved. The stylized page/paper, as well as the terms "The Linux Tutorial", "The Linux Server Tutorial", "The Linux Knowledge Base and Tutorial" and "The place where you learn Linux" are service marks of James Mohr. All rights reserved.
The Linux Knowledge Base and Tutorial may contain links to sites on the Internet, which are owned and operated by third parties. The Linux Tutorial is not responsible for the content of any such third-party site. By viewing/utilizing this web site, you have agreed to our disclaimer, terms of use and privacy policy. Use of automated download software ("harvesters") such as wget, httrack, etc. causes the site to quickly exceed its bandwidth limitation and are therefore expressly prohibited. For more details on this, take a look here

PHP-Nuke Copyright © 2004 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Page Generation: 0.08 Seconds