Tesi di Luca Armani
6
Il capitolo 1 tratta in generale il tema del monitoring, quali obiettivi si
ponga, quali tecniche utilizzi e su quali parametri si possa stabilirne la
bontà.
Il capitolo 2 tratta più dettagliatamente il problema del monitoring
delle risorse, con particolare riferimento alle risorse fisiche di una macchina
e a come queste vengano gestite dai sistemi operativi.
Il capitolo 3 presenta una panoramica della tecnologia Java, cercando
di approfondire la comprensione dei meccanismi e degli strumenti che
possono essere di ausilio per il controllo delle risorse.
Il capitolo 4 stabilisce le specifiche del monitor che si intende
realizzare: viene spiegato il suo funzionamento ed è presentata l’interfaccia
del prototipo.
Il capitolo 5 documentata i dettagli tecnici che hanno permesso - ma
anche vincolato - la reale implementazione del progetto.
Il capitolo 6 applica il sistema di monitoraggio ad un caso reale,
ovvero il sistema ad agenti SOMA sviluppato dall’Università di Bologna.
Tesi di Luca Armani
7
Capitolo 1
Monitoring
1.1 Generalità
Per monitor si intende un sistema, locale o distribuito, software o
hardware, che raccolga informazioni su un sistema da osservare detto
target. Tali informazioni sono rilevate da un apparato di sensori. Compito
del monitor è quello di trasformare questi dati in una forma comprensibile,
darne una visualizzazione significativa a seconda degli scopi proposti ed
eventualmente intraprendere delle azioni (callback) per correggere o
migliorare le prestazioni del sistema monitorato.
In figura 1.1 è riportato lo schema di funzionamento di un monitor. Le
misure condotte sul sistema target permettono al monitor di conoscerne lo
stato; inoltre, fissate certe proprietà di funzionamento, il monitor può
intraprendere delle azioni (sulla configurazione del sistema o sui suoi
ingressi) atte ad ottenere il funzionamento voluto [Coc95].
Si analizzeranno dapprincipio gli scopi che un monitor si prefigge di
raggiungere e le caratteristiche salienti da tenere in considerazione per
realizzare le specifiche richieste. Parallelamente, si darà una classificazione
dei sistemi di monitoraggio mettendo in luce vantaggi e svantaggi di
Figura 1.1: schema di funzionamento di un monitor
carico
configurazione
Sistema
da
monitorare
Monitor
azioni
Tesi di Luca Armani
8
ciascuna scelta di progetto.
1.2 Obiettivi
Gli scopi che spingono allo sviluppo di un monitor sono molteplici, e
ciò giustifica il campo vastissimo in cui oggi sono impiegati i sistemi di
monitoraggio. Per fare alcuni esempi basti citare il controllo di dispositivi
industriali in previsione di guasti, la registrazione e verifica di transazioni
commerciali, gli strumenti per amministrare intere reti informatiche, i
sistemi che regolano il traffico di aerei e treni, e così via.
In definitiva è possibile riassumere le funzioni di un monitor nelle
seguenti, che saranno analizzate in dettaglio [Sch95]:
• controllo della correttezza;
• controllo delle prestazioni;
• affidabilità;
• sicurezza;
• testing e debugging;
1.2.1 Controllo della correttezza
È importante verificare che un’applicazione risponda effettivamente
alle specifiche formali secondo le quali è stata progettata. In questo senso
un monitor che controlli periodicamente la correttezza e la consistenza dello
stato dell’applicazione può risultare utilissimo, perché è in grado di trovare
eventuali errori runtime o violazioni dei requisiti del programma dovute ad
altre cause. Un esempio può essere costituito da applicazioni di ricerca
scientifica, in cui è importante garantire l’attendibilità dei risultati.
1.2.2 Controllo delle prestazioni
In sistemi che richiedono alti livelli di performance, con utilizzo
intensivo delle risorse fisiche, è spesso presente un monitor che controlla
l’allocazione di tali risorse e provvede, all’insorgere di un calo delle
Tesi di Luca Armani
9
prestazioni, alla riconfigurazione dinamica dell’intero sistema. Un esempio
è costituito da un monitor che garantisca del load-balancing in una
sottorete, cioè un’ottimizzazione del carico di lavoro su ciascun nodo.
Spesso più semplicemente sono presenti soltanto strumenti di
visualizzazione, e il compito della riconfigurazione viene demandato ad un
operatore umano.
1.2.3 Affidabilità
In numerosi sistemi è richiesto un alto grado di affidabilità, cioè deve
essere assicurata la continuità di funzionamento della macchina a fronte di
eventuali guasti. Un monitor può ben assolvere questo compito analizzando
lo stato del sistema target: ogni malfunzionamento deve essere rilevato e
notificato con un allarme, inoltre deve essere intrapresa un’azione che
corregga o argini l’errore permettendo il proseguimento dell’esecuzione del
programma in condizioni controllate. Ad esempio, nell’ambito delle
applicazioni distribuite spesso esiste un controllore che assicura che la
caduta di un nodo non pregiudichi il funzionamento del resto del sistema.
1.2.4 Sicurezza
Per sicurezza si intende il controllo delle autorizzazioni ad eseguire
una data operazione. In numerosi sistemi infatti non tutti gli utenti hanno i
diritti per eseguire determinate azioni. È quindi necessario un monitor che
prevenga eventuali accessi illegali o altre violazioni della sicurezza,
impedendo che il sistema risulti corrotto. Un esempio lampante sono le
registrazioni delle transazioni commerciali.
1.2.5 Testing e debugging
Storicamente la funzione di testing e debugging è stato il motivo per
cui sono nati i monitor. Il controllo in profondità di ogni singola azione del
sistema target si rende necessario per trovare, tra le linee di codice,
Tesi di Luca Armani
10
eventuali errori di programmazione. Ogni linguaggio che si rispetti è
sempre corredato da un debugger che permette di analizzare il
comportamento del programma istruzione per istruzione.
1.3 Classificazione
Un monitor può essere classificato sotto diversi aspetti, tra loro
indipendenti. È utile adottare precisi criteri di classificazione per ogni
sistema di monitoraggio perché ognuno di essi, oltre a tracciare le
specifiche di quel particolare monitor, permette anche di delinearne
l’architettura in relazione al tipo di misurazione che vogliamo ottenere. Nei
prossimi paragrafi saranno trattati i seguenti aspetti del monitoring:
• sensori;
• raccolta delle informazioni;
• livello di astrazione;
• analisi dei dati;
• sincronizzazione;
• topologia.
1.3.1 Sensori
I sensori sono gli elementi che recuperano le informazioni all’interno
del sistema, e per questo sono anche detti sonde. Costituiscono la parte più
a basso livello di un monitor, perché spesso sono a contatto con i dettagli
fisici del sistema studiato. Possono essere di vario tipo, in particolare:
• Sensori hardware. Sono dispositivi fisici aggiunti alla piattaforma del
sistema target, ad esempio trasduttori o microchip elettronici
direttamente cablati sul dispositivo che controllano. Sono modestamente
intrusivi, ossia non interferiscono con la naturale esecuzione del sistema,
tuttavia i dati forniti sono a bassissimo livello, spesso semplici stream di
bit. Chiaramente questo tipo di soluzione non è portabile, in quanto tali
sensori dipendono strettamente dalla piattaforma a cui sono connessi.
Tesi di Luca Armani
11
• Sensori software. Sono realizzati mediante linee di codice aggiunte al
programma monitorato; in ultima analisi le misurazioni sono fatte dal
sistema operativo che risiede sulla macchina ospite. Questa soluzione
offre il vantaggio di presentare i dati ad un più alto livello di astrazione,
aumentando così la flessibilità. Per contro si deve far fronte ad un
overhead, ossia parte del tempo di esecuzione è dedicata al
monitoraggio e l’applicazione risulta così rallentata.
1.3.2 Raccolta delle informazioni
Fra le varie strategie per raccogliere le informazioni si possono
distinguere due tipi di approccio, comunemente definiti orientato agli eventi
e orientato ai tempi.
• Event driven. L’approccio orientato agli eventi consiste nel rilevare la
misura a fronte di un evento interno al sistema. Per evento si può
intendere un messaggio, un segnale, un fault, o qualunque altra cosa che
dia una visione più legata al funzionamento “logico” del sistema target.
• Time driven. La raccolta delle informazioni avviene in corrispondenza
di determinati istanti di tempo, ad esempio ad intervalli regolari. Una
frequenza di campionamento molto alta può garantire una migliore
definizione dei dati raccolti, tuttavia sarà anche maggiore l’intrusione
del monitor stesso, in quanto la misurazione interromperà più
frequentemente l’applicazione misurata. Questo tipo di approccio si
presta più per una visione statistica del sistema target, in quanto ne
raccoglie lo stato a prescindere dal modello di funzionamento.
1.3.3 Livello di astrazione
È importante stabilire il livello di astrazione a cui si devono presentare
i dati, perché ciò definisce l’interfaccia che deve avere il monitor verso
l’esterno e il dettaglio con cui le informazioni sono fornite. Un sistema di
monitoraggio può dunque collocarsi su uno dei seguenti livelli [Sch95]:
Tesi di Luca Armani
12
• Livello fisico. Il monitor osserva attività di basso livello, cioè
strettamente legate ai dettagli tecnici o ai dispositivi fisici del sistema
monitorato. Ad esempio può essere interessante monitorare su un
computer il numero di page fault, o la coda di accesso al disco, e così
via: queste informazioni sono generalmente destinate ad un operatore
umano esperto del sistema, e sono utili per una corretta configurazione
delle risorse.
• Livello di supporto. Il monitor osserva quelle attività che riguardano
l’ambiente in cui esegue l’applicazione monitorata. Ad esempio si
possono misurare il numero di chiamate di sistema o di altri servizi
messi a disposizione dal sistema operativo. Questo serve per mantenere
un’attività di management sul sistema: si assicura che tutte le
applicazioni interagiscano nel modo corretto con il supporto, e che
questo gestisca in modo controllato le comunicazioni inter-applicazione
e fra applicazione e risorse.
• Livello di applicazione. Il monitor osserva l’esecuzione interna di una
applicazione, verifica che il funzionamento sia corretto e che lo stato
rimanga comunque consistente. Ad esempio si può tenere traccia del
valore di una variabile. Questo tipo di monitoraggio è volto ad assistere
l’applicazione in operazioni considerate critiche.
Quasi sempre questi tre aspetti convivono, e viene messo in evidenza
l’uno o l’altro a seconda della visibilità desiderata dall’utilizzatore finale
del sistema di monitoraggio.
1.3.4 Analisi dei dati
Nel progetto di un sistema di monitoraggio è importante definire il
momento in cui i dati raccolti verranno effettivamente visualizzati e/o
analizzati, perché ciò si ripercuote sul tipo di utilizzo che si intende fare del
monitor. In generale si possono realizzare due tipi di strategia: on-line o off-
line.
Tesi di Luca Armani
13
• Monitor on-line. Le informazioni sono rese disponibili durante
l’esecuzione dell’applicazione stessa, dimodochè è possibile
un’interazione dinamica tra monitor e sistema monitorato. È ovviamente
il caso più interessante perché offre la possibilità di sfruttare
immediatamente le azioni automatiche del monitor. Spesso in questi casi
il monitoraggio è parte integrante del sistema, cosicché risulta difficile
quantificare il reale overhead introdotto in termini di tempo di
esecuzione.
• Monitor off-line. La raccolta delle statistiche dell’applicazione è fatta
post-mortem, cioè al termine di una sessione del sistema target.
Tipicamente questo tipo di soluzione ha una funzione di logging, cioè
tutti gli eventi vengono registrati in modo che successivamente sia
possibile ripercorrere la storia del funzionamento del sistema.
1.3.5 Sincronizzazione
Il monitoraggio può essere sincrono o asincrono, a seconda del tipo di
coordinazione che si vuole ottenere tra il sistema target e il monitor stesso.
• Controllo sincrono. Le linee di codice del monitor vengono inserite
direttamente nel codice dell’applicazione: esse rappresentano dei forti
vincoli che il programma deve soddisfare per poter proseguire
l’esecuzione. Il monitor è dunque parte integrante dell’applicazione e ne
controlla il corretto funzionamento man mano che questa procede,
impedendole di eseguire operazioni non concesse.
• Controllo asincrono. Il monitor è tipicamente un processo esterno che
ispeziona l’applicazione da monitorare in corrispondenza di determinati
istanti di tempo o eventi. Questo meccanismo realizza dei vincoli molto
meno stringenti, in quanto l’applicazione è indipendente dal monitor e
può proseguire la sua esecuzione prima che il monitor stesso abbia il
tempo di lanciare un eventuale allarme. In generale questo tipo di
controllo è più flessibile e trasparente, perché lascia più autonomia al
Tesi di Luca Armani
14
sistema monitorato e consente al monitor di essere facilmente
aggiornato.
1.3.6 Topologia
La struttura dell’entità da monitorare decide quale dovrà essere la
topologia del monitor che compie le osservazioni. La maggiore distinzione
si ha certamente fra monitor locali e distribuiti.
• Monitor locale. Per monitor locale intendiamo un monitor che raccoglie
informazioni su una applicazione che esegue sulla stessa macchina. Un
esempio è rappresentato da un programma che misura l’utilizzo della
CPU.
• Monitor distribuito. Un monitor distribuito raccoglie informazioni su un
insieme di nodi collegati in rete, e presenta informazioni aggregate che
descrivono in sintesi lo stato dell’intero sistema. Un tipico esempio è un
sistema software che permette l’amministrazione remota di una
sottorete.
1.4 Caratteristiche
Finora si è parlato delle specifiche di un monitor in funzione degli
scopi che si prefigge di raggiungere; tali specifiche decidono in larga parte
la natura del monitor. Tuttavia esiste una serie di caratteristiche che un
monitor realizza in minore o maggiore misura a seconda di alcune sue
grandezze e parametri tipici. Questo concetto è più facilmente
comprensibile dal punto di vista pratico: infatti, prima di realizzare un
prototipo che effettivamente implementi le specifiche desiderate, bisogna
quantificare il grado di completezza, osservabilità, intrusione e correttezza
che tale monitor deve avere nei confronti del sistema monitorato. Questi
problemi di dimensionamento, tipicamente ingegneristici, ed altre
considerazioni, verranno trattati nel seguito.
Tesi di Luca Armani
15
1.4.1 Completezza
Per completezza si intende la capacità di esprimere, da parte di un
insieme di eventi, la totalità degli stati di una applicazione. Appare non
impossibile, ma particolarmente oneroso, cercare di rappresentare tutti gli
stati in cui un’applicazione si può trovare. Ciò si tradurrebbe in una mole di
informazioni molto grande e difficile da trattare, la cui elaborazione
graverebbe troppo sul tempo di esecuzione del sistema. Generalmente un
monitor cercherà di ridurre lo spazio degli stati alle sole situazioni
interessanti, in modo da raggiungere un giusto compromesso tra
significatività delle informazioni e loro dimensione.
1.4.2 Osservabilità
Una delle peculiarità di un monitor è quella di riuscire ad osservare
interamente tutti gli eventi di interesse del sistema monitorato senza
perderne alcuno; in tal caso si dice che il sistema è completamente
osservabile. Questo aspetto evidentemente dipende dalle prestazioni del
monitor stesso, cioè dai suoi tempi caratteristici. Con riferimento alla figura
1.2 si definiscono:
• Delay Time (DT). È il ritardo con cui il monitor notifica un evento,
ossia il tempo che intercorre tra il verificarsi di un evento e il suo
riconoscimento.
• Reaction Time (RT). È il tempo che il monitor impiega per dare il via ad
Figura 1.2: tempi caratteristici di un monitor
eventevent
time
DT RT AT
CT
Tesi di Luca Armani
16
un’azione. Questo tempo è tanto maggiore quanto più è complesso
l’algoritmo che calcola il nuovo stato e decide quale azione eseguire.
• Action execution Time (AT). È il tempo di durata dell’azione, che
dipende strettamente dalla natura del problema.
• Cycle Time (CT). È la somma dei precedenti.
Il cycle time indica il “potere risolutivo” del monitor, cioè la minima
distanza che due eventi possono avere affinché il monitor riesca a
distinguerli. Se infatti un evento si manifesta dopo un tempo t<CT rispetto
al precedente il monitor non è in grado di rilevarlo: l’evento è perso e il
sistema non è più completamente osservabile. Cercare di minimizzare
questi tempi caratteristici significa trovare un’implementazione quanto più
efficiente per le sonde e il codice del monitor.
1.4.3 Intrusione
Un sistema di monitoring presuppone sempre una intrusione nel
sistema monitorato. Per il principio di Heisenberg, secondo il quale
qualsiasi misurazione influenza l’entità misurata, il programma osservato
subisce un overhead da parte dello stesso monitoraggio. Quanto contino
queste perturbazioni dipende dal tipo di sonde del monitor (risorse dedicate
possono limitare l’intrusione), dal grado di precisione delle misurazioni e
dall’efficienza degli algoritmi. In particolare non si può più prescindere da
quest’ultimo punto, tanto che la bontà di un progetto si misura spesso
dall’efficienza e correttezza dell’implementazione. Da questo punto di vista
la scelta del linguaggio e delle risorse da utilizzare risulta fondamentale.
Di diverso tipo ovviamente risulta l’intrusione delle azioni (callback)
a fronte di particolari condizioni: tale intrusione è infatti volontaria ed è uno
degli scopi del monitor, ciononostante va detto che è comunque
un’alterazione - controllata - del naturale svolgimento del programma
monitorato.
Tesi di Luca Armani
17
1.4.4 Correttezza
Per correttezza intendiamo una caratteristica generale del monitor, che
in definitiva dipende da una buona caratterizzazione dei tre punti
precedenti.
Paradossalmente gli stessi problemi che affliggono l’applicazione
monitorata possono verificarsi sul monitor: come qualsiasi sistema software
esso può essere non corretto, e in taluni casi quindi può succedere che non
venga riportata una condizione d’allarme vera, o che invece si riporti come
errato un funzionamento corretto. Ciò può succedere perché:
• un evento è stato perso per scarsa osservabilità del sistema;
• uno stato del sistema monitorato è stato interpretato in modo sbagliato,
per scarsa espressività o per un errore nell’algoritmo;
• non si sono valutate attentamente possibili condizioni di errore.
Si deve fare particolarmente attenzione a questi tipi di errore perché
spesso, per alcune esecuzioni “fortunate”, non lasciano traccia, facendo
credere che il sistema sia robusto: è il caso di alcuni fenomeni di deadlock
che si verificano solo in concomitanza di particolari circostanze, che
devono però essere assolutamente evitate.
1.5 Considerazioni
In questo capitolo si è definito che cosa sia un monitor e quali
funzioni svolga. Si sono delineate le sue caratteristiche e gli aspetti che le
possono influenzare.
Progettare un buon monitor significa definire le specifiche del
problema, trovare delle tecniche di soluzione adeguate e sviluppare delle
implementazioni corrette ed efficienti. Una giusta regolazione dei parametri
caratteristici del monitor consente infine di ottenere i massimi benefici sul
sistema monitorato.