Accueil
Accueil
S'inscrire
Contactez-nous
Bande Passante
Mesurer votre bande passante
Fiches
Supervision
Bonnes Pratiques ITIL
Version Anglaise
Fault Management
Performance Management
All-in-one Monitoring
ITIL
Informations
Monitoring News
ozMonitor News
Demos
Google monitor
MSN monitor
Yahoo monitor
Articles les plus lus
Société
La Société
OZOOD Solutions
Conditions Générales
Connexion





Perdu votre mot de passe ?
Qui est en ligne ?
Il y a actuellement 77 connectés et 1 membre

 
Atelier : Suivi de la CPU avec RRDtool

Le fichier /proc/stat contient les statistiques du noyau, et du système.

Il affiche sur la première ligne les informations suivantes le nombre de jiffies (centièmes de seconde) que le système a passé :

  • en mode utilisateur,
  • en mode utilisateur avec une priorité basse (gentil),
  • en mode système,
  • et le temps d'inactivité.
Cet article traite le suivi de la CPU avec RRDtool en Perl.


Dans un premier temps, il va falloir mettre le script cpu.pl ci-dessous dans le répértoire /opt/supervision/bin

Nom du script : cpu.pl

Contenu :

#!/usr/bin/perl
use RRDs;
use strict;

# global variables
my $plugin = "cpu";
use FindBin;
my $Directory = "${FindBin::Bin}";
my $rrd = "${Directory}/${plugin}-stats.rrd";

my $cpu =`cat /proc/stat | grep "cpu  "`;
$cpu=~ /cpu  (.*) (.*) (.*) (.*)/;
my $user = $1 ;
my $nice = $2;
my $system = $3;
my $idle = $4 ;
#print "\n $user $nice   $system   $idle \n";


my $rrdstep = 300;
my $interval = int($rrdstep / 60);
my $rows = 4000 / $interval;

my $day_steps = int(3600 * 24 / $rrdstep);
my $week_steps = $day_steps * 7;
my $month_steps = $week_steps * 5;
my $year_steps = $month_steps * 12;

if(not -f $rrd) {
    RRDs::create($rrd, '--step', $rrdstep,
            'DS:user:COUNTER:'.($rrdstep*2).':0:100',
            'DS:nice:COUNTER:'.($rrdstep*2).':0:100',
            'DS:system:COUNTER:'.($rrdstep*2).':0:100',
            'DS:idle:COUNTER:'.($rrdstep*2).':0:100',
            "RRA:AVERAGE:0.5:1:$rows", #day
            "RRA:AVERAGE:0.5:".int(30/$interval).":800", #week
            "RRA:AVERAGE:0.5:".int(120/$interval).":800", # month
            "RRA:AVERAGE:0.5:".int(1440/$interval).":800", #year
            "RRA:MAX:0.5:1:$rows", #day
            "RRA:MAX:0.5:".int(30/$interval).":800", #week
            "RRA:MAX:0.5:".int(120/$interval).":800", # month
            "RRA:MAX:0.5:".int(1440/$interval).":800", #year
        );
        my $e = RRDs::error();
        die "ERROR: Cannot create rrdfile: $e\n" if $e;
}

#print "\n RRDs::update $rrd, N:$user:$nice:$system:$idle \n";
RRDs::update $rrd, "N:$user:$nice:$system:$idle";
my $e = RRDs::error();
die "ERROR: Cannot Update rrdfile: $e\n" if $e;


my $host = `hostname`; chomp $host;
my $xpoints = 700;
my $ypoints = 180;

my @names = ('system','user','nice','idle');
my $maxlenght = 0;
foreach my $n (@names) {
    if ($maxlenght < length($n)) { $maxlenght = length($n); }
}
my @color = ("#FF0000","#0000FF","#FFFF00","#00FF00","#FF00FF","#00FFFF","#FFFFFF", "#800000","#008000","#808000","#000080","#800080","#008080","#808080");

my @options;
@options = (@options, "COMMENT:               Average       Max\\n");
@options = (@options, "--no-minor");
@options = (@options, "-l0 ");
@options = (@options, "-u100 ");
@options = (@options, "--height=150");
@options = (@options, "--width=450");

my $i =0;
foreach my $ds (@names) {
    @options = (@options, "DEF:${ds}=$rrd:${ds}:AVERAGE");
    my $name = $ds;
    while (length($name)<$maxlenght) { $name = "${name} "; }
    #@options = (@options, "LINE2:${ds}$color[$i]:${name}");
    if ($i == 0) {
     @options = (@options, "AREA:${ds}$color[$i]:${name}");
    }
    else {
     @options = (@options, "STACK:${ds}$color[$i]:${name}");
    }
    @options = (@options, "GPRINT:${ds}:AVERAGE:%8.0lf %s");
    @options = (@options, "GPRINT:${ds}:MAX:%8.0lf %s\\n");
    $i++;
}
@options = (@options, "COMMENT:\\n");
@options = (@options, "COMMENT:Generator \\: http\\://www.ozMonitor.Net\\n");

my $titre = "CPU Performances for $host ";
my $ylegend = "%";

my $width = 450; my $height = 150;
my $day = 3600*24;
my $week = $day*7;
my $month = $day*31;
my $year = $day*365;


&graph("day");
&graph("week");
&graph("month");

################################################################################
sub graph($) {
    my $range = shift;
    my $start;
    if ($range eq "week") {
        $start = $week;
        @options = (@options, "-xHOUR:3:HOUR:6:DAY:1:0:%d/%m");
    }
    elsif ($range eq "month") {
        $start = $month;
        @options = (@options, "-xHOUR:12:DAY:1:DAY:4:0:%d/%m");
    }
    elsif ($range eq "year") { $start = $year;}
    else {
        $start = $day;
        @options = (@options, "-xMINUTE:30:HOUR:1:HOUR:2:0:%Hh");
    }

    my $graph_file = "${Directory}/${plugin}-${range}.png";
    my ($avg,$xsize,$ysize) = RRDs::graph "$graph_file","--title", "$titre","--start",-${start},"-v",$ylegend,"-a","PNG",@options;
    if (my $ERROR = RRDs::error) { print "ERROR: $ERROR\n"; }
    #print qq(\n "$graph_file","--title", "$titre","--start",-$start,"-v",$ylegend,"-a","PNG",@options \n);
}
################################################################################

 

 

Une fois, le script /opt/supervision/cpu.pl mis en place, ses droits sont changés comme suit :

  • chmod +x /opt/supervision/cpu.pl

 

Pour activer ce suivi de la cpu, il faudrait mettre la ligne suivante dans le cron  du serveur en question (avec la commande : crontab -e)

 */5 * * * * /opt/supervision/cpu.pl >/dev/null 2>/dev/null

 
Suivant >


 
     
OZOOD Solutions SARL. Copyright 2005