Hlavní navigace

Prechádzame na RRDTOOL (5)

1. 2. 2002
Doba čtení: 5 minut

Sdílet

V minulej časti miniseriálu o mocnom nástroje na vizualizáciu dát v časových radoch sme si ukázali dva prvé príklady praktického využitia, dnes si ukážeme, akým spôsobom je možné realizovať prehľad o vyťaženosti našeho mail servera prostredníctvom tohto pomocníka. Hneď na úvod si ukážeme výsledok a potom si vysvetlíme, ako sa k danému výsledku dopracujeme.

Ako vidíte, v grafe súčasne zobrazujeme dve nesúrodé veličiny. V jednom prípade zobrazujeme v stackovaných grafoch čiastkové počty jednotlivých bežiacich procesov, avšak na druhej strane zobrazujeme graf percentuálneho vyťaženia CPU na mail serveri:

Graf

Ako tieto veličiny skĺbiť do jedného grafu pri zachovaní čitateľnosti? Princíp je jednoduchý. Čiastkové hodnoty súčtov jednotlivých procesov zobrazujeme ako kladné hodnoty vyjadnurúce ich aktuálny počet, vyťaženie CPU pre možnosť zakomponovania do grafu zmeníme na záporné hodnoty. Keďže počty procesov v našom prípade nie sú vysoké a nepresiahnu v sumáre hodnotu 100, pre dobré grafické znázornenie delíme percentuálne vyťaženie hodnotou 10. Tým získa hodnota nulového vyťaženia hodnotu 0 a plné 100 percentné vyťaženie hodnotu –10.

Ako zistíme jednotlivé hodnoty?

1. počty procesov

Sledujeme procesy imap, pop3, sendmail a procmail. Na počítanie použijeme výstup z ps, požadovaný výber uskutočníme pomocou grepu a následne sčítame pomocou wc. Takže sa dostávame k

ps aux | grep imapd | grep -v root | grep -v grep | wc -l
  ps aux | grep cucipop | grep -v root | grep -v grep | wc -l
  ps ax | grep sendmail | grep -v grep | wc -l
  ps ax | grep procmail | grep -v grep | wc -l

Vyťaženie procesoru na hoste, na ktorom snmpd nie je inštalovaný, získame takisto jednoduchým spôsobom, a to nalsedovne:

top b -n 3 -d 1 | grep "CPU state" tail -1 | awk '{print 100-$9}'

Keďže rrdtool nemusí bežať na rovnakom hoste, ako daný mail server, jednoduchým spôsobom si vytvoríme skripty pre inetd, eventuélne pre xinetd alebo iný superserver, aby sme výstup sprístupnili pre host, ktorý uskutočňuje monitorovanie. Vytvoríme si jednotlivé dielčie skripty, do ktorých zaradíme príslušný skript, vypisujúci hodnotu na STDOUT, vytvoríme si nové záznamy do /etc/services, kde si nadefinujeme jednotlivé porty ako napríklad 15000 pre showcpu, 15001 pre showpop, 15002 pre showimap … a vytvoríme si jednotlivé definície v inetd pre spúšťanie daných skriptov na daných portoch s obmedzením pre host, z ktorého budeme dáta čítať. Potom je už iba hračkou zo vzdialeného hostu za pomoci nc prečítač požadované hodnoty a zaradiť ich do RRA archívu. Náš vzorový skript po úprave pre túto situáciu bude vyzerať nasledovne:

