
Uno script shell per monitorare il sistema
Con l’aiuto degli RRDtool e di poche righe di codice Bash possiamo tenere sotto controllo il computer e scoprire come va e dove è possibile intervenire per migliorare le prestazioni
(pagina 3 di 4)
Rappresentazione grafica dei dati
RRDtool ha un punto di forza notevole nelle possibilità di rappresentazione
grafica dei dati, di cui esploreremo solamente una piccola parte,
riuscendo nonostante questo a produrre un grafico di qualità. La prima
operazione che viene compiuta è quella della definizione delle variabili
del grafico, operata tramite la parola chiave DEF
DEF:mem=archive.rrd:mem:AVERAGE
DEF:load=archive.rrd:load:AVERAGE
con questi comandi abbiamo definito le variabili mem e load (secondo
campo, prima dell’uguale), estraendole dal database contenuto nel file
archive.rrd e collegandole alle variabili (omonime) contenute in esso e
definite all’atto della creazione del database (terzo campo). La funzione
AVERAGE indica quale campo dobbiamo leggere dal database, tra
quelli memorizzati: avremmo potuto infatti salvare, oltre a vari tipi di medie
(come abbiamo visto) anche altri tipi di informazione come il valore
massimo o minimo. Qui è necessario quindi specificare quale funzione
leggere e con quale intervallo (in questo caso l’intervallo è stato omesso,
essendocene uno unico). Tramite la parola chiave CDEF possiamo invece
definire nuovi dati calcolandoli a partire da quelli a disposizione
CDEF:load120=load,120,TREND
CDEF:mem70=mem,70,*,100,/
CDEF:mem5=mem,5,*,100,/
CDEF:overlap=mem,load,LT,mem,load,IF
Le operazioni sono definite secondo una sintassi un po’ oscura nota
come
RPL, che prevede che i dati vengano scritti prima delle operazioni: ad
esempio l’operazione ‘5*4’ viene scritta ‘5,4,*’.Il dato load120 è la
media
fatta su 120 secondi del dato ‘load’, e viene infatti espressa da load,
120, TREND, dove l’operazione TREND è proprio l’andamento medio.
Il dato mem 70 rappresenta il 70% della media, che si calcola secondo
la formula (mem*70)/100; scritta in sintassi RPL questa formula diviene
mem,70,*,100,/; allo stesso modo definiamo il 5% della memoria, mem5.
Lo scopo di questi dati diverrà chiaro tra breve. L’ultimo dato
prodotto è
overlap, che rappresenta l’area in cui i dati mem e load si
sovrappongono;
tale calcolo è in realtà molto semplice: è sufficiente prendere il dato
minore tra i due; l’espressione RPL mem,load,LT,mem,load,IF è
traducibile
con IF mem LT load THEN mem ELSE load, dove l’operazione
LT significa ‘minore di’. Una volta definiti i dati su cui costruire il
grafico
possiamo passare a definire gli elementi grafici:
LINE1:mem#53853e:Memory
LINE1:load#8792a6:CPULoad
LINE1:load120#2f66cb:CPULoadTrend
Le tre quantità mem, load e load120 vengono disegnate sul grafico ciascuna
con una linea di spessore 1 pixel (LINE1) e di colore variabile, rispettivamente
#53853e, #8792a6 e #2f66cb. Contestualmente viene creata
una legenda con le etichette indicate nell’ultimo campo. Il dato load120
viene rappresentato, oltre che da una linea colorata, anche da un’area,
tramite il semplice comando AREA:load120#aecbff, che riempie l’area
uniformemente con il colore #aecbff.
L’area sottostante il dato mem, invece, viene colorata con un colore che
sfuma verso il bianco, e questo è ottenuto nel modo seguente: viene riempita
di bianco l’area sottostante il dato mem70, che rappresenta il 70
percento dell’area totale di mem. Successivamente viene riempita 6 volte
l’area pari al 5 percento del totale, impilandola su quella precedente, e
raggiungendo quindi il 100%; ogni area del 5% viene colorata con un
colore più scuro, in modo da dare l’illusione della sfumature; ovviamente
maggiore è il numero di dati impilati, maggiore sarà l’effetto di sfumatura
ottenuto.
AREA:mem70#ffffff AREA:mem5#fbfff9::STACK
AREA:mem5#f2ffec::STACK AREA:mem5#e9ffe0:
:STACK AREA:mem5#deffd0::STACK AREA:mem5#d4ffc1
::STACK AREA:mem5#c8ffb0::STACK
Gli ultimi parametri passati sulla riga di comando sono l’istante di inizio
e di fine del grafico, espressi rispettivamente da ‘-1h’ e da ‘N’, ovvero da
un’ora fa e dal momento attuale, e le dimensioni minime del grafico da
produrre, in questo caso 800x400. Il primo script si occupa di creare ed
aggiornare il nostro database; il funzionamento è molto semplice, si tratta
di un grande ciclo while in cui i dati vengono letti ed inseriti nel database.
Ma adesso passiamo all’analisi dello script:
[01-02] Dopo l’intestazione che comunica al sistema con quale programma
eseguire lo script definiamo una variabile contenente il nome del file che
ospiterà il nostro database Round Robin.
[03-04] Se il file è già presente lo
cancelliamo e provvediamo a crearne uno nuovo: questo comportamento
permette di essere certi che il database che aggiorneremo sia costruito in
modo da ospitare proprio i dati che vogliamo. Il database viene creato con
la riga di comando che abbiamo descritto precedentemente.
[05] Leggiamo
la memoria totale disponibile sul sitema dal file /proc/meminfo; ricordiamo
che il filesystem /proc è un punto di accesso alle strutture interne del
kernel, e che quindi, tra le altre cose, fornisce informazioni sullo stato della
macchina.
[06] Questo grande ciclo while non termina mai, e contiene tutte
le istruzioni necessarie a leggere i dati che ci interessano e ad inserirli nel
database.
[09-10] La quantità di memoria utilizzata è estratta dal filesystem /
proc e calcolata mediante una semplice operazione con il programma bc.
[11-
12] Il carico della CPU è sempre un parametro mediato, in quanto la CPU
è unica e può quindi essere solo scarica o completamente occupata. Il filesystem
/proc fornisce le medie dell’ultimo minuto, di 5 e di 10 minuti: si è
arbitrariamente scelto di leggere la media sugli ultimi 5 minuti, ma il lettore
è libero di modificare tale comportamento. Il carico di CPU è sempre dato in
percentuale tra 0 e 1, pertanto è sufficiente moltiplicare per 100 per ottenere
la percentuale effettiva.
[14-15] Il database viene poi aggiornato come si è
visto precedentemente e, dopo un attesa di 10 secondi, il ciclo riprende.
Crea un grafico con i dati
graph.sh