#! /usr/bin/perl
  use lib qw( /rrdtool/perl-shared/blib/lib /rrdtool/perl-shared/blib/arch );
  use lib qw( /usr/local/rrdtool-1.0.33/lib/perl /rrdtool/lib/perl );

  use RRDs;
  my $start=time;
  my $rrd= "/home/httpd/mrtg.domena.sk-443/html/rrdtool/test/mailstat.rrd";
  my $name = "/home/httpd/mrtg.domena.sk-443/html/rrdtool/test/mailstat.png";

  if (not -f $rrd){
  RRDs::create ($rrd, "--start",$start-1, "--step",60,
        "DS:pop:GAUGE:180:U:U",
        "DS:imap:GAUGE:180:U:U",
        "DS:send:GAUGE:180:U:U",
        "DS:proc:GAUGE:180:U:U",
        "DS:cpu:GAUGE:180:U:U",
        "RRA:AVERAGE:0.5:1:3600",
        "RRA:MIN:0.5:1:3600",
        "RRA:MAX:0.5:1:3600",
  );
  };

  my $ERROR = RRDs::error;
  die "$0: unable to create `$rrd': $ERROR\n" if $ERROR;

  $pop=`nc 111.111.111.111 15001`+0;
  $imap=`nc 111.111.111.111 15002`+0;
  $send=`nc 111.111.111.111 15003`+0;
  $proc=`nc 111.111.111.111 15004`+0;
  $cpu=0-`nc 62.168.111.193 15005`;
  $cpulegend=0-$cpu;

  $date=`date`;

  print "$start:$pop:$imap:$send:$proc:$cpu";

  RRDs::update $rrd,"$start:$pop:$imap:$send:$proc:$cpu";

  my $ERROR = RRDs::error;
  die "$0: unable to create `$rrd': $ERROR\n" if $ERROR;

  RRDs::graph "$name",
    "--title", "Prehlad vytazenia mail servera",
    "--start", "now-24h",
    "--end", "now",
    "--imgformat","PNG",
    "--width=600",
    "--height=200",
    "--step=300",
    "--x-grid","MINUTE:60:HOUR:1:HOUR:1:0:%H",
    "DEF:pop=$rrd:pop:MAX",
    "DEF:imap=$rrd:imap:MAX",
    "DEF:send=$rrd:send:MAX",
    "DEF:cpu=$rrd:cpu:MIN",
    "DEF:proc=$rrd:proc:MAX",
    "CDEF:gcpu=cpu,10,/",
    "AREA:pop#0000FF:POP3 procesy\\: $pop\\r",
    "STACK:imap#00FF00:IMAP procesy\\: $imap\\r",
    "STACK:send#FF0000:SENDMAIL procesy\\: $send\\r",
    "STACK:proc#FFFF00:PROCMAIL procesy\\: $proc\\r",
    "LINE1:gcpu#000000:Vytazenie CPU\\: $cpulegend %\\r",
    "COMMENT:Generovane $date ",
    "HRULE:0#0000ff",
    "HRULE:-10#0000ff",
  ;
  if ($ERROR = RRDs::error) {
    print "ERROR: $ERROR\n";
  };

Takže analogicky, ako v predchádzajúcich príkladoch je najprv vytvorený RRA archív pre minútové údaje v prípade jeho neexistencie a nasleduje zber dát. Za pomoci nc zozbierame z našeho mail servera na príslušných portoch, alebo v vašom prípade možno priamo na hoste, za pomoci už spomenutých ps aux… | grep … | wc -l, ktoré sú uložené do príslušných premenných, s tým, že vyťaženie CPU si priamo zmeníme na záporné číslo. Nasleduje uloženie do RRA archívu a prichádzame k tvorge grafu. Pre prehľadnejšie zobrazenie sme si vybrali užívateľsky definovanú grid pre os x, kde bude zobrazená deliaca linka na každej celej hodine a na popiskách k osi x sa bude nachádzať iba celé označenie aktuálnej hodiny. Ako ste si všimli, vykresľujeme maximálne hodnoty v danej minúte, čo však pri záporných hodnotách pre CPU znamená minimum, takže si to treba uvedomiť pri vlastných aplikáciách. Pre premenu hodnoty vyťaženia CPU pre vznik stropu –10 je potrebné hodnotu upraviť pomocou definície CDEF do premennej gcpu nasledovne CDEF:gcpu=cpu,10,/ , kde sme vlastne pomocou operandov RPL vydelili hodnotu desiatimi. Nasleduje vykreslenie AREA grafu prvej hodnoty počtu procesov a následne ostatných formov stackovaných stĺpcov. Vykreslíme si premennú gcpu znázorňujúcu vyťaženie CPU. Pre lepšie oddelenie si pomôžeme horozontálnymi čiarami na hodnote 0 a 100 %, čiže 0 a –10 pomocou príkazu HRULE. Ešte nám zostáva uskutočniť minútový zber dát prostredníctvom cronu,

* * * * * root /usr/local/rrdtool/work/mailstat.pl

a požadovaný výsledok sa dostaví.

root_podpora

Takýmto spôsobom si môžeme podľa vlastných podmienok pripraviť skripty pre monitorovanie serverov v našich podmienkach. Ak sú súčtové hodnoty jednotlivých procesov vysoké a percentuálne vyťaženie nám akosi zaniká, náprava je jednoduchá. Úmyselne boli do RRA archívu ukladané hodnoty aktuálne a nie delené hodnotou 10, čo sme učinili až pri CDEF definícii. Ak teda budeme deliť hodnotou 5, bude maximálna hodnota –20 a tým dosiahneme väčšieho poľa vo výslednom grafe. Netreba však zabudnúť aj na predefinovanie HRULE:-10#0000ff, aby spodný limit zodpovedal príslušným hodnotám. Možno vás udivilo, že zber dát sa realizuje v minútových intervaloch. Bola to iba ukážka, že nie je potrebné držať sa stále 5 minútových priemerov, ako tomu bolo u MRTG.

Nabudúce si ukážeme, akým spôsobom je možné monitorovať veličiny prostredníctvom SNMP.

Byl pro vás článek přínosný?