Università degli Studi di Napoli Federico II - Scope
Università degli Studi di Napoli Federico II - Scope
Università degli Studi di Napoli Federico II - Scope
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Università</strong> <strong>degli</strong> <strong>Stu<strong>di</strong></strong> <strong>di</strong> <strong>Napoli</strong> <strong>Federico</strong> <strong>II</strong><br />
Facoltà <strong>di</strong> Scienze MM.FF.NN.<br />
Corso <strong>di</strong> Laurea in Informatica<br />
Tesi Sperimentale <strong>di</strong> Laurea Magistrale<br />
Integrazione in un portale LIFERAY <strong>di</strong> un sistema <strong>di</strong><br />
accounting <strong>di</strong> code batch in ambito GRID.<br />
Relatore<br />
Can<strong>di</strong>dato<br />
Ch.mo Prof. Guido Russo Dott. Tommaso Foglia<br />
Dott. Domenico del Prete Matricola: 961/147<br />
Correlatore<br />
Ch.mo Prof. Adriano Peron<br />
Anno accademico 2010/2011
...
In<strong>di</strong>ce generale<br />
Introduzione..........................................................................................................................1<br />
1 Sistemi <strong>di</strong>stribuiti e griglie computazionali.........................................................................2<br />
1.1I Sistemi Di Calcolo Distribuito WAN...........................................................................2<br />
1.2 I Punti Forti Delle Griglie............................................................................................6<br />
1.2.1 Le Organizzazioni Virtuali per gli esperimenti...........................................6<br />
1.2.2 Stabilità e tolleranza ai guasti...................................................................7<br />
1.2.3 Bilanciamento e con<strong>di</strong>visione delle risorse...............................................8<br />
1.2.4 Elaborazione parallela e <strong>di</strong>stribuita...........................................................8<br />
1.2.5 Affidabilità del servizio...............................................................................9<br />
1.3 Le Problematiche Nell'acquisizione Dei Dati Su Applicazioni Di Monitoraggio<br />
Distribuite.......................................................................................................................11<br />
2 L'infrastruttura dei Datacenter <strong>di</strong>stribuiti dell'esperimento ATLAS..................................15<br />
2.1 Topologia Del Centro ...............................................................................................15<br />
2.2 Il Centro Di Calcolo Dell'INFN Di <strong>Napoli</strong> ..................................................................18<br />
2.2.1 Le tecnologie del DataCenter .................................................................18<br />
3 L'importanza delle informazioni a livello LRMS...............................................................22<br />
3.1 Le Caratteristiche Del Servizio.................................................................................22<br />
3.2 Le Informazioni Fornite Dai Batch System...............................................................30<br />
3.3 Esempi Di Batch System: PBS E LFS......................................................................35<br />
4 La modularità del portale <strong>di</strong> monitoraggio del Tier2 <strong>di</strong> <strong>Napoli</strong>.........................................44<br />
4.1 Organizzazione Dei Servizi......................................................................................44<br />
4.2 Struttura Di Un Portale.............................................................................................46<br />
4.2.1 Java Portlet e Portlet Container..............................................................46<br />
4.3 Un'esempio Di Enterprice Portal: Liferay..................................................................51<br />
5 Progettazione <strong>di</strong> un sistema per il monitoraggio dello stato delle code...........................54
5.1 Raccolta Dei Requisiti E Casi D'uso. .......................................................................55<br />
5.2 Analisi Del Prototipo E Degli Strumenti Già Esistenti...............................................64<br />
5.3 Design Del Sistema Ed Implementazione Dei Requisiti Funzionali .........................69<br />
5.4 Requisiti Non Funzionali...........................................................................................86<br />
5.5 Class Diagram..........................................................................................................92<br />
6 Conclusioni e sviluppi futuri.............................................................................................96<br />
7 Bibliografia e Sitografia....................................................................................................97<br />
Appen<strong>di</strong>ce A.......................................................................................................................99<br />
Appen<strong>di</strong>ce B.....................................................................................................................127<br />
Appen<strong>di</strong>ce C.....................................................................................................................144
Introduzione<br />
Nell'ambito delle architetture <strong>di</strong>stribuite multilivello, il monitoraggio ha ricoperto<br />
negli anni un ruolo sempre più importante. Con lo scopo <strong>di</strong> voler garantire un servizio<br />
affidabile, si <strong>di</strong>ffondono sempre più sistemi capaci <strong>di</strong> poter mostrare la situazione<br />
delle risorse monitorate in tempo reale in modo da poter rilevare anche i guasti e i<br />
malfunzionamenti.<br />
Partendo dalle informazioni che provengono dal monitoraggio delle componenti ai<br />
vari livelli, si vuole automatizzare la possibilità <strong>di</strong> carpire imme<strong>di</strong>atamente quante più<br />
informazioni possibili sul reale stato delle risorse che vengono monitorate.<br />
Il lavoro <strong>di</strong> tesi <strong>di</strong> laurea ha riguardato lo sviluppo <strong>di</strong> un'applicazione web,<br />
integrabile in un portale LIFERAY, partendo dalla razionalizzazione e<br />
dall'ampliamento delle funzionalità <strong>di</strong> un prototipo precedentemente sviluppato.<br />
Nei primi capitoli vengono descritte le architetture <strong>di</strong>stribuite multilivello, il<br />
para<strong>di</strong>gma GRID e gli apparati oggetto dell'attività <strong>di</strong> monitoraggio. Successivamente<br />
vengono valutate le informazioni che è possibile reperire a livello LRMS. Si<br />
esaminano le informazioni che provengono dai batch system e vengono presi in<br />
considerazione principalmente quelli <strong>di</strong> due tipi: PBS e LSF.<br />
Viene poi descritto il portale <strong>di</strong> monitoraggio in cui verrà integrata l'applicazione.<br />
Descritto l'ambiente <strong>di</strong> riferimento, si è passati alla progettazione dell'applicazione<br />
web. Dalla raccolta dei requisiti, all'implementazione, passando per la scelta delle<br />
tecnologie da utilizzare, sono illustrate tutte le fasi del processo <strong>di</strong> realizzazione.<br />
L'applicazione ha lo scopo <strong>di</strong> voler fornire, tramite interfaccia web, le informazioni<br />
relative allo stato <strong>di</strong> utilizzo delle code batch. In tempo reale avviene la realizzazione<br />
<strong>di</strong> grafici che permettono, appunto, <strong>di</strong> poter monitorare l'occupazione delle code.<br />
Inoltre tramite interazione è possibile navigare le informazioni secondo <strong>di</strong>versi criteri<br />
<strong>di</strong> aggregazione. Una storicizzazione dei dati permette <strong>di</strong> ricostruire lo stato <strong>di</strong><br />
occupazione delle code, rendendo così <strong>di</strong>sponibili nel tempo le informazioni.<br />
Tommaso Foglia 961/147 Pagina 1 <strong>di</strong> 150
1 Sistemi <strong>di</strong>stribuiti e griglie computazionali<br />
1.1 I sistemi <strong>di</strong> calcolo <strong>di</strong>stribuito WAN<br />
I sistemi <strong>di</strong> Griglie Computazionali sono emersi come importante sinonimo per i<br />
sistemi ad alte prestazioni HTC(High Throughput Computing). Contrariamente a<br />
questi sistemi, dove l'obiettivo era raggiungere un risultato performante in termini <strong>di</strong><br />
operazioni floating point che il sistema poteva elaborare al minuto, l'importanza delle<br />
griglie è definita in termini <strong>di</strong> quantità <strong>di</strong> lavoro che sono in grado <strong>di</strong> portare a<br />
termine in un periodo <strong>di</strong> tempo.<br />
Le griglie non possono essere considerate a tutti gli effetti una tecnologia<br />
rivoluzionaria. La loro nascita scaturisce dall'evoluzione <strong>di</strong> tecnologie già esistenti<br />
come il calcolo <strong>di</strong>stribuito, i web service, internet e da varie tecnologie <strong>di</strong> crittografia<br />
che provvedevano alla sicurezza e alla virtualizzazione.<br />
Ognuna <strong>di</strong> queste aveva il suo proprio utilizzo. Le griglie prendono spunto da queste<br />
tecnologie per sviluppare un sistema che fornisca risorse computazionali per qualche<br />
scopo specifico.<br />
I campi <strong>di</strong> applicazione possono essere i più <strong>di</strong>sparati. Ricerche <strong>di</strong> marketing e<br />
ricerche scientifiche sono solo alcuni esempi <strong>di</strong> utilizzo per organizzazioni che hanno<br />
una presenza <strong>di</strong>stribuita geograficamente. Le griglie sono quin<strong>di</strong> una tecnologia<br />
evolutiva che migliorando quella esistente, provvedono a fornire alte prestazioni.<br />
Una delle parole chiave che racchiude le motivazioni <strong>di</strong>etro l'evoluzione dei sistemi<br />
<strong>di</strong> griglie è “virtualizzazione”. Virtualizzazione che nelle griglie si riferisce<br />
all'integrazione dei sistemi eterogenei e geograficamente <strong>di</strong>stribuiti. Questo permette<br />
agli utenti <strong>di</strong> fare un uso dei servizi forniti dalla griglia in modo trasparente.<br />
Tommaso Foglia 961/147 Pagina 2 <strong>di</strong> 150
Non c'è bisogno che l'utente sia a conoscenza della <strong>di</strong>slocazione delle risorse<br />
computazionali. Così, dal punto <strong>di</strong> vista dell'utente, c'è un solo punto <strong>di</strong> accesso al<br />
sistema. Essi dovranno solo sottoporre le loro richieste a questo nodo. Sarà compito<br />
del sistema a griglia <strong>di</strong> trovare risorse computazionali <strong>di</strong>sponibili che potranno<br />
sod<strong>di</strong>sfare le richieste <strong>degli</strong> utenti.<br />
Si definisce VO(Virtual Organizzation) un raggruppamento <strong>di</strong>namico <strong>di</strong> <strong>di</strong>verse<br />
organizzazioni che provvedono al coor<strong>di</strong>namento delle risorse con<strong>di</strong>vise. La<br />
formazione <strong>di</strong> queste organizzazioni è volta all'utilizzo delle risorse computazionali<br />
per la soluzione <strong>di</strong> problemi specifici. Basandoci sul concetto <strong>di</strong> VO è possibile<br />
in<strong>di</strong>viduare tre termini per meglio comprendere il significato dei sistemi a griglie.<br />
Il primo termine è “virtualizzazione” <strong>di</strong> cui abbiamo già parlato. Il secondo è<br />
“eterogeneo” . Quando parliamo <strong>di</strong> VO, dovrebbe implicare che stiamo parlando <strong>di</strong><br />
un'entità multi-istituzionale. Le organizzazioni che prendono parte ad una VO<br />
generalmente potrebbero avere <strong>di</strong>fferenti risorse in termini <strong>di</strong> hardware, <strong>di</strong> sistemi<br />
operativi e <strong>di</strong> velocità <strong>di</strong> collegamento, per questo affermiamo che una VO è una<br />
collezione <strong>di</strong> risorse eterogenee.<br />
La terza parola è “<strong>di</strong>namico”. Un'organizzazione può unirsi ad una VO o lasciarla per<br />
sua convenienza o necessità. Per questo una VO è un'entità <strong>di</strong>namica.<br />
Questo spiega come mai le griglie hanno delle caratteristiche specifiche se comparate<br />
ad altri sistemi <strong>di</strong>stribuiti. Una griglia dovrebbe provvedere una coor<strong>di</strong>nazione delle<br />
risorse meno centralizzata, basata su <strong>degli</strong> standard con<strong>di</strong>visi e fornire una qualità del<br />
servizio elevata.<br />
Una griglia può essere utilizzata per scopi computazionali(griglie computazionali),<br />
per la memorizzazione <strong>di</strong> dati su larga scala(griglie <strong>di</strong> dati), oppure una combinazione<br />
<strong>di</strong> entrambe.<br />
Tommaso Foglia 961/147 Pagina 3 <strong>di</strong> 150
Figura 1: Esempio <strong>di</strong> elementi componenti una griglia computazionale.<br />
I sistemi <strong>di</strong>stribuiti generalmente sono utilizzati da una singola organizzazione ed<br />
hanno controllo centralizzato. Di contro, le griglie non hanno controllo centralizzato e<br />
vengono utilizzati per scopi <strong>di</strong> un grande numero <strong>di</strong> organizzazioni. Come detto, una<br />
griglia è definita da parole chiavi come eterogeneo, <strong>di</strong>namico e virtualizzazione. I<br />
sistemi <strong>di</strong>stribuiti possono avere risorse eterogenee ma il concetto <strong>di</strong> eterogeneo è<br />
limitato ad una sola organizzazione, mentre nelle griglie sono composte da risorse<br />
eterogenee <strong>di</strong> svariate organizzazioni.<br />
I sistemi <strong>di</strong>stribuiti spesso focalizzano l'attenzione sulla con<strong>di</strong>visione delle<br />
informazioni, basandosi sul modello client-server. Nelle griglie la con<strong>di</strong>visione non è<br />
soltanto delle informazioni. Si può estendere alle applicazioni e all'hardware.<br />
Tommaso Foglia 961/147 Pagina 4 <strong>di</strong> 150
Figura 2: Esempio <strong>di</strong> sottomissione <strong>di</strong> un job sulla griglia.<br />
Tecnologie computazionali <strong>di</strong>stribuite permettono la con<strong>di</strong>visione delle informazioni<br />
con una sola organizzazione, mentre le griglie permettono la con<strong>di</strong>visione delle<br />
risorse tra le VO(composte a loro volta da più organizzazioni).<br />
Le griglie supportano l'aggiunta automatica delle risorse e il monitoraggio delle stesse<br />
su larga scala. Questo non è presente nei sistemi <strong>di</strong>stribuiti. Se consideriamo sistemi<br />
decentralizzati come i sistemi peer-to-peer, osserviamo che essi offrono servizi<br />
altamente specializzati che però non badano alla qualità del servizio QoS(Quality of<br />
Service).<br />
Non vi è una nozione <strong>di</strong> azioni permesse o non permesse, come nei sistemi a griglia.<br />
Le griglie e i sistemi peer-to-peer <strong>di</strong>fferiscono inoltre sullo scopo per cui sono state<br />
create, per l'ammontare del traffico <strong>di</strong> dati e per le risorse con<strong>di</strong>vise tra tutte le entità<br />
partecipanti.<br />
Tommaso Foglia 961/147 Pagina 5 <strong>di</strong> 150
1.2 I punti forti delle Griglie<br />
Principalmente si fa riferimento alle griglie in termini <strong>di</strong> VO e in termini <strong>di</strong> sistemi ad<br />
alte prestazioni.<br />
1.2.1 Le Organizzazioni Virtuali per gli esperimenti<br />
Le griglie permettono la collaborazione tra un folto gruppo <strong>di</strong> organizzazioni per la<br />
con<strong>di</strong>visione delle risorse. Questa collaborazione non è limitata allo scambio <strong>di</strong> file<br />
ed implica un accesso <strong>di</strong>retto alle risorse computazionali.<br />
Figura 3: Concetto <strong>di</strong> <strong>di</strong>slocazione geografica della griglia.<br />
I membri delle griglie possono essere <strong>di</strong>namicamente organizzati in più<br />
organizzazioni virtuali. Ognuna <strong>di</strong> queste VO può avere <strong>di</strong>fferenti politiche e<br />
Tommaso Foglia 961/147 Pagina 6 <strong>di</strong> 150
<strong>di</strong>fferenti controlli amministrativi. Tutte le Vo sono parte <strong>di</strong> una grande griglia e<br />
possono con<strong>di</strong>videre le risorse.<br />
Le risorse con<strong>di</strong>vise tra le VO possono essere dati, hardware specializzato, capacità<br />
esecutiva ed informazioni riguardo le altre risorse <strong>di</strong>sseminate sulla griglia.<br />
Le VO nascondono la complessità della griglia all'utente permettendo una<br />
virtualizzazione delle risorse eterogenee della griglia. I membri <strong>di</strong> una griglia<br />
possono prendere parte a più VO contemporaneamente. Inoltre le griglie possono<br />
essere utilizzate per definire delle politiche <strong>di</strong> utilizzo per i membri, potendo dare<br />
priorità sulle risorse per utenti <strong>di</strong>fferenti.<br />
1.2.2 Stabilità e tolleranza ai guasti<br />
Supposto che un utente man<strong>di</strong> in esecuzione un job da un particolare nodo della<br />
griglia. Gli vengono allocale le risorse necessarie in base alla <strong>di</strong>sponibilità e alle<br />
politiche <strong>di</strong> scorrimento della griglia. Se per qualche motivo il nodo su cui è in<br />
esecuzione il job dovesse subire un guasto, la griglia provvederebbe automaticamente<br />
alla risottomissione dello stesso su <strong>di</strong> un altro nodo <strong>di</strong>sponibile.<br />
E' possibile che si verifichi anche un altro caso. Una griglia dati, può essere<br />
considerata come una griglia per elaborare e con<strong>di</strong>videre una larga quantita <strong>di</strong> dati<br />
<strong>di</strong>stribuiti. Una griglia dati può essere utilizzata per più scopi <strong>di</strong>fferenti.<br />
Può essere utilizzata per incrementare la velocità <strong>di</strong> trasferimento dei dati. Diverse<br />
copie dei dati possono essere create in aree <strong>di</strong>stribuite geograficamente. Se un utente<br />
ha bisogno dei dati per un qualsiasi scopo, può essere recuperato dalla macchina più<br />
vicina che ne detiene una copia. Ovviamente questo contribuisce ad un aumento<br />
dell'efficienza. Se alcune macchine dovessero scollegarsi, le altre macchine possono<br />
provvedere le copie <strong>di</strong> backup. Inoltre se è previsto che si faccia accesso più<br />
frequentemente a particolari dati su una macchina, le copie possono essere ospitate su<br />
macchine più vicine ad essa.<br />
Tommaso Foglia 961/147 Pagina 7 <strong>di</strong> 150
Entrambi possono essere considerati esempi <strong>di</strong> virtualizzazione. Nel primo l'utente<br />
non è a conoscenza del guasto e del suo automatico aggiramento. Nel secondo<br />
l'utente accede ai dati senza sapere quale macchina della rete serve la sua richiesta.<br />
1.2.3 Bilanciamento e con<strong>di</strong>visione delle risorse<br />
Il Bilanciamento e la con<strong>di</strong>visione delle risorse sono aspetti importanti delle griglie,<br />
che forniscono le necessarie funzioni <strong>di</strong> gestione delle risorse. Questo aspetto<br />
permette alla griglia <strong>di</strong> <strong>di</strong>stribuire i tasks alle risorse <strong>di</strong>sponibili. In un sistema della<br />
griglia sovraccaricato, l'algoritmo <strong>di</strong> scheduling può ri<strong>di</strong>stribuire tasks su sistemi che<br />
sono inattivi o comunque meno carichi. In questo modo l'algoritmo <strong>di</strong> scheduling<br />
della griglia trasferisce in modo trasparente i tasks ad una macchina meno carica,<br />
ottimizzando l'utilizzo delle risorse meno utilizzate.<br />
1.2.4 Elaborazione parallela e <strong>di</strong>stribuita<br />
Alcuni tasks possono essere <strong>di</strong>visi in più sottotasks, ognuno dei quali può essere<br />
elaborato su una macchina <strong>di</strong>versa. Nell'ambito del calcolo scientifico, della<br />
modellazione matematica, nell'elaborazione <strong>di</strong> immagini o nell'animazione 3D questo<br />
viene molto spesso utilizzato.<br />
Ognuna <strong>di</strong> queste applicazioni può essere scritta per essere eseguita come un singolo<br />
sottotask in<strong>di</strong>pendente, poi, i risultati provenienti da ogni sottotasks possono essere<br />
combinati per produrre l'output desiderato. Ci sono, tuttavia, dei vincoli che limitano<br />
l'utilizzo <strong>di</strong> questa pratica, non tutti i tasks possono essere partizionati in questo<br />
modo. Inoltre c'è un limite nel numero <strong>di</strong> sottotasks in cui un task può essere <strong>di</strong>viso,<br />
facendo da limite superiore al massimo incremento <strong>di</strong> performance raggiungibile.<br />
Se due o più <strong>di</strong> questi sottotasks lavorano sullo stesso insieme <strong>di</strong> strutture <strong>di</strong> dati,<br />
Tommaso Foglia 961/147 Pagina 8 <strong>di</strong> 150
dovrà esistere qualche sistema <strong>di</strong> controllo, come avviene per la concorrenza nei<br />
database o tipo semafori per quanto riguarda i sistemi operativi, per fare in modo che<br />
la struttura dati utilizzata non <strong>di</strong>venti inconsistente. Quin<strong>di</strong> esiste un vincolo sul tipo<br />
<strong>di</strong> tasks che può essere pensato <strong>di</strong> essere mandato in esecuzione sulla griglia ed esiste<br />
inoltre un limite sul poter rendere un'applicazione grid-enabled.<br />
1.2.5 Affidabilità del servizio<br />
Una griglia può essere utilizzata in uno scenario in cui gli utenti possono inviare i<br />
loro jobs ed ottenere l'output, l'utilizzo che gli utenti fanno della grigilia può essere<br />
misurato nel tempo in cui questi vengono completati.<br />
In questo scenario, dove è tenuta una sorta <strong>di</strong> contabilità all'utente per i servizi <strong>di</strong> cui<br />
ha usufruito, è auspicabile che l'utente si aspetti una determinata affidabilità del<br />
sistema. Questo viene specificato in un accordo: Service Level Agreement(SLA).<br />
SLA stabilisce la qualità minima del servizio, della <strong>di</strong>sponibilità delle risorse. SLA<br />
può anche specificare un minimo tempo <strong>di</strong> up-time desiderato del sistema. Le griglie,<br />
come detto, provvedono una tolleranza ai guasti, stabilità e capacita <strong>di</strong> esecuzione in<br />
parallelo per determinati tasks e può essere utilizzato per lo sviluppo <strong>di</strong> sistemi<br />
<strong>di</strong>stribuiti.<br />
La qualità del servizio puo' essere basata sulle richieste dell'utente, in modo che<br />
l'algoritmo <strong>di</strong> scheduling dei tasks possa dare precedenza all'uno o all'altro utente.<br />
Un utente potrebbe avere bisogno dei servizi offerti dalla griglia per un'applicazione<br />
in tempo reale ed ovviamente sarà richiesto un QoS maggiore rispetto agli altri utenti.<br />
Così, l'algoritmo <strong>di</strong> scheduling della griglia potrà dare priorità ai job dell'utente<br />
rispetto agli altri job in esecuzione. Questo fornirà il necessario livello <strong>di</strong> affidabilità<br />
all'applicazione in tempo reale dell'utente.<br />
Una qualità del servizio elevata può essere ottenuta riservando alcune risorse della<br />
griglia per determinati job. Quando queste risorse riservate sono inutilizzate possono<br />
Tommaso Foglia 961/147 Pagina 9 <strong>di</strong> 150
comunicare il loro stato ad un nodo per la gestione delle risorse. Queste possono<br />
essere utilizzate dalla griglia per l'esecuzione <strong>di</strong> altri jobs Non appena arriva una<br />
richiesta da parte dei jobs a priorità maggiore, i job che attualmente utilizzano queste<br />
risorse vengono prelazionati e lasciano subito <strong>di</strong>sponibili le risorse per i job a priorità<br />
maggiore, che erano quelli per qui le risorse erano state riservate.<br />
I job prelazionati vengono posti in una coda <strong>di</strong> job insieme alle informazioni sul loro<br />
completamento. Questi job potranno essere mandati in esecuzione dal job scheduler<br />
qualora ci saranno risorse <strong>di</strong>sponibili sulla griglia.<br />
Anche altri sistemi <strong>di</strong>stribuiti possono fornire queste stesse funzionalità, ma la<br />
<strong>di</strong>fferenza risiede nel fatto che le griglie possono fornire queste funzionalità su un<br />
livello multi-istituzionale e questo permette <strong>di</strong> gestire le risorse <strong>di</strong>stribuite<br />
geograficamente.<br />
I sistemi <strong>di</strong>stribuiti che forniscono queste stesse funzionalità operano generalmente su<br />
livelli organizzativi e hanno un punto <strong>di</strong> controllo centralizzato a <strong>di</strong>fferenza delle<br />
griglie.<br />
Tommaso Foglia 961/147 Pagina 10 <strong>di</strong> 150
1.3 Le problematiche nell'acquisizione dei dati su applicazioni <strong>di</strong> monitoraggio<br />
<strong>di</strong>stribuite<br />
Le risorse messe a <strong>di</strong>sposizione negli ambienti <strong>di</strong>stribuiti, potrebbero non essere<br />
sempre <strong>di</strong>sponibili, o non garantire un corretto funzionamento, e ciò costituisce un<br />
problema per l'utente che ignora la complessità dell'ambiente che usa.<br />
Anche se il modello del para<strong>di</strong>gma Grid non sia fondamentalmente <strong>di</strong>verso dai<br />
tra<strong>di</strong>zionali modelli paralleli e <strong>di</strong>stribuiti, esso è ovviamente complicato da questioni<br />
legate all'eterogeneità dell'ambiente, la multi-istituzionalità, la <strong>di</strong>namicità della<br />
<strong>di</strong>sponibilità e delle configurazioni delle risorse dell'infrastruttura. Risulta <strong>di</strong>fficoltoso<br />
riuscire a garantire stabilità, buone prestazioni e gestione dei problemi in ambienti<br />
talmente <strong>di</strong>namici.<br />
Le problematiche che possono verificarsi sono tra le più <strong>di</strong>sparate: sovraccarichi o<br />
guasti delle risorse, della rete, problemi <strong>di</strong> carattere fisico, che includono problemi <strong>di</strong><br />
alimentazione e raffreddamento, incen<strong>di</strong>, per<strong>di</strong>te, ed altro. Alcune <strong>di</strong> queste minacce,<br />
comprese quelle relative al raffreddamento, all'alimentazione o agli incen<strong>di</strong>, sono<br />
monitorate generalmente da funzioni integrate nei <strong>di</strong>spositivi <strong>di</strong> alimentazione,<br />
raffreddamento e antincen<strong>di</strong>o (è relativamente semplice avere a <strong>di</strong>sposizioni<br />
rilevazioni sulla temperature dell'hardware o sullo stato <strong>di</strong> carica <strong>di</strong> una batteria).<br />
Molto spesso, tali malfunzionamenti sono alla base <strong>di</strong> numerosi problemi <strong>di</strong> gestione<br />
delle infrastrutture che sono a carico <strong>degli</strong> amministratori locali dei sistemi che,<br />
sempre maggiormente, fanno richiesta <strong>di</strong> strumenti <strong>di</strong> monitoraggio, che <strong>di</strong>ventano,<br />
cosi, parte attiva per la gestione: tali strumenti, infatti, da un lato forniscono<br />
informazioni read-only all'utente, dall'altro consentono a chi gestisce l'infrastruttura<br />
<strong>di</strong> ottenere informazioni, che più o meno automaticamente, permettono, in caso <strong>di</strong><br />
problemi, <strong>di</strong> intervenire sulle configurazioni per ripristinare uno stato coerente<br />
dell'infrastruttura.<br />
Il problema del monitoraggio è comune a tutte le infrastrutture <strong>di</strong>stribuite<br />
multilivello. E' necessario in<strong>di</strong>viduare il livello dell'infrastruttura più idoneo a<br />
Tommaso Foglia 961/147 Pagina 11 <strong>di</strong> 150
contenere un sistema <strong>di</strong> monitoraggio che fornisca il “giusto” livello <strong>di</strong> dettaglio in<br />
merito alle informazioni <strong>di</strong> funzionamento delle risorse. L'attenzione si sofferma<br />
principalmente sulle risorse <strong>di</strong> calcolo.<br />
Considerando sistemi <strong>di</strong> calcolo multilivello, è sempre presente un sistema <strong>di</strong><br />
gestione delle risorse che ha il compito <strong>di</strong> offrire, ai livelli superiori, i no<strong>di</strong> <strong>di</strong> calcolo:<br />
tale sistema è un livello comune, il Local Resource Management System (LRMS),<br />
che è in grado <strong>di</strong> reperirne tutte le informazioni <strong>di</strong> funzionamento, occupandosi della<br />
gestione dei no<strong>di</strong> <strong>di</strong> calcolo.<br />
Il WnoDes (Worker Nodes on Demands Service), un software in via <strong>di</strong> sviluppo da<br />
parte dell'INFN (Istituto Nazionale <strong>di</strong> Fisica Nucleare), può essere portato come<br />
esempio <strong>di</strong> con<strong>di</strong>visione <strong>di</strong> risorse <strong>di</strong> calcolo.<br />
Tommaso Foglia 961/147 Pagina 12 <strong>di</strong> 150
Le sue principali caratteristiche sono:<br />
<br />
Virtualizzazione e personalizzazione delle risorse <strong>di</strong> calcolo, con una stretta<br />
integrazione con il servizio LRMS (Local Resource Management System), che<br />
si occupa della gestione delle risorse;<br />
Integrazione completa con le politiche <strong>di</strong> allocazione delle risorse, <strong>di</strong><br />
monitoraggio, <strong>di</strong> accounting e <strong>di</strong> sicurezza già presenti all’interno <strong>di</strong> un Centro<br />
<strong>di</strong> Calcolo, assicurando al contempo la scalabilità e le performance tipiche dei<br />
moderni LRMS;<br />
<br />
Aiutare l'utente nella selezione ed accesso alle risorse attraverso interfacce<br />
Grid re<strong>di</strong>rigendo automaticamente i job mandati in esecuzione;<br />
Si viene a creare un pool <strong>di</strong> risorse virtuali, che l'utente richiede a momento della<br />
richiesta <strong>di</strong> esecuzione della sua applicazione (job).<br />
Tommaso Foglia 961/147 Pagina 13 <strong>di</strong> 150
Il sistema software WnoDes si integra perfettamente con il servizio LRMS e si viene<br />
così a creare un livello <strong>di</strong> Virtual Machines (VM), opportunamente configurate per<br />
sod<strong>di</strong>sfare le richieste dell’utenza, tale livello, gestito dal servizio LRMS.<br />
Ogni richiesta <strong>di</strong> risorse, proveniente da qualsiasi tipo <strong>di</strong> utente, viene trasformata in<br />
maniera trasparente per l’utente in un job sottoposto al LRMS. Ancora una volta, non<br />
si può far a meno <strong>di</strong> sottolineare che il LRMS è la componente chiave per la gestione<br />
efficiente delle migliaia <strong>di</strong> Virtual Machine. In definitiva il LRMS risulta, quin<strong>di</strong>, la<br />
componente comune <strong>di</strong> tutti i para<strong>di</strong>gmi basati su architetture multilivello, pertanto,<br />
per fornire informazioni sullo stato delle risorse <strong>di</strong> calcolo occorre lavorare su tale<br />
livello.<br />
Nel terzo capitolo, si analizzeranno nel dettaglio la struttura e le funzionalità del<br />
Local Resource Management System, ponendo attenzione alle informazioni che è<br />
possibile recuperare a tale livello dell'infrastruttura e quali <strong>di</strong> esse sono in<strong>di</strong>spensabili<br />
per utilizzare il sistema progettato, il tutto per garantire una qualità del servizio che<br />
sia il più adeguata possibile.<br />
Tommaso Foglia 961/147 Pagina 14 <strong>di</strong> 150
2 L'infrastruttura dei Datacenter <strong>di</strong>stribuiti dell'esperimento ATLAS<br />
2.1 Topologia del Centro<br />
L’analisi dei dati provenienti dal LHC (Large Handron Collider), il più grande e<br />
potente acceleratore <strong>di</strong> particelle, situato presso il CERN <strong>di</strong> Ginevra, è basato sul<br />
para<strong>di</strong>gma <strong>di</strong> GRID Computing, secondo un modello gerarchico organizzato in livelli<br />
detti Tier che permette oltre ad una forte decentralizzazione, una con<strong>di</strong>visione a<br />
livello internazionale delle risorse computazionali.<br />
Dopo una prima fase <strong>di</strong> raccolta e <strong>di</strong> selezione,i dati interessanti, o dati grezzi,<br />
vengono inviati con apposite linee de<strong>di</strong>cate al Computer Center del CERN, noto<br />
come Tier-0. Qui avviene la prima tornata <strong>di</strong> ricostruzione: i dati grezzi (RawData) in<br />
uscita dall'esperimento subiscono una prima fase <strong>di</strong> calibrazione e allineamento.<br />
Finita l'elaborazione i dati grezzi e le sintesi vengono inviate ai centri Tier-1 che<br />
partecipano all'esperimento.<br />
I centri Tier-1, sono decentralizzati. Sono <strong>di</strong>slocati nei paesi che partecipano al<br />
progetto e contribuiscono a creare una rete <strong>di</strong> ricerca essendo collegati <strong>di</strong>rettamente al<br />
CERN. Ogni centro Tier-1 ha il compito <strong>di</strong> rielaborare i dati grezzi e <strong>di</strong> fornire un<br />
back-up <strong>di</strong>stribuito, immagazzinando a tempo indeterminato una parte <strong>di</strong> questi dati.<br />
Ogni Tier-1 ha <strong>di</strong>versi Tier-2 associati, spesso accomunati da una vicinanza<br />
geografica, infatti sono generalmente <strong>di</strong>sposti a livello nazionale. I dati elaborati dal<br />
Tier-1, avvalendosi <strong>di</strong> algoritmi per la ricostruzione delle informazioni, vengono poi<br />
<strong>di</strong>strubuiti ai Tier-2, dove potranno essere eseguiti job <strong>di</strong> analisi e simulazione dei<br />
dati da parte <strong>degli</strong> utenti.<br />
I Tier-1 insieme ai rispettivi Tier-2 formano una Cloud. La Cloud italiana ha nel<br />
CNAF (Centro Nazionale per la Ricerca e Sviluppo nelle Tecnologie Informatiche e<br />
Telematiche) <strong>di</strong> Bologna il suo Tier-1 e nelle se<strong>di</strong> dell'Istituto Nazionale <strong>di</strong> Fisica<br />
Nucleare <strong>di</strong> Milano, Roma, <strong>Napoli</strong> e Frascati i suoi Tier-2. Circa 10 Cloud , sparse in<br />
Tommaso Foglia 961/147 Pagina 15 <strong>di</strong> 150
tutto il mondo, fanno parte del progetto ATLAS. Ognuna è in grado <strong>di</strong> memorizzare<br />
gran<strong>di</strong> quantità <strong>di</strong> dati dell’or<strong>di</strong>ne <strong>di</strong> centinaia <strong>di</strong> Tera byte e <strong>di</strong> fornire un'adeguata<br />
potenza <strong>di</strong> calcolo per i <strong>di</strong>versi compiti da svolgere.<br />
I Tier-2 hanno il compito <strong>di</strong> sopperire a tutta la capacità <strong>di</strong> simulazione necessaria<br />
all'esperimento, anche se la con<strong>di</strong>visione effettiva dei dati risultanti avverrà<br />
attraverso i Tier-1 <strong>di</strong> riferimento. Oltre alla potenza <strong>di</strong> calcolo un centro Tier-2 dovrà<br />
fornire anche risorse per lo storage in grado <strong>di</strong> ospitare i dati assegnati, che si<br />
presentano in file <strong>di</strong> formati <strong>di</strong>versi, in base al tipo e alla quantità <strong>di</strong> informazioni<br />
contenute.<br />
Tommaso Foglia 961/147 Pagina 16 <strong>di</strong> 150
L'utilizzo del para<strong>di</strong>gma Grid è <strong>di</strong> fondamentale importanza per il Tier-2.<br />
L'accessibilità tramite gli strumenti Grid standard e la continua operatività del<br />
sistema, minimizzando guasti e manutenzione, fanno si che il centro possa assolvere<br />
a tutti questi compiti. L'ambiente deve poter sod<strong>di</strong>sfare un'attività multiutente, dove<br />
vengono eseguite contemporaneamente operazioni computazionalmente onerose.<br />
Si può parlare <strong>di</strong> un Tier-3 a carattere locale, composto da singoli istituti o<br />
<strong>di</strong>partimenti, fornisce capacità <strong>di</strong> analisi per i gruppi ed i sottogruppi dell'istituto o<br />
<strong>di</strong>partimento. E' il livello gerarchico più basso ed è dove effettivamente avviene<br />
l'analisi dei dati.<br />
I dati seguono il cosiddetto Event Data Model: si parte dai dati grezzi forniti in output<br />
dall'LHC, per arrivare ai dati da elaborare nei singoli siti. Abbiamo <strong>di</strong>versi tipi <strong>di</strong><br />
dati:<br />
➢ Raw Data: sono le misure grezze in uscita dal Trigger, sono trasferite dal Tier0<br />
al Tier1.<br />
➢ EDS (Event Summary Data): misure in uscita dalla ricostruzione. Vanno a<br />
rappresentare quello che riguarda l'interazione tra le particelle<br />
nell'acceleratore, i percorsi delle particelle e le collisioni.<br />
➢ AOD (Analisys Object Data): sono un tipo ridotto <strong>degli</strong> ESD, è il formato<br />
pubblico dei dati da elaborare. Descrivono le singole particelle.<br />
➢ DPD (Derived Physicl Data): rappresentano il tipo <strong>di</strong> dato privato utilizzato<br />
esplicitamente nei centri <strong>di</strong> calcolo. Risultano essere un formato ridotto <strong>degli</strong><br />
AOD.<br />
Tramite l'utilizzo <strong>di</strong> specifici insiemi <strong>di</strong> software e middleware viene gestita la<br />
comunicazione dei dati, in<strong>di</strong>pendentemente dal luogo geografico in cui essi si trovano<br />
le informazioni sono sempre <strong>di</strong>sponibili all'uso.<br />
Tommaso Foglia 961/147 Pagina 17 <strong>di</strong> 150
2.2 Il centro <strong>di</strong> calcolo dell'INFN <strong>di</strong> <strong>Napoli</strong><br />
Il Tier2-<strong>Napoli</strong> è <strong>di</strong>sposto in due sale appositamente allestite, che sono :<br />
➢ Il Capannone realizzato per il progetto S.Co.P.E, che contiene 33 Racks dei<br />
quali quattro contengono <strong>di</strong>spositivi de<strong>di</strong>cati al Tier2 ATLAS.<br />
➢ Una sala nei locali del Servizio <strong>di</strong> Calcolo & Reti (SCR) della Sezione INFN,<br />
del Dipartimento <strong>di</strong> Fisica che contiene tre Racks.<br />
2.2.1 Le tecnologie del DataCenter<br />
Gli apparati del DataCenter sono <strong>di</strong>stribuiti in due sale e <strong>di</strong>sposti in sette Racks dei<br />
quali tre presso INFN, e quattro preso il Capannone <strong>di</strong> S.Co.P.E. Il collegamento fra<br />
le due sale avviene attraverso un link in fibra ottica a 10Gbps.<br />
Il Tier-2 e' connesso alla rete geografica tramite un router Cisco con una linea<br />
de<strong>di</strong>cata <strong>di</strong> fibra a 1Gbps verso il Pop Garr, che e' collocato nell'e<strong>di</strong>ficio dei Centri<br />
Comuni del Complesso Universitario <strong>di</strong> Monte Sant'Angelo.<br />
Tommaso Foglia 961/147 Pagina 18 <strong>di</strong> 150
An<strong>di</strong>amo ad esaminare i servizi e gli apparati fondamentali. Ogni Organizzazione<br />
Virturale (V.O.) mette a <strong>di</strong>sposizione un'insieme <strong>di</strong> risorse interconnesse attraverso la<br />
rete internet. In ogni sito appartenente al Tier-2 sono collocate delle macchine che<br />
hanno <strong>di</strong>verse funzionalità.<br />
I Service Nodes sono i <strong>di</strong>spositivi de<strong>di</strong>cati alla gestione dell'accounting <strong>degli</strong> utenti e<br />
allo smistamento dei job da effettuare sulle macchine deputate ad eseguirli. I Service<br />
Nodes si sud<strong>di</strong>vidono in :<br />
✔ User Interface(UI): Rappresenta il punto <strong>di</strong> accesso a Grid. E' costituita da un<br />
calcolatore dove gli utenti hanno un account personale, in cui è installato il<br />
proprio certificato che permette <strong>di</strong> interagire con le funzionalità del sistema<br />
Grid. Dalla UI, un utente può essere autenticato e autorizzato all'utilizzo delle<br />
risorse e può sottomettere le proprie applicazioni (job), gestirne l'esecuzione e<br />
ottenerne i risultati.<br />
Tommaso Foglia 961/147 Pagina 19 <strong>di</strong> 150
✔ Computing Element(CE): Unità logica <strong>di</strong> calcolo che include il gateway verso<br />
una farm. Il CE ha infatti il controllo su uno o più Worker Node (WN) che<br />
sono le unità fisiche <strong>di</strong> calcolo.<br />
✔ Worker Nodes(WN): Sono no<strong>di</strong> <strong>di</strong> una farm, chiamati computer off-the-shelf, i<br />
quali offrono soltanto CPU e connettività senza periferiche <strong>di</strong> I/O né memoria<br />
<strong>di</strong> massa (usano <strong>di</strong>rettamente lo Storage Element). Non tutti hanno le stesse<br />
caratteristiche tecniche, <strong>di</strong>fatto molti <strong>di</strong> essi sono stati aggiunti <strong>di</strong> recente, e<br />
quin<strong>di</strong> sono <strong>di</strong>versi dagli apparati più vecchi. Per alcuni <strong>di</strong> questi ultimi inoltre<br />
è già stata programmata la rimozione.<br />
✔ Storage Element(SE): Le Risorse <strong>di</strong> Storage hanno il compito <strong>di</strong> conservare i<br />
dati da elaborare. Essi sono collegati agli altri <strong>di</strong>spositivi attraverso dei canali<br />
in fibra de<strong>di</strong>cata e sono gestiti attraverso vari server, detti Storage Element,<br />
che si occupano delle operazioni <strong>di</strong> lettura e scrittura <strong>di</strong> dati. In particolare<br />
sono installati 2 server in ridondanza per ogni apparato <strong>di</strong> storage. A ciascuno<br />
e' de<strong>di</strong>cata una parte <strong>di</strong> storage e può effettuare operazioni <strong>di</strong> lettura o scrittura,<br />
se funzionano contemporaneamente. Invece nel caso <strong>di</strong> malfunzionamento <strong>di</strong><br />
uno tra i due, quello funzionante e' responsabile <strong>di</strong> impegnarsi anche per il<br />
lavoro dell'altro. Forniscono un accesso uniforme alle risorse <strong>di</strong> storage<br />
(servers <strong>di</strong> <strong>di</strong>schi, array <strong>di</strong> <strong>di</strong>schi, Mass Storage Systems) supportando <strong>di</strong>versi<br />
protocolli <strong>di</strong> accesso a dati ed interfacce. Si può notare che non sono tutti gli<br />
apparati sono dello stesso tipo, in quanto sono stati aggiunti alla rete in tempi<br />
<strong>di</strong>fferenti.<br />
✔ Disk Pool Manager(Dpm): Per utilizzare <strong>di</strong>versi tipi <strong>di</strong> SE nella Grid, è<br />
necessario definire un’interfaccia che permetta la gestione dei possibili<br />
supporti, in<strong>di</strong>pendentemente dal loro tipo: a questa funzione è de<strong>di</strong>cato il<br />
protocollo Storage<br />
✔ Resource Manager (SRM). DPM implementa l'interfaccia <strong>di</strong> SRM che consiste<br />
Tommaso Foglia 961/147 Pagina 20 <strong>di</strong> 150
in un server che fornisce un singolo punto <strong>di</strong> accesso verso un pool <strong>di</strong> server <strong>di</strong><br />
<strong>di</strong>schi.<br />
✔ HLR: Effettua l'accounting dell'utilizzo delle risorse del calcolo(CPU Time),<br />
da parte delle <strong>di</strong>verse VO.<br />
Tommaso Foglia 961/147 Pagina 21 <strong>di</strong> 150
3 L'importanza delle informazioni a livello LRMS<br />
3.1 Le caratteristiche del servizio<br />
Il servizio LRMS, Local Resoure Management System avrà il compito <strong>di</strong> reclutare e<br />
<strong>di</strong> gestire le risorse del sistema, in modo che l'andamento delle esecuzioni non sarà<br />
più mansione dell'utente ma sarà gestito dal sistema.<br />
Come spesso capita in un ambiente multilivello, bisogna coor<strong>di</strong>nare una notevole<br />
quantità <strong>di</strong> risorse <strong>di</strong>slocate fisicamente. Nella circostanza in cui gli utenti richiedono<br />
l’esecuzione <strong>di</strong> un job, il sistema dovrà garantire loro,la possibilità <strong>di</strong> avere<br />
informazioni sullo stato <strong>di</strong> esecuzione dell’applicazione oltre al corretto<br />
funzionamento del servizio <strong>di</strong> allocazione delle risorse <strong>di</strong> calcolo.<br />
La totalità dei no<strong>di</strong> <strong>di</strong> calcolo risulta essere un insieme logico, visti come componenti<br />
<strong>di</strong> una coda, dove utenti o gruppi <strong>di</strong> utenti o intere VO hanno determinati permessi <strong>di</strong><br />
esecuzione.<br />
Un sistema in grado <strong>di</strong> supportare l'esecuzione <strong>di</strong> una serie <strong>di</strong> job (batch job) senza la<br />
necessità <strong>di</strong> avere una continua interazione con l'utente (batch processing) è definito<br />
come batch system. Nei sistemi Grid, ad esempio, la gestione dei batch job è,<br />
generalmente, ad opera del sistema, o <strong>di</strong> utenti privilegiati, ogni job viene mandato in<br />
esecuzione in<strong>di</strong>cando i parametri <strong>di</strong> input o dove reperire i dati necessari<br />
all'esecuzione potendo in<strong>di</strong>care quali specifiche risorse <strong>di</strong> calcolo si preferisce<br />
utilizzare.<br />
Ogni richiesta <strong>di</strong> risorse viene trasformata, in maniera trasparente per l’utente, in un<br />
job da sottoporre al LRMS. Quando l'utente decide <strong>di</strong> mandare in esecuzione un job,<br />
quest’ultimo viene presentato al LRMS che avrà il compito <strong>di</strong> assegnarlo ad un WN<br />
<strong>di</strong>sponibile, controllando sia le risorse <strong>di</strong>sponibili che i requisiti del job.<br />
Il servizio LRMS ha una logica <strong>di</strong> tipo master/slave: il master occupa una macchina<br />
<strong>di</strong> front-end, mentre gli slave si trovano sulle macchine, virtuali o fisiche, che<br />
Tommaso Foglia 961/147 Pagina 22 <strong>di</strong> 150
vengono impiegate per il calcolo effettivo, i cosiddetti “worker node” (WN).<br />
Di fondamentale importanza risulta essere l'attività <strong>di</strong> gestione delle risorse e i servizi<br />
<strong>di</strong> gestione sono composti solitamente da varie componenti con <strong>di</strong>versi ruoli.<br />
Elenchiamo i ruoli fondamentali:<br />
Aggiornare e controllare lo stato delle risorse;<br />
Ricevere i job mandati in esecuzione dagli utenti;<br />
Approvarli e controllarne i permessi;<br />
Eseguire materialmente i job;<br />
<br />
<br />
Controllarne l'esecuzione;<br />
Rilasciare aggiornamenti sullo stato delle risorse alla componente che si<br />
occupa effettivamente della scelta della risorsa <strong>di</strong> calcolo.<br />
Per come è stato descritto, il compito <strong>di</strong> un batch system è quello <strong>di</strong> poter offrire<br />
capacità <strong>di</strong> calcolo, per un dato insieme <strong>di</strong> fruitori che ne facciano richiesta.<br />
E' spesso utile sud<strong>di</strong>videre le risorse in unita logiche, dette no<strong>di</strong>,a prescindere dalle<br />
reali risorse. Elementi fondamentali <strong>di</strong> un nodo sono almeno un processore unito a<br />
risorse <strong>di</strong> memoria e <strong>di</strong> comunicazione.<br />
I no<strong>di</strong>, in un tipico sistema batch semplice,hanno una classificazione in tre<br />
categorie:<br />
➢ Central Manager Node<br />
➢ Execution Node<br />
➢ User Interface Node<br />
Tommaso Foglia 961/147 Pagina 23 <strong>di</strong> 150
Figura 9 Schema generale <strong>di</strong> funzionamento.<br />
Un ruolo fondamentale è ricoperto dal Central Manager, infatti si occupa della<br />
gestione e coor<strong>di</strong>namento dell'intero sistema.<br />
I processi in esecuzione su questo nodo, raccolgono le richieste <strong>di</strong> sottomissione dei<br />
job da parte <strong>degli</strong> utenti, che accedono tramite User Interface e le sud<strong>di</strong>vidono tra i<br />
no<strong>di</strong> <strong>di</strong> esecuzione, facendo da me<strong>di</strong>atore tra le risorse richieste e quelle al momento<br />
<strong>di</strong>sponibili.<br />
Il Central Manager deve garantire stabilità <strong>di</strong> funzionamento, infatti un<br />
malfunzionamento o un crash del sistema potrebbero precluderne il suo intero<br />
funzionamento. Esso è quin<strong>di</strong>, una macchina con elevati livelli <strong>di</strong> connettività<br />
rispetto agli altri no<strong>di</strong>.<br />
I no<strong>di</strong> Execution possono essere molto eterogenei, in termini <strong>di</strong> risorse a<br />
<strong>di</strong>sposizione e <strong>di</strong> prestazioni, eseguono i job, comunicano col Central Manager e<br />
ritornano i risultati. I no<strong>di</strong> User Interface,sono utilizzati per l'invio delle richieste e<br />
costituiscono l'interfaccia verso l'utente.<br />
Tommaso Foglia 961/147 Pagina 24 <strong>di</strong> 150
Tali no<strong>di</strong> devono fornire buoni requisiti, in termini <strong>di</strong> memoria. Ne segue che la<br />
gestione <strong>di</strong> un sistema batch non è un compito semplice, poiché ad esempio i job,<br />
mandati in esecuzione dagli utenti, possono avere durata variabile o essere <strong>di</strong> vario<br />
tipo o possono aver bisogno <strong>di</strong> quantità <strong>di</strong> risorse non al momento <strong>di</strong>sponibili.<br />
Una volta allocate le risorse più “adatte” per il job, una componente detta scheduler si<br />
occupa <strong>di</strong>:<br />
• Ottimizzare le risorse <strong>di</strong> mandare in esecuzione i job;<br />
• Assegnare una specifica priorità e or<strong>di</strong>nare i job;<br />
• Smistare i job.<br />
Lo scheduler ha il compito <strong>di</strong> calcolare un giusto or<strong>di</strong>ne <strong>di</strong> esecuzione dei job<br />
pervenuti ed è un processo in continua esecuzione su un nodo manager. Lo scheduler<br />
fa in modo che i job non influiscano sull'esecuzione <strong>degli</strong> altri per quanto riguarda<br />
l'allocazione <strong>di</strong> risorse, inoltre li rior<strong>di</strong>na.<br />
Per far sì che anche gli utenti possano contribuire alle scelte dello scheduler, viene<br />
messo a <strong>di</strong>sposizione un servizio, detto resource manager, che consente<br />
l'amministrazione dei job ed ha piena visibilità delle risorse al momento <strong>di</strong>sponibili.<br />
Il livello del servizio LRMS possiede gli strumenti per ottenere un elevato numero <strong>di</strong><br />
informazioni statiche e <strong>di</strong>namiche sull'organizzazione topologica e sullo stato<br />
effettivo delle risorse <strong>di</strong> calcolo, essendo, nelle infrastrutture <strong>di</strong> calcolo <strong>di</strong>stribuito il<br />
livello più vicino ai no<strong>di</strong> <strong>di</strong> calcolo. E' necessario quin<strong>di</strong> pre<strong>di</strong>sporre meccanismi <strong>di</strong><br />
monitoraggio delle risorse proprio a tale livello.<br />
E' buona norma <strong>di</strong> progettazione in<strong>di</strong>viduare subito quelli che saranno i requisiti<br />
funzionali e quelli non funzionali. Un generico sistema <strong>di</strong> monitoraggio deve poter<br />
offrire:<br />
• Una visualizzazione dei risultati relativi all'attività <strong>di</strong> monitoraggio in formato<br />
grafico o tabellare.<br />
Tommaso Foglia 961/147 Pagina 25 <strong>di</strong> 150
• Per evitare che anomalie ed errori compromettano l'affidabilità del sistema,<br />
sarebbe auspicabile che dei controlli automatici, al raggiungimento <strong>di</strong> una<br />
soglia critica, provvedessero allo spegnimento automatico della risorse non<br />
funzionanti, alla riconfigurazione delle code <strong>di</strong> calcolo, o ancora allo<br />
spegnimento del servizio che ha provocato il raggiungimento della soglia<br />
critica.<br />
Inoltre è auspicabile che il sistema abbia:<br />
• Un basso overhead: per non incidere sulle performance del sistema nel suo<br />
complesso le risorse occupate per il recupero delle informazioni, devono<br />
essere minime;<br />
• bassa latenza: ridurre il ritardo nella trasmissione delle informazioni;<br />
• fault tolerance: cioè la sopravvivenza ai guasti, a seguito dei quali il sistema<br />
deve essere in grado <strong>di</strong> riconnettersi e sincronizzarsi automaticamente;<br />
• sicurezza e scalabilità: si deve prevedere <strong>di</strong> mantenere lo stesso standard <strong>di</strong><br />
qualità, anche al crescere delle risorse da monitorare, oltre a controllare gli<br />
accessi al sistema.<br />
• Formattazione dei risultati: il modo in cui presentare i risultati ottenuti deve<br />
essere semplice ed esauriente, possibilmente rispettando uno standard<br />
specifico.<br />
Affinché l'attività <strong>di</strong> monitoraggio sod<strong>di</strong>sfi tutti i requisiti, sia quelli funzionali che<br />
quelli non funzionali, <strong>di</strong> cui si è parlato, c'è bisogno <strong>di</strong> un folto numero <strong>di</strong> parametri<br />
che riescano a rappresentare fedelmente e completamente lo stato delle risorse.<br />
Possiamo <strong>di</strong>videre questi parametri in due gruppi : del primo gruppo fanno parte le<br />
informazioni statiche sul sito da monitorare: nomi delle code,nomi dei gruppi, numeri<br />
Tommaso Foglia 961/147 Pagina 26 <strong>di</strong> 150
delle code, ed altro ancora. del secondo, invece, le informazioni specifiche sui job<br />
presenti sulle code: numero <strong>di</strong> esecuzione, stato, tempi.<br />
Poiché gli utenti sono aggregati logicamente in gruppi è importante sottolineare la<br />
necessità <strong>di</strong> avere una mappatura tra le code <strong>di</strong> esecuzione del batch system e sui<br />
gruppi <strong>di</strong> utenti che hanno l'autorizzazione <strong>di</strong> lavorare su queste code.<br />
Le mappature possono essere dalle più semplici, nel caso <strong>di</strong> facili associazioni tra<br />
gruppi e code, o molto complesse, dove più gruppi accedono a più code.<br />
E' necessario estrarre informazioni su:<br />
• Gruppi (o più comunemente nel caso grid VO): i gruppi o le VO hanno<br />
obiettivi comuni e politiche <strong>di</strong> accesso ai dati <strong>di</strong>strubuiti e alle risorse<br />
prestabilite. Ogni membro facente parte del gruppo ha accesso alle risorse del<br />
sito oggetto <strong>di</strong> monitoraggio.<br />
• Utenti singoli,cioè utenti non appartenenti a VO o a gruppi che hanno però<br />
permessi <strong>di</strong> accesso alle risorse del sito;<br />
• Code, cioè gli insiemi <strong>di</strong> no<strong>di</strong>, messi a <strong>di</strong>sposizione dalla rete <strong>di</strong> calcolo, per<br />
poter elaborare le richieste. Sarà importante sapere per ogni coda, quali<br />
vo,gruppi e code sono autorizzati all'utilizzo <strong>di</strong> tali risorse.<br />
Necessari per una mappatura sono i nomi <strong>di</strong> questi elementi e le loro relazioni.<br />
Le informazioni estraibili, relativamente alle code, al livello LRMS possono<br />
essere elevate:<br />
• Nome della coda<br />
• Priorità<br />
• Nome dello scheduler<br />
• Limite <strong>di</strong> CPU<br />
Tommaso Foglia 961/147 Pagina 27 <strong>di</strong> 150
• Limite <strong>di</strong> Walltime<br />
• Limite <strong>di</strong> no<strong>di</strong> accessibile dalla coda.<br />
• Massimo numero <strong>di</strong> job che possono essere sottomessi da un singolo utente.<br />
• Massimo numero <strong>di</strong> job che un processore può ottenere per ciascuna coda.<br />
• Massimo numero <strong>di</strong> job che un host può sottomettere sulla coda.<br />
• Numero <strong>degli</strong> slot (core) riservati ai job.<br />
• Numero massimo <strong>di</strong> job che possono essere inseriti su tale coda.<br />
• Massimo numero <strong>di</strong> job che possono essere messi in esecuzione in<br />
contemporanea sulla coda.<br />
• Tipologia <strong>di</strong> coda. Una coda può essere <strong>di</strong> tipo routine, execution o entrambe<br />
routine/execution.<br />
Molte <strong>di</strong> queste informazioni, anche se non aiutano <strong>di</strong>rettamente a comprendere lo<br />
stato <strong>di</strong> una coda, possono fare da contorno alle informazioni principali, ed essere<br />
utilizzate per fornire un livello <strong>di</strong> dettaglio più elevato. Le informazioni che servono<br />
a mostrare il reale stato <strong>di</strong> occupazione delle code sono quelle relative ai job<br />
mentre,quelle che servono a controllare lo stato del sistema, facendo in modo che<br />
questo resti all'interno delle soglie critiche, sono quelle relative al sistema. Tramite<br />
queste informazioni si può capire realmente lo stato <strong>di</strong> una coda.<br />
Informazioni relative ai job:<br />
• Nome del Job;<br />
• Nome della coda su è presente;<br />
• Identificativo del job;<br />
• Stato del job;<br />
• Nome dell'utente, o del gruppo che ha sottoposto il job.<br />
Tommaso Foglia 961/147 Pagina 28 <strong>di</strong> 150
Le informazioni per in<strong>di</strong>viduare eventuali livelli critici sono:<br />
• Tempo in cui il job è eleggibile per essere mandato in esecuzione;<br />
• Tempo in cui il job è stato mandato in esecuzione.<br />
• Totale <strong>di</strong> walltime;<br />
• Totale <strong>di</strong> memoria utilizzata;<br />
• Totale <strong>di</strong> memoria virtuale utilizzata;<br />
• Tempo <strong>di</strong> occupazione della CPU;<br />
• Tempo in cui il job è stato creato;<br />
• Tempo da cui il job è in coda;<br />
Sapere l'host su cui un job è in esecuzione può ritornare utile per un amministratore <strong>di</strong><br />
sistema.<br />
La considerazione importante da fare è che tutte le informazioni elencate sono<br />
sempre reperibili a livello LRMS, tramite <strong>di</strong>retta interrogazione del batch system,<br />
l'unico requisito richiesto ai batch system, per poter essere monitorato dal sistema<br />
progettato, pertanto è <strong>di</strong> <strong>di</strong>sporre <strong>di</strong> coman<strong>di</strong> adeguati (strumenti client del LRMS)<br />
per poter recuperare tutte le informazioni elencate, che formattate in maniera<br />
opportuna verranno utilizzate dal sistema <strong>di</strong> monitoraggio per presentarle ad utenti ed<br />
amministratori.<br />
Tommaso Foglia 961/147 Pagina 29 <strong>di</strong> 150
3.2 Le informazioni fornite dai batch system<br />
Le informazioni recuperate dai batch system, per poter essere effettivamente<br />
utilizzate dal sistema progettato, devono essere formattate in modo opportuno. Tra le<br />
varie tecnologie a <strong>di</strong>sposizione si è pensato <strong>di</strong> adottare quella che è <strong>di</strong>ventata uno<br />
standard de facto per la rappresentazione delle informazioni: XML, un metaliguaggio<br />
<strong>di</strong> markup, che garantisce una facile integrazione. La struttura del documento XML, è<br />
stata pensata per contenere tutte le informazioni sulla configurazione statica del sito<br />
monitorato, informazioni necessarie per un corretto funzionamento del sistema.<br />
Il nodo root del documento è Siteconfig, i suoi figli sono i no<strong>di</strong> Queue, ognuno <strong>di</strong><br />
essi in<strong>di</strong>ca una coda, per ogni coda sono presenti le Vo aventi accesso ad essa, ogni<br />
Vo contiene no<strong>di</strong> Group che in<strong>di</strong>cano tutti i gruppi in cui è sud<strong>di</strong>visa la Vo.<br />
Figura 10: Schema della configurazione della mappatura.<br />
I no<strong>di</strong> Queue possono contenere anche no<strong>di</strong> Other che in<strong>di</strong>cheranno gli utenti locali,<br />
cioè quelli aventi accesso alla coda, ma non appartenenti a nessuna Vo. Le specifiche<br />
Tommaso Foglia 961/147 Pagina 30 <strong>di</strong> 150
descritte nel documento “Configuration of Virtual Organizations in gLite 3.0” sono<br />
state tenute <strong>di</strong> conto nella scelta della struttura dell'albero XML, un documento che<br />
fornisce dettagli sulla gestione delle caratteristiche delle virtual organization nei<br />
sistemi Grid.<br />
Il sistema offre la possibilità <strong>di</strong> utilizzare un file <strong>di</strong> testo contenente l'elenco delle<br />
code, vo, gruppi e utenti, nel caso in cui non si <strong>di</strong>sponga <strong>di</strong> un file <strong>di</strong> configurazione<br />
in XML ed in tal caso, il file XML <strong>di</strong> configurazione viene creato dal sistema.<br />
Le informazioni minime che devono essere presenti, nell'or<strong>di</strong>ne, sono le parole<br />
chiavi: Queue, Vo, Group e Other.<br />
• Queue : è il nome della coda;<br />
• Vo succesive alla queue: sono le virtual organization aventi permesso <strong>di</strong><br />
esecuzione sulla coda;<br />
• Group successivi alla Vo: sono i gruppi facenti parte della virtual organization;<br />
• Other: sono gli utenti semplici che non appartengono a nessna VO ma hanno<br />
lo stesso permessi <strong>di</strong> esecuzione sulla coda.<br />
Elemento root del documento è il nodo Data e per ogni job presente sulle code sarà<br />
presente un nodo Job. Ogni nodo job contiene i seguenti figli:<br />
• Job_Owener, nome dell'utente che ha mandato in esecuzione il job;<br />
• Job_Name, nome del job;<br />
• resource_used, risorse usate, che contiene 4 no<strong>di</strong>:<br />
• cput, che in<strong>di</strong>ca il tempo <strong>di</strong> cpu utilizzato;<br />
• mem e vmem, quantità <strong>di</strong> memoria e memoria virtuale usata;<br />
• walltime, tempo reale <strong>di</strong> esecuzione del programma ;<br />
• job_state, lo stato del job;<br />
• queue, nome della coda su cui il job è presente;<br />
Tommaso Foglia 961/147 Pagina 31 <strong>di</strong> 150
• exec_host, nome dell'host su cui il job è in esecuzione;<br />
• ctime, tempo in cui il job è stato creato;<br />
• qtime, tempo in cui il job è <strong>di</strong>ventato eleggibile per essere eseguito;<br />
• etime, tempo da cui il job è in coda;<br />
• start_time, tempo in cui il job è stato sottomesso.<br />
Figura 11: Albero Xml del file contenente le informazioni sui job.<br />
Queste rappresentano le informazioni realmente necessarie ad un corretto<br />
funzionamento del sistema <strong>di</strong> monitoraggio, in questo modo si potranno avere<br />
informazioni sullo stato <strong>di</strong> utilizzo delle code e si potranno tenere sotto controllo i<br />
livelli critici, in termini <strong>di</strong> spazio e tempo occupati sulle code.<br />
E' possibile fornire in input al sistema un ulteriore documento XML per quanto<br />
riguarda le informazioni aggiuntive sulle code.<br />
Tommaso Foglia 961/147 Pagina 32 <strong>di</strong> 150
L'elemento root del documento è il nodo Data, i cui figli sono i no<strong>di</strong> Queue, uno per<br />
ogni coda presente nel sito, per ogni coda sono presenti i no<strong>di</strong>:<br />
• Name, il nome della coda;<br />
• Prio, che in<strong>di</strong>ca la priorità della coda;<br />
• TypeQueue, che in<strong>di</strong>ca la tipologia <strong>di</strong> coda. Una coda può essere <strong>di</strong> tipo<br />
routine, execution o entrambe routine/execution;<br />
• TypeScheduler, che contiene il nome dello scheduler che gestisce la coda;<br />
• cput, il limite <strong>di</strong> tempo <strong>di</strong> occupazione della CPU;<br />
• walltime, il limite <strong>di</strong> Walltime;<br />
Tommaso Foglia 961/147 Pagina 33 <strong>di</strong> 150
• numSlot, il numero <strong>degli</strong> slot (core) riservati ai job;<br />
• maxJob, che contiene: Num, il numero massimo <strong>di</strong> job che può essere inserito<br />
sulla coda; FromUsers, il massimo numero <strong>di</strong> job che può essere sottomesso<br />
da un singolo utente.<br />
• FromHost, il massimo numero <strong>di</strong> job che un host può sottomettere sulla coda.<br />
• Proc, il massimo numero <strong>di</strong> job che un processore può ottenere per ciascuna<br />
coda.<br />
• Run, il massimo numero <strong>di</strong> job che possono essere messi in esecuzione in<br />
contemporanea sulla coda.<br />
Figura 13: Struttura del file xml contenente le informazioni aggiuntive sulle code.<br />
Queste informazioni, non utilizzate imme<strong>di</strong>atamente, per la creazione dei grafici,<br />
vengono comunque storicizzate per favorire e facilitare un futuro ampliamento del<br />
sistema.<br />
Tommaso Foglia 961/147 Pagina 34 <strong>di</strong> 150
3.3 Esempi <strong>di</strong> batch system: PBS e LFS<br />
Tra i software in circolazione che realizzano batch system in<strong>di</strong>chiamo:<br />
• PBS( Portable Batch System)/MAUI<br />
• LSF (Load Sharing Facility)<br />
Uno dei software open source maggiormente utilizzati per la gestione delle code in<br />
ambienti <strong>di</strong> calcolo scientifico è PBS (Portable Batch System). Disponibile per varie<br />
piattaforme, supporta job <strong>di</strong> tipo batch,paralleli ed interattivi, <strong>di</strong>spone <strong>di</strong> API per<br />
l'aggiunta <strong>di</strong> nuovi coman<strong>di</strong> per integrarsi in altre applicazioni e per utilizzare dei<br />
particolari algoritmi <strong>di</strong> scheduling, inoltre <strong>di</strong>spone <strong>di</strong> un'interfaccia grafica.<br />
Le componenti <strong>di</strong> PBS sono:<br />
• PBS supporta coman<strong>di</strong> sia da interfaccia grafica sia da linea <strong>di</strong> comando. E'<br />
possibile sottomettere, mo<strong>di</strong>ficare, cancellare e monitorare i job.<br />
• job Server: rappresenta il punto centrale del sistema PBS, manda in esecuzione<br />
il pbs_server, un demone, tutti gli altri coman<strong>di</strong> sono altri demoni che<br />
comunicano con il server tramite IP. Il principale ruolo del server è fornire i<br />
servizi per la ricezione, creazione, mo<strong>di</strong>fica, cancellazione <strong>di</strong> job, e deve<br />
proteggere da eventuali crash del sistema. Ogni coda consiste in un insieme <strong>di</strong><br />
job, ed ogni server gestisce una o più code (queue), anche se non seguono uno<br />
scorrimento or<strong>di</strong>nato. Esistono 2 tipi <strong>di</strong> code: routing e execution; i job<br />
presenti sulle code <strong>di</strong> routing sono destinati a cambiare coda, mentre quelli<br />
sulle code <strong>di</strong> executionsono pronti per essere eseguiti.<br />
• job Executor, è il demone pbs_mom, che manda i job in esecuzione, e si<br />
occupa anche <strong>di</strong> ritornare l'output all'utente.<br />
• job Scheduler, è il demone che contiene le politiche <strong>di</strong> esecuzione dei job,<br />
controllando dove e quando un job viene eseguito.<br />
Tommaso Foglia 961/147 Pagina 35 <strong>di</strong> 150
Figura 14: Struttura <strong>di</strong> uno batch system <strong>di</strong> tipo PBS.<br />
Il batch system PBS generalmente utilizza lo scheduler MAUI/MOAB, open source e<br />
multi-piattaforma. MAUI permette agli amministratori del sito <strong>di</strong> ampliare i controlli,<br />
inserendo nuove policy per lo scheduling dei job, e fornisce ad utenti ed<br />
amministratori informazioni relative ai job, e all'allocazione delle risorse. Per<br />
ottimizzare l'utilizzo delle risorse <strong>di</strong> calcolo si assegnano ai job delle priorità <strong>di</strong><br />
esecuzione La logica su cui si basa il sistema fa in modo <strong>di</strong> effettuare un'occupazione<br />
“intelligente” delle risorse utilizzando una combinazione <strong>di</strong> parametri <strong>di</strong><br />
configurazione (preemption, node reservation, backfill, fairshare, ecc.). Sono<br />
numerose le caratteristiche considerate dallo scheduler per la gestione delle priorità<br />
Tommaso Foglia 961/147 Pagina 36 <strong>di</strong> 150
associate ai job: numero <strong>di</strong> processori richiesti, caratteristiche dei processori, tempo<br />
d'esecuzione del job, tempo <strong>di</strong> esecuzione già trascorso, ecc.<br />
La logica adottata per l'assegnazione delle priorità è complessa e prevede una<br />
sud<strong>di</strong>visione delle caratteristiche su 3 livelli.<br />
• Diverse famiglie <strong>di</strong> attributi costituiscono il primo livello, dette componenti, a<br />
cui è associato un limite, che in<strong>di</strong>ca il valore massimo possibile, e un peso,che<br />
in<strong>di</strong>ca l'importanza <strong>di</strong> quell'attributo.<br />
• I singoli attributi che formano le componenti costituiscono il secondo livello,<br />
ad ognuno <strong>di</strong> essi è associato un peso.<br />
• Nel terzo livello invece sono presenti gli effettivi valori dei singoli attributi<br />
presenti al secondo livello.<br />
Sia lo scheduler che l'amministratore possono scegliere valori <strong>di</strong>versi e decidere <strong>di</strong><br />
assegnare priorità elevata a determinati gruppi o utenti. Lo scheduler inoltre analizza<br />
le informazioni <strong>di</strong>namiche che danno lo stato effettivo delle code.<br />
Dunque il lavoro fatto effettivamente dallo scheduler, per il calcolo della priorità<br />
pesata e della priorità <strong>di</strong> una componente, consiste in rigi<strong>di</strong> calcoli che determinano la<br />
policy per l'esecuzione dei job.<br />
LSF (Load Sharing Facility) , sviluppato dalla Platform Computing, una società<br />
canadese, è un sistema per la gestione del carico <strong>di</strong> lavoro e monitoraggio delle<br />
risorse <strong>di</strong> calcolo e dei job utente. Ideato per lavorare su sistemi <strong>di</strong>stribuiti, permette<br />
<strong>di</strong> unificare logicamente tutti i no<strong>di</strong> da gestire, in modo da visualizzarli come un<br />
unico sistema. Dispone <strong>di</strong> un set <strong>di</strong> coman<strong>di</strong> per conoscere lo stato delle risorse,<br />
sottomettere job <strong>di</strong> tipo batch, interattivi e paralleli, e controllarne lo stato.<br />
L'architettura si presenta scalabile e adatta ad ottenere alte prestazioni gestendo<br />
milioni <strong>di</strong> utenti e <strong>di</strong> job concorrenti. E' formato da:<br />
• usufruendo <strong>di</strong> meccanismi automatici implementa un insieme <strong>di</strong> politiche per<br />
la gestione dello scheduling che rendono sempre meno necessario l'intervento<br />
Tommaso Foglia 961/147 Pagina 37 <strong>di</strong> 150
<strong>degli</strong> amministratori;<br />
• strumenti per la gestione <strong>di</strong> situazioni <strong>di</strong> errore, che consentono <strong>di</strong> operare<br />
anche nel caso <strong>di</strong> crash dei cluster.<br />
Tramite tecniche <strong>di</strong> controllo <strong>di</strong> accesso alle risorse riesce a garantire la sicurezza del<br />
sistema.<br />
Gli host sono sud<strong>di</strong>visi da LSF in tre categorie:<br />
• server, che possono sottomettere ed eseguire i job;<br />
• client, da cui vengono sottoposti i job;<br />
• il master che è un particolare server con funzioni <strong>di</strong> gestioni riguardo lo<br />
scheduling e l'esecuzione dei job.<br />
Sul master host sono in esecuzione due importanti demoni:<br />
• il Master Batch Deamon (mbatchd): riceve le richieste <strong>di</strong> sottomissione e<br />
gestisce i job nelle code;<br />
• il Master Batch Scheduler Deamon (mbschd): esegue lo scheduling,<br />
Tommaso Foglia 961/147 Pagina 38 <strong>di</strong> 150
considerando le risorse <strong>di</strong>sponibili e le richieste dei job.<br />
Lo Slave Batch Deamon (sbatchd) è in esecuzione su ogni host. E' un demone che<br />
riceve le richieste <strong>di</strong> esecuzione provenienti dal Master Batch Deamon, ed avvia<br />
un'istanza <strong>di</strong> Remote Execution Server (res) che è l'ambiente reale su cui viene<br />
eseguito il job. Inoltre ha il compito <strong>di</strong> controllarne lo stato.<br />
Il Load Information Manager, (lim), è un'altro componente fondamentale del sistema<br />
LSF. Raccoglie informazioni statiche e <strong>di</strong>namiche relative all'host: numero e modello<br />
<strong>di</strong> processori, <strong>di</strong> <strong>di</strong>schi, memoria <strong>di</strong>sponibile, stato dell'host, ecc. Queste informazioni<br />
vengono inviate al Master Load Information Manager (master lim), che le fornisce al<br />
mbatchd; quest'ultimo le invia al mbschd che le utilizza per le policy <strong>di</strong> scheduling.<br />
Se il master lim non è <strong>di</strong>sponibile, vengono fornite al Process Information Manager<br />
(pim), un demone in esecuzione su ogni server host, che invia informazioni sui job<br />
allo sbatchd. Lo scheduling LSF è del tipo First Come Fist Served(FCFS), e il calcolo<br />
effettuato dallo scheduler, a causa delle numerose informazioni che occorre tenere in<br />
considerazione risulta molto complesso.<br />
Figura 16: Esempio <strong>di</strong> scheduling.<br />
Tommaso Foglia 961/147 Pagina 39 <strong>di</strong> 150
Per ogni coda l'amministratore associa un tempo massimo <strong>di</strong> esecuzione dei job (T) e<br />
una priorità (P), tali misure sono inversamente proporzionali, infatti al crescere <strong>di</strong> T<br />
<strong>di</strong>minuisce la priorità; infatti una coda short, cioè a breve tempo d'esecuzione, ha<br />
priorità maggiore rispetto ad una coda long. Questo dà precedenza ai job più brevi.<br />
La priorità, inoltre, può essere associata ad un singolo utente, o ad un gruppo, la<br />
priorità maggiore è in<strong>di</strong>cata dalla variabile MAX_USER_PRIORITY.<br />
La priorità per gli utenti può essere assegnata <strong>di</strong>rettamente dall'amministratore, in<br />
modo manuale, oppure dallo scheduler in modo automatico, considerando il numero<br />
totale <strong>di</strong> job sottoposti, la quantità <strong>di</strong> risorse richieste, tempi <strong>di</strong> esecuzione, ecc.<br />
In caso <strong>di</strong> parità <strong>di</strong> priorità viene applicato il FIFO, first in first out. Generalmente lo<br />
scheduler considera prima la priorità della coda e in seguito considera quella dei job.<br />
Ecco alcuni esempi <strong>di</strong> coman<strong>di</strong> messi a <strong>di</strong>sposizione dai batch system descritti, per<br />
poter recuperare le informazioni necessarie per l'attività <strong>di</strong> monitoraggio.<br />
Per il sistema PBS, esaminiamo questi due coman<strong>di</strong>:<br />
1. qstat -q<br />
2. qstat<br />
Il primo comando interroga lo stato del sistema con attenzione alle code. Molte sono<br />
le informazioni che vengono recuperate:<br />
• Queue in<strong>di</strong>ca il nome della coda;<br />
• Memory in<strong>di</strong>ca la massima quantità <strong>di</strong> memoria <strong>di</strong>sponibile per un job;<br />
• Cpu Time è il massimo tempo <strong>di</strong> cpu che un job può richiedere;<br />
• Walltime massimo wall time <strong>di</strong>sponibile per un job;<br />
• Node massimo numero <strong>di</strong> no<strong>di</strong> che un job può richiedere;<br />
• Run massimo numero <strong>di</strong> job in running sulla coda;<br />
• Que massimo numero <strong>di</strong> job in coda;<br />
Tommaso Foglia 961/147 Pagina 40 <strong>di</strong> 150
• Lm massimo numero <strong>di</strong> job eseguibili contemporaneamente;<br />
• State in<strong>di</strong>ca lo stato della coda.<br />
Il secondo comando, invece, interroga lo stato dei job con attenzione anche<br />
all’utente/gruppo <strong>di</strong> provenienza:<br />
• Job id è l’identificativo del job;<br />
• il campo Name in<strong>di</strong>ca il nome del job;<br />
• User, rappresenta l'utente o il gruppo <strong>di</strong> provenienza del job;<br />
• Time Use in<strong>di</strong>ca il tempo <strong>di</strong> occupazione della CPU;<br />
• il campo S in<strong>di</strong>ca lo stato del job;<br />
• Queue rappresenta il nome della coda su cui il job è presente.<br />
Per quanto riguarda LSF , i coman<strong>di</strong> utilizzabili sono:<br />
1) bqueue -w<br />
2) bjobs -W -u all<br />
Il primo comando permette <strong>di</strong> interrogare lo stato delle code:<br />
• QUEUE_NAME rappresenta il nome della coda<br />
• PRIO rappresenta la priorità della coda<br />
• STATUS in<strong>di</strong>ca lo stato della coda<br />
• MAX rappresenta il massimo numero <strong>di</strong> slot messi a <strong>di</strong>sposizione sulla coda<br />
JL/U rappresenta massimo numero <strong>di</strong> job che può essere sottoposto da un<br />
singolo utente<br />
• JL_P in<strong>di</strong>ca massimo il numero <strong>di</strong> job che un processore può ottenere per<br />
ciascuna coda<br />
• JL_H in<strong>di</strong>ca il massimo numero <strong>di</strong> job che un host può sottomettere sulla coda<br />
Tommaso Foglia 961/147 Pagina 41 <strong>di</strong> 150
NJOBS rappresenta il numero totale <strong>di</strong> job presenti sulla coda<br />
• PEND rappresenta il numero totale <strong>di</strong> job in attesa presenti sulla coda<br />
• RUN rappresenta il numero totale <strong>di</strong> job in running<br />
• SUSP in<strong>di</strong>ca il numero totale <strong>di</strong> job sospesi presenti sulla coda<br />
• RSV il numero <strong>degli</strong> slot riservati agli job in stato pen<strong>di</strong>ng<br />
Il secondo comando pone particolare attenzione all’utente che ha sottoposto il job, ai<br />
tempi <strong>di</strong> occupazione della coda e alla memoria usata:<br />
• JOBID rappresenta l’identificativo del job presente sulla coda<br />
• USER in<strong>di</strong>ca il nome dell’utente che ha sottoposto il job<br />
• STAT lo stato del job<br />
• QUEUE in<strong>di</strong>ca il nome della coda<br />
• FROM_HOST rappresenta il nome dell’host da cui il job è stato sottoposto<br />
• EXEC_HOST in<strong>di</strong>ca il nome dell’host su cui il job è in esecuzione<br />
• JOB_NAME è il nome del job<br />
• SUBMIT_TIME in<strong>di</strong>ca il tempo <strong>di</strong> sottomissione del job<br />
• PROJ_NAME il nome del progetto <strong>di</strong> cui il job fa parte<br />
• CPU_USED tempo <strong>di</strong> utilizzo della cpu<br />
• MEM quantità <strong>di</strong> memoria utilizzata;<br />
• SWAP quantità <strong>di</strong> memoria virtuale usata<br />
• PIDS identificativo/i dei processi legati al job;<br />
• START_TIME tempo <strong>di</strong> inizio dell'esecuzione del job<br />
Tommaso Foglia 961/147 Pagina 42 <strong>di</strong> 150
• FINISHED_TIME tempo <strong>di</strong> fine esecuzione<br />
Altre informazioni da recuperare dai batch system, sono quelle relative alla<br />
mappatura del sito.<br />
Per LSF i coman<strong>di</strong> utilizzabili sono:<br />
• bqueues –l,<br />
• bugroup –l nome_gruppo<br />
Il primo comando serve per catturare l’elenco delle code presenti, e l’elenco <strong>di</strong><br />
gruppi e utenti semplici autorizzati all’utilizzo e per estrarre i nomi delle Vo;<br />
Il secondo comando serve , per estrarre tutti i gruppi facenti parte delle Vo, e gli<br />
utenti semplici.<br />
Per PBS:<br />
• qmgr -c 'p s'<br />
• qmgr -c ‘p q nome_coda’<br />
Il primo comando serve per controllare la configurazione completa del server, ed<br />
estrarre le code presenti;<br />
Il secondo comando serve per estrarre i nomi delle Vo e dei gruppi presenti, e gli<br />
utenti semplici.<br />
I sistemi <strong>di</strong> gestione delle risorse <strong>di</strong> calcolo descritti: PBS e LSF, <strong>di</strong>spongono <strong>di</strong><br />
strumenti per ottenere un elevato numero <strong>di</strong> informazioni statiche e <strong>di</strong>namiche<br />
sull'organizzazione topologica e sullo stato effettivo delle risorse <strong>di</strong> calcolo. Hanno<br />
come punto in comune il dover conoscere i requisiti dei job e lo stato effettivo delle<br />
risorse, per poter decidere in maniera automatica, su quale worker node smistare<br />
effettivamente un job.<br />
Tommaso Foglia 961/147 Pagina 43 <strong>di</strong> 150
4 La modularità del portale <strong>di</strong> monitoraggio del Tier2 <strong>di</strong> <strong>Napoli</strong><br />
4.1 Organizzazione dei servizi<br />
Il portale è un servizio che opera da me<strong>di</strong>atore <strong>di</strong> informazioni a favore <strong>degli</strong> utenti<br />
della rete, consentendo agli utilizzatori <strong>di</strong> raggiungere una grande quantità <strong>di</strong><br />
informazioni attraverso un prestabilito punto d'ingresso nella rete. Non è facile<br />
determinare un'unica definizione per questo termine, che pur essendo recente, è uno<br />
dei più <strong>di</strong>ffusi ed utilizzati.<br />
Il portale è un punto <strong>di</strong> accesso unico ad un insieme <strong>di</strong> servizi, dati e applicazioni.<br />
Facilita il lavoro <strong>di</strong> ricerca essendo un aggregatore <strong>di</strong> informazioni e mettendo a<br />
<strong>di</strong>sposizione un servizio <strong>di</strong> navigazione sulla rete. Principalmente ha il compito <strong>di</strong><br />
favorire la collaborazione, la gestione dei contenuti e l'aggregazione <strong>di</strong> applicazioni.<br />
La capacità <strong>di</strong> integrazione fa del portale uno strumento con enormi potenzialità. Dal<br />
punto <strong>di</strong> vista dell'interfaccia utente, in<strong>di</strong>pendentemente dalla soluzione<br />
d'integrazione scelta, un portale può svolgere il ruolo importante dell'integrazione<br />
delle applicazioni o dei servizi costituenti un sistema informativo. In questo modo<br />
l'utente potrà accedere alla medesima interfaccia in modo facile e personalizzato a<br />
<strong>di</strong>verse sorgenti d'informazione. Inoltre un portale è un ottimo gestore <strong>di</strong> contenuti.<br />
L'informazione, <strong>di</strong>sponibile sotto varie forme multime<strong>di</strong>ali, testo, foto o video, viene<br />
organizzata ed integrata per permettere all'utente <strong>di</strong> accedere in modo efficace ed<br />
omogeneo ad un argomento <strong>di</strong> suo interesse. Per gestire l'eterogenericità dei contenuti<br />
da pubblicare viene utilizzato un CSM(Content Management System), capace <strong>di</strong><br />
garantire un simile risultato grazie alle sue funzionalità gestionali. Grazie al CSM<br />
ogni utente è capace <strong>di</strong> gestire interattivamente i propri spazi e i propri contenuti. Dal<br />
punto <strong>di</strong> vista della collaborazione è importante sottolineare che un portale è in grado<br />
<strong>di</strong> fornire i tipici strumenti utilizzati da un team <strong>di</strong> lavoro. Instant messaging, mail,<br />
message board, shared calendar e wiki sono strumenti utilizzabili all'interno <strong>di</strong> un<br />
Tommaso Foglia 961/147 Pagina 44 <strong>di</strong> 150
portare per favorire la collaborazione <strong>di</strong> un team <strong>di</strong> lavoro in una rete aziendale.<br />
Come vedremo in seguito una piattaforma per la realizzazione <strong>di</strong> portali <strong>di</strong> alto livello<br />
abilita con un unico strumento la aggregazione <strong>di</strong> applicazioni, la possibilità <strong>di</strong><br />
pubblicate contenuti e le funzionalità per la collaborazione tra gli utenti. È evidente<br />
che tutte queste possibilità insieme aprono scenari infiniti al progettista web, molto<br />
più vasti <strong>di</strong> quelli tipici <strong>di</strong> una applicazione web verticale e quin<strong>di</strong> anche più<br />
complessi da affrontare e da in<strong>di</strong>rizzare correttamente per ottenere risultati efficaci e<br />
<strong>di</strong> reale utilità per gli utenti.<br />
Tommaso Foglia 961/147 Pagina 45 <strong>di</strong> 150
4.2 Struttura <strong>di</strong> un portale<br />
La struttura <strong>di</strong> navigazione risulta essere un aspetto molto importante nella creazione<br />
<strong>di</strong> un portale. Esso deve incoraggiare la ricerca e l'esplorazione allo stesso modo. La<br />
struttura, quin<strong>di</strong>, deve fornire continui stimoli all'utente oltre a guidarlo in modo<br />
chiaro alla navigazione, facendo si che possa giungere facilmente alle informazioni<br />
ricercate. I criteri <strong>di</strong> strutturazione devono essere pensati in modo che risultino chiari<br />
al pubblico che dovrà essere aiutato e incoraggiato nell'esplorazione.<br />
Normalmente la sud<strong>di</strong>visione <strong>di</strong> un portale dovrà tenere conto <strong>di</strong> sottocategorie e<br />
sottoargomenti dell'argomento principale da presentare all'utente. La homepage<br />
generale che andrà a rappresentare il punto car<strong>di</strong>ne <strong>di</strong> accesso al sito, raccogliendo<br />
informazioni e titoli provenienti da tutte le sezioni; contenendo una selezione delle<br />
notizie più importanti. Alla homepage possono essere associate ulteriori pagine <strong>di</strong><br />
navigazione che risultano in<strong>di</strong>pendenti dalle varie sezioni. Quando an<strong>di</strong>amo a<br />
definire le <strong>di</strong>verse sezioni ci ritroviamo in una struttura già vista se pur in una forma<br />
più piccola; costituita a sua volta da una homepage e in merito alla complessità della<br />
sezione, zero o più pagine <strong>di</strong> navigazione.<br />
Queste pagine danno accesso alle informazioni vere e proprie , che possono essere<br />
anche con<strong>di</strong>vise tra più sezioni. Inoltre insieme a questa struttura che può definirsi<br />
gerarchica esiste un'organizzazione <strong>di</strong> collegamenti ipertestuali, che connettono in<br />
maniera libera homepage, homepage sezioni, pagine <strong>di</strong> navigazione, documenti e<br />
ogni altro tipo <strong>di</strong> informazione che si ritenga essere utile presentare.<br />
4.2.1 Java Portlet e Portlet Container<br />
Iniziamo ad entrare nel mondo Java ed a esaminare ciò che la piattaforma offre per la<br />
realizzazione <strong>di</strong> portali. In questo ambito vi è stata una grande evoluzione negli ultimi<br />
anni e da una situazione <strong>di</strong> immaturità e incompletezza <strong>di</strong> specifiche e strumenti si è<br />
arrivati oggi a una situazione in cui si può realmente <strong>di</strong>re <strong>di</strong> avere a <strong>di</strong>sposizione<br />
Tommaso Foglia 961/147 Pagina 46 <strong>di</strong> 150
standard e tecnologie che consentono <strong>di</strong> realizzare portali web in modo efficiente e<br />
completo.<br />
Il tutto ha le sue fondamenta nelle Java Portlet che è l’argomento che ci accingiamo a<br />
<strong>di</strong>scutere. La Java Portlet Specification 1.0 definita nell’ambito della JSR 168 fu<br />
rilasciata nell’ottobre 2003.<br />
Questa è stata la prima specifica che definiva molti aspetti sulle portlet ed ebbe una<br />
notevole importanza perché <strong>di</strong>ede una prima standar<strong>di</strong>zzazione a un ambito che fino<br />
ad allora era andato sviluppandosi senza seguire una linea comune. La specifica,<br />
sebbene costituisse un primo passo verso la standar<strong>di</strong>zzazione, non copriva molti<br />
importanti aspetti.<br />
A febbraio 2006 fu costituito il JSR 286 Expert Group al fine <strong>di</strong> arrivare alla Java<br />
Portlet Specification 2.0 rilasciata nel giugno 2008 che costituisce lo standard attuale<br />
per le portlet, le cosiddette Portlet 2.0. Ve<strong>di</strong>amo meglio come possiamo definire una<br />
Portlet.<br />
Esistono definizioni <strong>di</strong>verse più o meno rigorose da un punto <strong>di</strong> vista tecnico ma<br />
quella forse più semplice e <strong>di</strong> imme<strong>di</strong>ata comprensione è la seguente: una portlet è<br />
una applicazione web che viene eseguita in una porzione <strong>di</strong> una pagina web.<br />
Il para<strong>di</strong>gma <strong>di</strong> funzionamento <strong>di</strong> una portlet è analogo a quello <strong>di</strong> una servlet visto<br />
che parliamo sempre <strong>di</strong> un modello richiesta/risposta.<br />
Chi ha familiarità con le servlet, e con le JSP, sa però che questi componenti sono<br />
responsabili del rendering <strong>di</strong> una intera pagina web.<br />
Con le portlet il <strong>di</strong>scorso cambia poiche’ una singola portlet con le sue funzionalità è<br />
responsabile solo <strong>di</strong> una porzione dell’intera pagina web.<br />
Tommaso Foglia 961/147 Pagina 47 <strong>di</strong> 150
Possiamo quin<strong>di</strong> pensare alle portlet come a tanti mattoncini che messi insieme vanno<br />
a costituire la nostra pagina web. Ecco le principali <strong>di</strong>fferenze tra portlet e servlet:<br />
✗<br />
sono componenti più semplici e quin<strong>di</strong> più leggeri, ciò consente una maggior<br />
facilità <strong>di</strong> gestione.<br />
✗<br />
non possono essere raggiunte da un url specifico, in quanto è il portale interno<br />
ad avere associato l'in<strong>di</strong>rizzo.<br />
✗<br />
non posseggono la comunicazione con il browser, quin<strong>di</strong> non permettono <strong>di</strong><br />
inviare re<strong>di</strong>rect o errori<br />
✗<br />
non possono rappresentare pagine web complete, ma solo singoli componenti.<br />
Figura 17: Esempio <strong>di</strong> Portlet <strong>di</strong> una pagina web<br />
Tommaso Foglia 961/147 Pagina 48 <strong>di</strong> 150
Affinchè le portlet possano essere eseguite, è necessario un ambiente de<strong>di</strong>cato,<br />
un container, il portlet container, che è il corrispondente <strong>di</strong> ciò che è il servlet<br />
container per le servlet. È il portlet container che assolve ai compiti infrastrutturali<br />
necessari al corretto funzionamento <strong>di</strong> questi elementi <strong>di</strong> interfaccia detti portlet.<br />
Da un punto <strong>di</strong> vista del deployment, una portlet non è altro che una web application,<br />
un .WAR per intenderci, molto simile a una normale web application ma ovviamente<br />
con alcune specificità.<br />
Con le portlet è possibile comporre in un’unica pagina funzionalità <strong>di</strong>stinte che<br />
operano su sorgenti dati <strong>di</strong>verse.<br />
Ciò consente <strong>di</strong> aggregare, in una interfaccia omogenea, dati e applicazioni<br />
eterogenee senza costringere l’utente a viaggiare tra applicativi <strong>di</strong>versi per eseguire le<br />
funzionalità <strong>di</strong> cui ha bisogno.<br />
Il Portlet Container fornisce alle portlet il necessario ambiente <strong>di</strong> esecuzione, inoltre<br />
fornisce loro il contesto, gestendo il loro ciclo <strong>di</strong> vita e infine il comporntamento. E' il<br />
container ad istanziare le portlet prima che vengano richieste e lanciare eccezioni se<br />
qualcosa va male.<br />
Il portal server esegue il lavoro finale <strong>di</strong> aggregazione delle portlet applications e<br />
delle singole portlet. In particolare il portal server esegue la spe<strong>di</strong>zione delle request e<br />
tute le portlet contenute in una singola pagina svolgendo quin<strong>di</strong> il lavoro <strong>di</strong><br />
orchestrazione e coor<strong>di</strong>namento.<br />
La generazione <strong>di</strong> una pagina <strong>di</strong> un portale avviene attraverso questi fondamentali<br />
passi:<br />
1. Il contenuto per gli utenti, statico o <strong>di</strong>namico, <strong>di</strong>pendente dalla logica<br />
dell'applicazione della portlet, viene generato da ogni portlet.<br />
2. Il portlet container riceve i dati generati dal server portlet.<br />
3. Il container manipola le informazioni per il server portal.<br />
4. Il server portal ha il compito della creazione della pagina del portale, costituita<br />
essenzialmente da co<strong>di</strong>ce HTML generato automaticamente utilizzato dal<br />
Tommaso Foglia 961/147 Pagina 49 <strong>di</strong> 150
owser. In base alle scelte <strong>di</strong> layout che ciascun portlet si porta <strong>di</strong>etro, il<br />
server portal le applica per una corretta visualizzazione.<br />
5. La pagina creata viene inviata dal server al browser.<br />
6. L'utente può visualizzare il contenuto nel browser.<br />
La pagina è pronta per effettuare interazioni con l'utente.<br />
Tommaso Foglia 961/147 Pagina 50 <strong>di</strong> 150
4.3 Un'esempio <strong>di</strong> Enterprice Portal: Liferay<br />
Un portale d'informazione aziendale noto è l'Enterprise Information Portal. E' una<br />
struttura che consente <strong>di</strong> integrare informazioni, persone e processi attraverso spazi<br />
organizzativi. Esso offre un punto <strong>di</strong> accesso unificato e sicuro, spesso nella forma <strong>di</strong><br />
un'interfaccia utente basata sul web, <strong>di</strong>segnato per aggregare e personalizzare<br />
informazioni attraverso portlet.<br />
Nel 2001 è nato Liferay, un'Enterprise Portal can<strong>di</strong>dato ad aiutare le organizzazioni a<br />
collaborare in un modo più efficiente mettendo a <strong>di</strong>sposizione una serie consolidata <strong>di</strong><br />
applicazioni pronte all'uso. Utilizzato da piccole, me<strong>di</strong>e e gran<strong>di</strong> aziende in tutto il<br />
mondo presenta inoltre un elenco <strong>di</strong> funzionalità tali da metterlo a confronto con altri<br />
portali commerciali, con il privilegio <strong>di</strong> essere open source. Svolge la funzione <strong>di</strong><br />
Web Container, permettendo <strong>di</strong> considerare una pagina come un'aggregazione <strong>di</strong><br />
moduli web, destinati a contenere applicazioni. Totalmente basato su tecnologia<br />
JAVA, J2EE , consente <strong>di</strong> impiegarlo insieme a <strong>di</strong>fferenti application server, database<br />
e sistemi operativi. Tra le proprietà basilari ci sono:<br />
• Java Server Face con l'utilizzo <strong>di</strong> JSR 252<br />
• Portlet specification e JSR 168<br />
• Full J2EE se associato a Jboss Application Server<br />
• WSRP 2.0<br />
Il portale inoltre concede agli utenti <strong>di</strong>:<br />
• Personalizzare temi e layout.<br />
• Gestire le portlet me<strong>di</strong>ante un'organizzazione gerarchica detta Interportlet<br />
Comunication (IPC).<br />
Tommaso Foglia 961/147 Pagina 51 <strong>di</strong> 150
• Elevata <strong>di</strong>namicità, permettendo <strong>di</strong> creare, mo<strong>di</strong>ficare ed eliminare portlet, <strong>di</strong><br />
personalizzarle, impostare livelli <strong>di</strong> sicurezza.<br />
Liferay si basa su un'architettura orientata ai servizi denominata (SOA). Con SOA<br />
(Service Oriented Architecture) si va ad in<strong>di</strong>care un'architettura software usata<br />
persupportare l'utilizzo <strong>di</strong> Web Service e per assicurare l'interoperabilità tra <strong>di</strong>versi<br />
sistemi, in modo tale da consentire l'uso delle singole applicazioni come parte<br />
dell'intero processo gestionale. Le applicazioni, in questo modo, sono frutto<br />
dell'unione <strong>di</strong> più servizi, che tra <strong>di</strong> loro risultano essere in<strong>di</strong>pendenti garantendo il<br />
massimo della riusabilità. La scelta ricade su Liferay in quanto offre una grande<br />
quantità <strong>di</strong> servizi integrati <strong>di</strong> qualità ed un'ottima flessibilità. Tutto questo si va ad<br />
includere con una grande capacità <strong>di</strong> organizzare e il supporto alla collaborazione.<br />
Figura 18: Homepage <strong>di</strong> Liferay.<br />
Dalla figura sovrastante si denota che il portale presenta un'interfaccia utente molto<br />
semplice e chiara organizzata in modo tale da aiutare lo sviluppatore alla<br />
finalizzazione del compito da effettuare. Dopo la fase <strong>di</strong> autenticazione con<br />
l'immissione delle proprie credenziali il sistema passa ad uno stato che consente la<br />
creazione delle pagine, in cui verranno inserite le portlet che s'intendono adoperare.<br />
In particolare compare un bottone “AddPage” che provvederà alla creazione e<br />
Tommaso Foglia 961/147 Pagina 52 <strong>di</strong> 150
all'inserimento della pagina nel portale.<br />
In alto a destra, sotto il login sarà <strong>di</strong>sponibile un menù per le opzioni. Tale menù è<br />
composto da una collezione <strong>di</strong> sezioni dove è possibile fare operazione del tipo:<br />
• Gestione della pagina<br />
• Scelta del layout del template<br />
• Aggiunta <strong>di</strong> un'applicazione<br />
• Gestione Account<br />
• Gestione Pannello <strong>di</strong> Controllo<br />
Allo sviluppatore è concesso l'inserimento <strong>di</strong> una portlet all'interno della pagina,<br />
tramite la pressione del pulsante “Aggiunga <strong>di</strong> un'applicazione”. Comparirà un menù<br />
costituito da una lista <strong>di</strong> tutte le tipologie <strong>di</strong> portlet presenti nel portale. Inoltre c'è la<br />
possibilità <strong>di</strong> aggiungere nuove portlet all'interno del portale attraverso o una ricerca<br />
della nuova portlet da integrare o l'inserimento del file.war. La semplicità con cui si<br />
effettuano i passaggi <strong>di</strong> inserimento, fa <strong>di</strong> Liferay uno strumento valido per la<br />
pubblicazioni <strong>di</strong> nuove applicazioni.<br />
Tommaso Foglia 961/147 Pagina 53 <strong>di</strong> 150
5 Progettazione <strong>di</strong> un sistema per il monitoraggio dello stato delle code<br />
Mi è stato chiesto <strong>di</strong> ottimizzare, razionalizzare, progettare ed eseguire mo<strong>di</strong>fiche su<br />
un prototipo per la realizzazione <strong>di</strong> grafici riguardanti le informazioni proveniente da<br />
un sistema <strong>di</strong> monitoraggio.<br />
Il modello <strong>di</strong> sviluppo utilizzato, è quello basato sul riuso, in modo da ottenere nuovi<br />
sistemi integrando componenti esistenti. Questa tipologia <strong>di</strong> sviluppo è stata scelta<br />
poiché si adatta particolarmente allo sviluppo <strong>di</strong> software object-oriented.<br />
Ho sviluppato le nuove funzionalità secondo un'ottica incrementale, dove i requisiti<br />
funzionali sono stati pensati nel complesso, ma ideati e sviluppati <strong>di</strong> volta in volta,<br />
producendo così una prototipazione <strong>di</strong> tipo usa e getta.<br />
Ho prodotto <strong>di</strong>versi Mock-ups del sistema, che andavano a contemplare le nuove<br />
funzionalità offerte nell'interfaccia utente. In una prima fase ho fatto una raccolta dei<br />
requisiti, sono poi passato ad una analisi dei componenti già esistenti. Ho considerato<br />
la comparsa <strong>di</strong> alcuni requisiti non funzionali da parte del sistema. Ho progettato il<br />
design del sistema integrato ai componenti esistenti, ho implementato in modo<br />
incrementale le funzionalità arrivando così al rilascio finale dell'applicazione.<br />
Tommaso Foglia 961/147 Pagina 54 <strong>di</strong> 150
5.1 Raccolta dei requisiti e casi d'uso.<br />
Nelle primissime fasi <strong>di</strong> progettazione mi sono de<strong>di</strong>cato all'in<strong>di</strong>viduazione dei<br />
requisiti ponendo attenzione a quelle che potessero essere le richieste dell'utente e a<br />
quelle che invece potessero essere le richieste del sistema.<br />
I requisiti funzionali, atti a descrivere i servizi e le funzioni offerte dal sistema,<br />
osservato dal punto <strong>di</strong> vista dell'utente, sono :<br />
✔ Il primo requisito funzionale riguarda la possibilità <strong>di</strong> poter visualizzare in<br />
tempo reale i grafici tramite interfaccia web.<br />
✔ Il secondo requisito funzionale riguarda la possibilità <strong>di</strong> storicizzare i dati,<br />
utilizzando un'ampia finestra temporale, in modo da poter ricreare grafici <strong>di</strong><br />
eventi passati.<br />
✔ Il terzo requisito funzionale riguarda la possibilità <strong>di</strong> poter visualizzare dei<br />
grafici creati ad hoc su intervalli temporali a scelta dell'utente.<br />
I seguenti sei casi d'uso potrebbero descrivere il funzionamento del sistema:<br />
Tommaso Foglia 961/147 Pagina 55 <strong>di</strong> 150
Attraverso il formalismo <strong>di</strong> Cockburn esaminiamo i vari use case.<br />
USE CASE #1<br />
SCELTA CRITERIO TEMPORALE<br />
GOAL IN CONTEXT Mo<strong>di</strong>ficare il criterio <strong>di</strong> visualizzazione temporale<br />
PRECONDITIONS<br />
SUCCESS END<br />
CONDITIONS<br />
FAILED END<br />
CONDITIONS<br />
PRIMARY ACTOR<br />
TRIGGER<br />
Il server Tomcat ha <strong>di</strong>stribuito l'applicazione e caricato la<br />
pagina JSP. Il sistema ha già creato i grafici.<br />
L'applicazione visualizza i grafici relativi al criterio temporale<br />
scelto dall'utente.<br />
Nessuna.<br />
Utente<br />
Selezione <strong>di</strong> un ra<strong>di</strong>o button(daily,weekly,monthly,annual)<br />
DESCRIPTION STEP n° USER SYSTEM<br />
1 Seleziona un ra<strong>di</strong>o<br />
button raffigurante<br />
una scelta<br />
temporale<br />
2 Il sistema ricarica la<br />
pagina.<br />
3 Viene aggiornata la<br />
variabile <strong>di</strong><br />
sessione “iltempo”<br />
4 Vengono<br />
visualizzati i grafici<br />
relativi al criterio<br />
temporale scelto.<br />
USE CASE #2<br />
SCELTA CRITERIO VISUALIZZAZIONE<br />
GOAL IN CONTEXT Mo<strong>di</strong>ficare il criterio <strong>di</strong> visualizzazione<br />
PRECONDITIONS<br />
SUCCESS END<br />
CONDITIONS<br />
FAILED END<br />
CONDITIONS<br />
PRIMARY ACTOR<br />
Il server Tomcat ha <strong>di</strong>stribuito l'applicazione e caricato la<br />
pagina JSP. Il sistema ha già crato i grafici.<br />
L'applicazione visualizza i grafici relativi al criterio <strong>di</strong><br />
visualizzazione scelto dall'utente.<br />
Nessuna.<br />
Utente<br />
Tommaso Foglia 961/147 Pagina 56 <strong>di</strong> 150
TRIGGER<br />
Selezione <strong>di</strong> un ra<strong>di</strong>o button(queue,queue-details,VO,other)<br />
DESCRIPTION STEP n° USER SYSTEM<br />
1 Seleziona un ra<strong>di</strong>o<br />
button raffigurante<br />
un criterio <strong>di</strong><br />
visualizzazione<br />
2 Il sistema ricarica la<br />
pagina.<br />
3 Viene aggiornata la<br />
variabile <strong>di</strong><br />
sessione “ilcriterio”<br />
4 Vengono<br />
visualizzati i grafici<br />
relativi al criterio <strong>di</strong><br />
visualizzazione<br />
scelto.<br />
USE CASE #3<br />
SCELTA DELLA DATA DA VISUALIZZARE<br />
GOAL IN CONTEXT Mo<strong>di</strong>ficare la data relativa ai grafici visualizzati<br />
PRECONDITIONS<br />
SUCCESS END<br />
CONDITIONS<br />
FAILED END<br />
CONDITIONS<br />
PRIMARY ACTOR<br />
TRIGGER<br />
Il server Tomcat ha <strong>di</strong>stribuito l'applicazione e caricato la<br />
pagina JSP.<br />
L'applicazione visualizza i grafici relativi alla data scelta<br />
dall'utente.<br />
Data inserita non corretta.Visualizzazione messaggio <strong>di</strong><br />
errore.<br />
Utente<br />
Seleziona tramite calendario Javascript una data e pressione<br />
del tasto submit<br />
DESCRIPTION STEP n° USER SYSTEM<br />
1 Seleziona tramite<br />
calendario<br />
Javascript una data<br />
e preme il tasto<br />
submit<br />
2 Il sistema ricarica la<br />
pagina.<br />
Tommaso Foglia 961/147 Pagina 57 <strong>di</strong> 150
EXTENSIONS A<br />
EXTENSIONS B<br />
3 Il sistema controlla<br />
che la data rispetti i<br />
vincoli.(posteriore<br />
alla creazione del<br />
database, non<br />
successiva alla<br />
data corrente)<br />
4 Viene aggiornata la<br />
variabile <strong>di</strong><br />
sessione “ladata”<br />
5 Il sistema controlla<br />
se i grafici relativi<br />
alla data scelta<br />
sono già stati creati<br />
6 L'applicazione<br />
visualizza i grafici<br />
relativi alla data<br />
scelta dall'utente.<br />
Data non corretta<br />
4a<br />
5a<br />
I grafici relativi alla<br />
data selezionata<br />
non sono stati<br />
creati<br />
6b<br />
7b<br />
Il sistema visualizza<br />
un messaggio <strong>di</strong><br />
errore.<br />
Il sistema ricarica la<br />
pagina<br />
visualizzando i<br />
grafici relativi alla<br />
data o<strong>di</strong>erna<br />
Il sistema fa una<br />
chiamata alla<br />
funzione per creare<br />
i grafici relativi alla<br />
data scelta<br />
dall'utente<br />
L'applicazione<br />
visualizza i grafici<br />
relativi alla data<br />
scelta dall'utente.<br />
Tommaso Foglia 961/147 Pagina 58 <strong>di</strong> 150
USE CASE #4<br />
SELEZIONE PERIODO CUSTOM<br />
GOAL IN CONTEXT Selezionare un periodo a scelta dell'utente<br />
PRECONDITIONS<br />
SUCCESS END<br />
CONDITIONS<br />
FAILED END<br />
CONDITIONS<br />
PRIMARY ACTOR<br />
TRIGGER<br />
Il server Tomcat ha <strong>di</strong>stribuito l'applicazione e caricato la<br />
pagina JSP.<br />
L'applicazione visualizza i grafici relativi al periodo scelto<br />
dall'utente.<br />
Data inserita non corretta. Visualizzazione messaggio <strong>di</strong><br />
errore.<br />
Utente<br />
L'utente seleziona come criterio temporale “custom”<br />
DESCRIPTION STEP n° USER SYSTEM<br />
1 L'utente seleziona il<br />
ra<strong>di</strong>o button relativo<br />
al criterio temporale<br />
“custom”<br />
2 Il sistema ricarica la<br />
pagina.<br />
3 Viene aggiornata la<br />
variabile <strong>di</strong><br />
sessione “iltempo”<br />
4 L'applicazione<br />
visualizza una<br />
schermata per la<br />
selezione <strong>di</strong> due<br />
data.<br />
5 L'utente seleziona<br />
le due date tramite<br />
calendario<br />
Javascript e preme<br />
il pulsante submit<br />
6 Il sistema ricarica la<br />
pagina.<br />
7 Il sistema controlla<br />
che la data rispetti i<br />
vincoli.(posteriore<br />
alla creazione del<br />
database, non<br />
successiva alla<br />
data corrente,<br />
inversione tra inizio<br />
e fine periodo)<br />
8 Viene aggiornata la<br />
Tommaso Foglia 961/147 Pagina 59 <strong>di</strong> 150
EXTENSIONS A<br />
EXTENSIONS B<br />
variabile <strong>di</strong><br />
sessione “ladata1”<br />
e “ladata2”.<br />
9 Il sistema controlla<br />
se i grafici relativi al<br />
periodo scelto<br />
siano già stati<br />
creati.<br />
10 L'applicazione<br />
visualizza i grafici<br />
relativi al periodo<br />
scelto dall'utente.<br />
Data non corretta<br />
8a<br />
9a<br />
I grafici relativi al<br />
periodo<br />
selezionato non<br />
sono stati creati<br />
10b<br />
11b<br />
12b<br />
13b<br />
Il sistema visualizza<br />
un messaggio <strong>di</strong><br />
errore.<br />
Il sistema ricarica la<br />
pagina per la scelta<br />
delle due date.<br />
Il sistema fa una<br />
chiamata alla<br />
funzione per creare<br />
i grafici relativi alla<br />
periodo scelto<br />
dall'utente<br />
L'applicazione<br />
tramite funzione<br />
Javascript<br />
visualizza una<br />
finestra scura per<br />
segnalare<br />
l'elaborazione<br />
all'utente.<br />
L'applicazione<br />
visualizza i primi<br />
grafici relativi al<br />
periodo<br />
selezionato.<br />
Il sistema effettua<br />
un refresh della<br />
Tommaso Foglia 961/147 Pagina 60 <strong>di</strong> 150
pagina ogni 20<br />
secon<strong>di</strong>.<br />
Riposizionando lo<br />
scroll bar nella<br />
posizione in cui era<br />
precedentemente.<br />
USE CASE #5<br />
SELEZIONE CODA<br />
GOAL IN CONTEXT Selezionare una coda in particolare<br />
PRECONDITIONS<br />
SUCCESS END<br />
CONDITIONS<br />
FAILED END<br />
CONDITIONS<br />
PRIMARY ACTOR<br />
TRIGGER<br />
Il server Tomcat ha <strong>di</strong>stribuito l'applicazione e caricato la<br />
pagina JSP. Il sistema ha già crato i grafici.<br />
L'applicazione visualizza i grafici relativi alla coda scelta<br />
dall'utente.<br />
Non ci sono grafici per la coda selezionata. Visualizzazione<br />
del messaggio: “No results for this combination”.<br />
Utente<br />
Selezione <strong>di</strong> una coda dal menù <strong>di</strong> scelta.<br />
DESCRIPTION STEP n° USER SYSTEM<br />
EXTENSIONS A<br />
1 Seleziona una coda<br />
dal menù <strong>di</strong> scelta<br />
2 Il sistema ricarica la<br />
pagina.<br />
3 Viene aggiornata la<br />
variabile <strong>di</strong><br />
sessione “lacoda”<br />
4 Il sistema ricrea la<br />
lista effettuando<br />
una query sulla<br />
tabella code del<br />
database e<br />
visualizza la coda<br />
selezionata<br />
5 Vengono<br />
visualizzati i grafici<br />
relativi alla coda<br />
selezionata<br />
Nessun grafico per<br />
Tommaso Foglia 961/147 Pagina 61 <strong>di</strong> 150
la coda selezionata<br />
5a<br />
Il sistema informa<br />
l'utente con un<br />
messaggio d'errore.<br />
USE CASE #6<br />
SELEZIONE VO<br />
GOAL IN CONTEXT Selezionare una VO in particolare<br />
PRECONDITIONS<br />
SUCCESS END<br />
CONDITIONS<br />
FAILED END<br />
CONDITIONS<br />
PRIMARY ACTOR<br />
TRIGGER<br />
Il server Tomcat ha <strong>di</strong>stribuito l'applicazione e caricato la<br />
pagina JSP. Il sistema ha già crato i grafici.<br />
L'applicazione visualizza i grafici relativi alla VO scelta<br />
dall'utente.<br />
Non ci sono grafici per la VO selezionata. Visualizzazione del<br />
messaggio: “No results for this combination”.<br />
Utente<br />
Selezione <strong>di</strong> una VO dal menù <strong>di</strong> scelta.<br />
DESCRIPTION STEP n° USER SYSTEM<br />
EXTENSIONS A<br />
1 Seleziona una VO<br />
dal menù <strong>di</strong> scelta<br />
2 Il sistema ricarica la<br />
pagina.<br />
3 Viene aggiornata la<br />
variabile <strong>di</strong><br />
sessione “lavo”<br />
4 Il sistema ricrea la<br />
lista effettuando<br />
una query sulla<br />
tabella vo del<br />
database e<br />
visualizza la vo<br />
selezionata<br />
5 Vengono<br />
visualizzati i grafici<br />
relativi alla vo<br />
selezionata<br />
Nessun grafico per<br />
la vo selezionata<br />
5a<br />
Il sistema informa<br />
l'utente con un<br />
Tommaso Foglia 961/147 Pagina 62 <strong>di</strong> 150
messaggio d'errore.<br />
Dopo questa prima in<strong>di</strong>viduazione <strong>di</strong> quelli che sono i requisiti funzionali, riguardanti<br />
cioè le funzionalità che un utente comune, può aspettarsi dal sistema, sono passato<br />
all'analisi <strong>degli</strong> strumenti già esistenti, in modo da poter poi così delineare quale sarà<br />
il design dell'applicazione e in modo da poter capire quali sono i requisiti non<br />
funzionali.<br />
Cioè quei requisiti che non espressi <strong>di</strong>rettamente dall'utente, ma che sono richiesti dal<br />
sistema, per un suo corretto funzionamento o per garantire usabilità e affidabilità.<br />
Altri requisiti, dettati dal sistema possono scaturire dal suo dominio applicativo.<br />
Tommaso Foglia 961/147 Pagina 63 <strong>di</strong> 150
5.2 Analisi del prototipo e <strong>degli</strong> strumenti già esistenti<br />
Il lavoro <strong>di</strong> potenziamento delle funzionalità inizia dal prendere atto <strong>degli</strong> strumenti<br />
già presenti, frutto del lavori <strong>di</strong> tesi <strong>di</strong> laurea <strong>di</strong> colleghi della stessa facoltà. In primis<br />
bisogna ricordare lo schema per la memorizzazione delle informazioni provenienti<br />
dal sistema <strong>di</strong> monitoraggio. Il lavoro <strong>di</strong> tesi <strong>di</strong> laurea del dott. Marazita, è incentrato<br />
sulla creazione <strong>di</strong> un database <strong>di</strong> tipo Mysql ed è pensato per accogliere le<br />
misurazioni necessarie ad una storicizzazione, sud<strong>di</strong>visa per intervalli temporali.<br />
La mappatura del sistema fa uso delle seguenti tabelle:<br />
• Job (#JobId , idQueue , StatusPBS, User, Queue_name, Job_name,<br />
Submit_time, CPU_time, MEM, Exec_Host, Exec_time, WCT, Ctime,<br />
P_Etime, SWAP, From_Host, MemLimit, P_Elapsed_time);<br />
• Utenti (#IdUtente , User, IdGruppo );<br />
• Gruppi (#IdGruppo, IdVo, Nome, Tipo);<br />
• VO (#IdVo, Nome);<br />
• Code (#IdQueue, Queue_name, Max, Description, lm_CPU_time,<br />
lm_WallTime, L_RSV, L_JL_U, L_JL_P, L_JL_H, P_LmNode, P_LmQueue,<br />
P_lm, P_type, P_Run);<br />
• Vo-Coda (#IdVo , #IdCoda);<br />
• Admin (#IdScheduler, Nome, TimeD, TimeW, TimeY ).<br />
Per la mappatura, l'associazione gruppo-coda è stato delineato per risolvere il<br />
problema <strong>di</strong> in<strong>di</strong>viduazione. Le tabelle Job e Code, sono quelle che porteranno il<br />
maggior numero <strong>di</strong> informazioni per descrivere il sistema.<br />
Per memorizzare le informazioni sullo stato delle code sono utilizzate le seguenti<br />
tabelle:<br />
• HD_coda(#IdQueue, #date, Tot, Run, Pend ,Held)<br />
Tommaso Foglia 961/147 Pagina 64 <strong>di</strong> 150
• HD_vo(IdQueue, date, IdVo, Tot, Run, Pend, Held)<br />
• HD_gruppo(#IdGruppo, #data, Tot, Run, Pend, Held)<br />
• HW_coda(#IdQueue, #data, VTot, VRun, VPend, Vheld, MTot, MRun,<br />
MPend, MHeld, DTot, DRun, DPend, DHeld)<br />
• HW_vo(IdQueue, data, IdVo, VTot, VRun, VPend, Vheld, MTot, MRun,<br />
MPend, MHeld, DTot, DRun, DPend, DHeld)<br />
• HW_gruppo(#IdGruppo, #data, VTot, VRun, VPend, Vheld, MTot, MRun,<br />
MPend, MHeld, DTot, DRun, DPend, DHeld)<br />
• HM_coda(#IdQueue , #data, VTot, VRun, VPend, Vheld, MTot, MRun,<br />
MPend, MHeld, DTot, DRun, DPend, DHeld)<br />
• HM_vo(IdQueue, data, IdVo, VTot, VRun, VPend, Vheld, MTot, MRun,<br />
MPend, MHeld , DTot, DRun, DPend, DHeld)<br />
• HM_gruppo(#IdGruppo, #data, VTot, VRun, VPend, Vheld, MTot, MRun,<br />
MPend , MHeld, DTot, DRun , DPend, DHeld)<br />
• HY_coda(#IdQueue, #data, VTot, VRun , VPend , Vheld, MTot, MRun,<br />
MPend, MHeld, DTot, DRun, DPend , DHeld)<br />
• HY_vo(IdQueue, data, IdVo, VTot, VRun , VPend , Vheld, MTot, MRun,<br />
MPend, MHeld, DTot, DRun, DPend, DHeld )<br />
• HY_gruppo(#IdGruppo, #data, VTot, VRun, VPend, Vheld, MTot, MRun,<br />
MPend, MHeld, DTot, Drun, DPend, Dheld)<br />
Le tabelle HD_coda/vo/gruppo, HW_coda/vo/gruppo e HM_coda/vo/gruppo si<br />
riferiscono agli stati del sistema delle ultime 24 ore (Day), <strong>degli</strong> ultimi sette giorni<br />
(Week), <strong>degli</strong> ultimi 30 giorni(Month) e <strong>degli</strong> ultimi 365 giorni(Year). Nelle tabelle<br />
relative al giorno si conserveranno le informazioni riguardanti i job (totali, running,<br />
pen<strong>di</strong>ng e sospesi) che risiedono sulla griglia al momento dell'osservazione.<br />
Tommaso Foglia 961/147 Pagina 65 <strong>di</strong> 150
Per quanto riguarda le informazioni non giornaliere, si calcolerà la me<strong>di</strong>a, la varianza<br />
e la deviazione standard relative alle ultime osservazioni effettuate sul sistema.<br />
Oltre a conservare le informazioni relative alla mappatura tra gruppi,code,utenti e<br />
VO, è realizzato per storicizzare le informazioni relative alle misurazioni giornaliere,<br />
settimanali, mensili ed annue. In ogni tabella sono presenti sia le informazioni per<br />
descrivere il reale stato dell'occupazione delle code, sia quelle relative al controllo dei<br />
livelli critici, cercando <strong>di</strong> andare a formare uno storico che sia il più completo<br />
possibile. Molto utile si è rilevato lo script per la creazione automatica del Database.<br />
Figura 20: Struttura del Database Mysql Monitor utilizzato.<br />
Il lavoro <strong>di</strong> tesi della dott.ssa Luisa Cesarano è rivolto alla creazione <strong>di</strong> un sistema<br />
automatico per la parserizzazione automatica dei dati proveniente dal batch system.<br />
Tommaso Foglia 961/147 Pagina 66 <strong>di</strong> 150
Capace <strong>di</strong> interfacciarsi sia con sistemi PBS che con sistemi LSF, il prototipo creato<br />
interroga ad intervalli regolari i sistemi <strong>di</strong> gestione delle code, riuscendone a carpire<br />
in tempo reale i cambiamenti.<br />
La parserizzazione automatica delle informazioni avviene tramite applicazione JAVA,<br />
denominata Parser, e permette l'inserimento automatico dei dati nella struttura dati<br />
ideata dal dott. Marazita.<br />
La storicizzazione dei dati avviene in un'ottica Round Robin( si parla <strong>di</strong> RRD, Round<br />
Robin Database) dove, con finestra temporale fissa, i dati che non appartengono più<br />
alla finestra temporale prestabilita vengono automaticamente sovrascritti da quelli<br />
nuovi.<br />
Questa metodologia permette <strong>di</strong> mantenere fissa la grandezza del Database,<br />
sovrascrivendo i dati obsoleti non viene permesso un aumento dei record. Il Database<br />
con l'applicazione deputata al suo popolamento è pensata per essere <strong>di</strong>slocata<br />
geograficamente. Necessario è il collegamento con il batch system per cogliere i<br />
cambiamenti sullo stato delle code.<br />
E' compito <strong>di</strong> un altro modulo JAVA, StackedArea, quello <strong>di</strong> collegarsi al database<br />
per effetuare le query. Estratti i dati l'applicazione ha il compito, <strong>di</strong> organizzarli, <strong>di</strong><br />
prepararli e tramite librerie JfreeChart <strong>di</strong> creare grafici che riescano a mostrare le<br />
informazioni che sono state raccolte. I grafici creati mostrano le informazioni salienti<br />
sullo stato <strong>di</strong> occupazione delle code, da parte <strong>di</strong> utenti, gruppi e/o VO.<br />
Sono sud<strong>di</strong>visi principalmente secondo un criterio temporale, lo stesso che abbiamo<br />
visto essere utilizzato nella formazione delle tabelle: giorno, settimana, mese, anno.<br />
Il prototipo per la creazione <strong>di</strong> grafici è in grado <strong>di</strong> funzionare in due modalità: XML<br />
e Database.<br />
La prima modalità è quella che realmente è stata portata a termine. Sfruttando la<br />
capacità <strong>di</strong> alcuni batch system <strong>di</strong> offrire informazioni sullo stato delle code già in<br />
formato XML, i dati vengono recuperati tramite strumenti DOM e resi <strong>di</strong>sponibili per<br />
la creazione dei grafici tramite le librerie JfreeChart.<br />
Tommaso Foglia 961/147 Pagina 67 <strong>di</strong> 150
In questa modalità il sistema è capace <strong>di</strong> fotografare la situazione dell'occupazione<br />
delle code, ma non in grado <strong>di</strong> storicizzare la produzione, poiché i file XML vengono<br />
<strong>di</strong> volta in volta sovrascritti, ad ogni aggiornamento del sistema.<br />
La modalità Database, <strong>di</strong> cui abbiamo inquadrato il funzionamento generale, è stata<br />
ideata e sviluppata, ma mai testata realmente.<br />
Tommaso Foglia 961/147 Pagina 68 <strong>di</strong> 150
5.3 Design del sistema ed implementazione dei requisiti funzionali<br />
Considerando l'integrazione con un Enterprise Portal, come Liferay, <strong>di</strong> cui ho già<br />
parlato e considerando l'analisi <strong>degli</strong> strumenti già esistenti, per la realizzazione del<br />
primo requisito, ho ritenuto opportuno ricollegarmi alla tecnologia JAVA utilizzando<br />
una JSP(Java Server Page), in modo che l'integrazione con le tecnologie JAVA<br />
esistenti, fosse il più semplice possibile.<br />
Per la visualizzazione dei grafici salvati su <strong>di</strong>sco fisso, ho esaminato il criterio <strong>di</strong><br />
memorizzazione. I grafici creati sono già sud<strong>di</strong>visi in cartelle secondo un primo<br />
criterio, temporale, che li porta ad essere contenuti nella cartella <strong>di</strong> riferimento al<br />
periodo che mostrano: i grafici mostranti le informazioni giornaliere saranno nella<br />
cartella Giornalieri, quelli settimanali saranno contenuti nella cartella Settimanali,<br />
quelli mensili saranno così contenuti nella cartella Mensile e così via.<br />
Figura 21: Criterio <strong>di</strong> memorizzazione su <strong>di</strong>sco.<br />
Tommaso Foglia 961/147 Pagina 69 <strong>di</strong> 150
L'applicazione web, riesce a controllare l'intero contenuto <strong>di</strong> una cartella,<br />
recuperando il numero dei file e il loro nome. Alla prima visita ho scelto <strong>di</strong> far<br />
mostrare le informazioni più richieste dagli utenti del sistema, cioè quelle riguardanti<br />
lo stato attuale delle code.<br />
Verranno quin<strong>di</strong> visualizzati i grafici contenuti nella cartella Giornalieri. E' possibile<br />
visualizzare i grafici relativi ad un altro periodo temporale. Ho inserito un form <strong>di</strong><br />
tipo HTML con dei RADIO BUTTON, il pregio <strong>di</strong> questa tecnologia, oltre a quella <strong>di</strong><br />
appesantire il carico della pagina, è quella <strong>di</strong> poter far visualizzare il criterio<br />
correntemente utilizzato, evidenziandone subito l'eventuale cambiamento. I bottoni<br />
riportano un'immagine che ne in<strong>di</strong>ca il tipo <strong>di</strong> criterio:<br />
• Daily<br />
• Weekly<br />
• Montly<br />
• Annual<br />
• Custom<br />
Nell'utilizzare i bottoni viene creata una variabile <strong>di</strong> sessione che ha il compito <strong>di</strong><br />
ricordare la scelta effettuata. Di default il valore è impostato a Giornalieri, ma<br />
cambiandola viene memorizzata ed utilizzata per far apparire il tag checked<br />
all'interno del bottone utilizzato.<br />
Di seguito è visualizzato l'effetto sulla pagina JSP e parte del co<strong>di</strong>ce riguardante la<br />
creazione del form per la scelta del criterio temporale e della creazione delle variabili<br />
<strong>di</strong> sessione.<br />
Figura 22: Dettaglio della barra <strong>di</strong> navigazione per la scelta del tempo.<br />
Tommaso Foglia 961/147 Pagina 70 <strong>di</strong> 150
Figura 23: Co<strong>di</strong>ce della pagina JSP relativo alla formazione del menù per la scelta<br />
del tempo e creazione della relativa variabile <strong>di</strong> sessione.<br />
Stesso meccanismo viene utilizzato per la scelta del criterio <strong>di</strong> visualizzazione. Nelle<br />
cartelle che abbiamo visto su <strong>di</strong>sco fisso, sono contenuti <strong>di</strong>versi tipi <strong>di</strong> grafici, <strong>di</strong>visi<br />
in quattro categorie.<br />
I grafici contenuti nella cartella utilizzeranno la seguente nomenclatura:<br />
• coda.<br />
• codaDettagli...<br />
• vo.<br />
• other.<br />
Per permettere una visualizzazione più ristretta, che permettesse la focalizzazione su<br />
un solo tipo <strong>di</strong> grafici a cui si è interessati ho aggiunto una seconda serie <strong>di</strong> bottoni, il<br />
cui funzionamento riprende il funzionamento visto precedentemente.<br />
Tommaso Foglia 961/147 Pagina 71 <strong>di</strong> 150
I bottoni sono affiancati da una serie <strong>di</strong> immagini in<strong>di</strong>canti:<br />
• queue<br />
• queue details<br />
• vo<br />
• other<br />
Figura 24: Dettaglio della barra <strong>di</strong> navigazione per la scelta del criterio <strong>di</strong><br />
visualizzazione.<br />
Viene memorizzata una seconda variabile <strong>di</strong> sessione, che ha il compito <strong>di</strong><br />
memorizzare e quin<strong>di</strong> <strong>di</strong> ricordare quali tipi <strong>di</strong> grafico sti stanno visualizzando. Anche<br />
qui è stato creato un criterio <strong>di</strong> default, infatti l'applicazione mostrerà al primo avvio<br />
in grafici relativi alle code. Nell'immagine sottostante viene mostrato quello che<br />
costituisce la barra <strong>di</strong> navigazione.<br />
Figura 25: In figura è mostrata la scritta e la barra <strong>di</strong> navigazione con i bottoni per<br />
applicare un <strong>di</strong>verso criterio <strong>di</strong> visualizzazione.<br />
Per offrire una migliore interazione con l'utente, per fare in modo che si possano<br />
visualizzare in modo imme<strong>di</strong>ato le informazione ricercate, ho pensato <strong>di</strong> fornire un<br />
filtro sulle code attualmente monitorate dal sistema. In maniera <strong>di</strong>namica, tramite<br />
Tommaso Foglia 961/147 Pagina 72 <strong>di</strong> 150
l'integrazione <strong>di</strong> co<strong>di</strong>ce HTML e co<strong>di</strong>ce JAVA e stato possibile creare un form <strong>di</strong><br />
scelta con menù a ten<strong>di</strong>na dove sono rappresentate le code attualmente sotto<br />
osservazione da parte del sistema.<br />
La pagina JSP si collega al database ed effettuando una query sulla tabella delle<br />
code permette <strong>di</strong> creare un menù aggiornato su quelle che sono le code realmente<br />
operanti.<br />
Anche per questo filtro ho ritenuto opportuno creare una variabile <strong>di</strong> sessione, il cui<br />
scopo è permettere <strong>di</strong> visualizzare i grafici desiderati, oltre al permettere <strong>di</strong> ricordare<br />
la scelta effettuata.<br />
Di seguito è visualizzato il co<strong>di</strong>ce <strong>di</strong> riferimento alla query sul database Mysql per la<br />
creazione del menù <strong>di</strong> scelta.<br />
Figura 26: Dettaglio del co<strong>di</strong>ce per la creazione del menù <strong>di</strong> scelta delle code, con<br />
query sul database in tempo reale.<br />
Tommaso Foglia 961/147 Pagina 73 <strong>di</strong> 150
Figura 27: Menù per la scelta della coda.<br />
Lo stesso <strong>di</strong>scorso avviene per le VO, dove l'applicazione, collegandosi al database<br />
ed effettuando una query sulla tabella delle vo, permette la creazione del menù <strong>di</strong><br />
scelta con le VO che attualmente lavorano sulle code monitorate dal batch system.<br />
Il tutto sarà visualizzato in un altro form. Anche qui è stata creata una variabile <strong>di</strong><br />
sessione per ricordare il filtro sulle VO.Nel caso in cui si stiano visualizzando i<br />
grafici relativi alle codeDettagli, il sistema presenterà entrambi i menù <strong>di</strong> scelta, in<br />
modo da poter filtrare i grafici in base ai due criteri: in base alle code , in base alle<br />
VO o entrambi. In questo, la creazione <strong>di</strong> variabili <strong>di</strong> sessione, permette all'utente <strong>di</strong><br />
non dover riselezionare il filtro desiderato, ogni qual volta decida si sfogliare grafici<br />
<strong>di</strong>versi. Ad esempio un utente <strong>di</strong> una determinata VO o operante su una determinata<br />
coda, troverà utile poter visualizzare in maniera semplice solo le informazioni a cui è<br />
interessato.<br />
Tommaso Foglia 961/147 Pagina 74 <strong>di</strong> 150
Figura 29: Menù per la sceltà della VO.<br />
Tommaso Foglia 961/147 Pagina 75 <strong>di</strong> 150
Figura 30: Visualizzazione in tempo reale delle code monitorare e delle VO operanti<br />
sul sistema monitorato. Menù visibili quando si richiede <strong>di</strong> visualizzare i grafici<br />
relativi ai dettagli delle code.<br />
Per quanto concerne la realizzazione del secondo requisito, che richiedeva una<br />
cospicua storicizzazione dei dati, c'è stato bisogno <strong>di</strong> intervenire sull'applicazione<br />
Parser, per adeguarlo alle nuove esigenze.<br />
Come già sottolineato, il prototipo non è mai stato testato, se non in locale, nella<br />
modalità Database. La creazione dei grafici avveniva tramite la modalità XML.<br />
Dovendo pensare ad una storicizzazione dei dati che permetta <strong>di</strong> conservare le<br />
informazioni e <strong>di</strong> ricreare i grafici fino ai 2 anni precedenti, si è dovuti passare a<br />
prendere in considerazione la modalità Database.<br />
L'applicazione JAVA, Parser, che ha il compito <strong>di</strong> parserizzare le informazioni<br />
provenienti dal batch system, per poi renderle <strong>di</strong>sponibili all'inserimento nel database,<br />
è stata creata come un processo in continua esecuzione che ad intervalli regolari <strong>di</strong><br />
tempo si attiva per carpire i nuovi cambiamenti e per effettuare gli inserimenti<br />
all'interno del database.<br />
Il meccanismo presenta un problema nella parserizzazione del file XML, che viene<br />
creato automaticamente quando si interroga il batch system. Nel testare le<br />
funzionalità della modalità Database ci si è resi conto che con il mutare dei dati,<br />
l'applicazione effettua solo una prima parserizzazione del file XML(viene creato<br />
l'albero DOM del documento XML solo una volta).<br />
Tommaso Foglia 961/147 Pagina 76 <strong>di</strong> 150
Nelle successive attivazioni, tramite timer, del Parser, la parserizzazione del nuovo<br />
file contenente le informazioni aggiornate non avveniva in modo corretto,<br />
producendo un'immissione <strong>di</strong> record fotocopia all'interno del database.<br />
E' stato necessario uno smembramento e la creazione, come mostrerò in Appen<strong>di</strong>ce,<br />
<strong>di</strong> nuovi classi e meto<strong>di</strong>, per fare in modo che l'applicazione, tramite l'orologio <strong>di</strong><br />
sistema (crontab) riesca ad essere mandata in esecuzione nei momenti giusti per<br />
effettuare <strong>degli</strong> inserimenti che rispecchino fedelmente la situazione reale.<br />
E' stata mo<strong>di</strong>ficata la signature del metodo principale che manda in esecuzione<br />
l'applicazione, in modo che possa accogliere un flag temporale, inoltre è stata creata<br />
una classe che permette <strong>di</strong> richiamare il giusto metodo per effettuare l'inserimento nel<br />
database in base al corretto criterio temporale.<br />
Per una riproduzione fedele dello stato <strong>di</strong> occupazione delle code è opportuno<br />
interrogare costantemente ad intervalli regolari <strong>di</strong> 5 minuti, il batch system. Per<br />
questo è stato utilizzato l'orologio <strong>di</strong> sistema per fare in modo che in automatico<br />
venga lanciato uno script per l'aggiornamento.<br />
Considerando che il batch system viene interrogato ad intervalli regolari <strong>di</strong> 5 minuti<br />
si è pensato <strong>di</strong> lanciare in esecuzione l'applicazione, con lo stesso intervallo <strong>di</strong> tempo.<br />
Utilizzando un flag 'giornaliero', in modo da produrre un inserimento nelle tabelle<br />
giornaliere, si fa in modo che la tabella giornaliera sia popolata con i dati quanto più<br />
sensibili al minimo cambiamento sullo stato monitorato.<br />
La stessa scelta è stata effettuata per gli altri inserimenti. Cambiando il flag e<br />
assegnando intervalli <strong>di</strong>fferenti, è possibile popolare anche le altre tabelle. Per avere<br />
inserimenti settimanali si è pensato <strong>di</strong> fare un inserimento ogni 3 ore. Per quelle<br />
mensili un inserimento ogni 12 ore e infine per quelle annuali ogni 5 giorni.<br />
Di seguito sono visualizzate le chiamate che l'orologio <strong>di</strong> sistema (crontab) per fare in<br />
modo che le giuste chiamate avvengano in modo automatico nei tempi giusti.<br />
Tommaso Foglia 961/147 Pagina 77 <strong>di</strong> 150
Figura 31: Output del comando crontab -l per l'utente che ha installato<br />
l'applicazione.<br />
Sempre nell'ambito della mutabilità dei dati, sempre nel concetto che con dati statici<br />
non ci si è trovati ad avere problemi, si è dovuto inserire qualche controllo sui dati,<br />
per evitare che l'applicazione sollevi eccezioni.<br />
Appurato il corretto funzionamento del Parser, per l'inserimento delle informazioni<br />
all'interno del Database, ho dovuto mo<strong>di</strong>ficare la finestra temporale, che con una<br />
tecnica Round Robin, provvedeva alla sovrascrizione dei record passati.<br />
Il Database, ha una finestra temporale <strong>di</strong> Round Robin, molto breve. Ha la capacità <strong>di</strong><br />
accogliere i dati che servono alla creazione dei grafici.<br />
La tabella hd_coda, ad esempio, conterrà le informazioni relative alle misurazioni<br />
giornaliere, ovvero avrà tutte le misurazioni dal momento preso in esame fino alle 24<br />
ore precedenti.<br />
Tommaso Foglia 961/147 Pagina 78 <strong>di</strong> 150
La tabella hw_coda, ad esempio, conterrà tutte le misurazioni settimanali, riguardanti<br />
le informazioni dal momento preso in esame fino ai 7 giorni precedenti. Stesso<br />
ragionamento avviene per le tabelle mensili ed annuali.<br />
Il taglio automatico delle tabelle avviene in modo che nelle tabelle ci siano tutte e<br />
sole le informazioni necessarie alla corretta creazione dei grafici.<br />
Il prototipo è modellato su questo sistema e nel raccogliere queste informazioni non<br />
prevede nessun filtro temporale, poiché necessita <strong>di</strong> tutte le informazioni presenti in<br />
ogni tabella.<br />
Nell'effettuare un ampliamento nella finestra <strong>di</strong> Round Robin, portando la<br />
storicizzazione dei dati a 2 anni, tutte le tabelle saranno in grado <strong>di</strong> contenere i dati<br />
relativi agli ultimi 2 anni <strong>di</strong> monitoraggio, rendendo consistente la crescita delle<br />
tabelle giornaliere,settimanali e mensili, ma limitandone comunque superiormente la<br />
crescita.<br />
Perseguita una storicizzazione dei dati più cospicua, bisogna fare in modo che<br />
l'applicazione per la creazione dei grafici, riesca a ricreare i grafici utilizzando<br />
informazioni su un periodo passato, conservate all'interno del database.<br />
L'applicazione per la creazione dei grafici utilizza delle query che prelevano l'intero<br />
contenuto delle tabelle.<br />
L'allargamento della finestra <strong>di</strong> Round Robin ha reso necessario una mo<strong>di</strong>fica al<br />
modo <strong>di</strong> elaborare le query. Le query dovranno ospitare un filtro temporale, in modo<br />
da poter recuperare solo i dati che sono realmente necessari alla determinazione dei<br />
grafici per il periodo richiesto.<br />
E' auspicabile che l'utente richieda <strong>di</strong> visualizzare i grafici <strong>di</strong> un periodo passato. Il<br />
sistema deve fornire la stessa “fotografia” che avrebbe scattato il giorno in cui i dati<br />
sono stati generati.<br />
Nel filtraggio dei dati recuperati dal database, ho provato un approccio meno<br />
invasivo. Ho pensato <strong>di</strong> lasciare l'operazione <strong>di</strong> filtraggio a carico dell'applicazione<br />
JAVA per la creazione dei grafici. L'applicazione per la creazione dei grafici resta<br />
Tommaso Foglia 961/147 Pagina 79 <strong>di</strong> 150
immutata nelle sue query, ma presenta un filtro sul numero <strong>degli</strong> inserimenti, in modo<br />
da risalire ai reali valori inseriti in quel periodo temporale.<br />
Se questo permette <strong>di</strong> non sconvolgere il co<strong>di</strong>ce dell'applicazione, utilizzandone solo<br />
le sue funzionalità, tuttavia rendeva estremamente farraginoso il lavoro della<br />
creazione dei grafici, producendo ritar<strong>di</strong> eccessivi nella visualizzazione, soprattutto<br />
nel caso <strong>di</strong> grafici su richiesta.<br />
Ho pensato ad un'ottimizzazione del Database. Le tabelle del database, utilizzando un<br />
termine geometrico, sono ad intersezione non vuota.<br />
Quando il Parser effettua un inserimento settimanale ogni 3 ore, non fa altro che<br />
inserire nella tabella settimanale un'informazione che è stata comunque inserita nella<br />
tabella settimanale. Se l'ottimizzazione sembra vantaggiosa, i vantaggi derivanti da<br />
quest'ultima non sono elevati.<br />
Il Database ospita all'interno delle tabelle, salvo che per quelle giornaliere, dati<br />
statici, come me<strong>di</strong>a e varianza, che, con un taglio delle tabelle, in modo da lasciare<br />
solo quelle giornaliere, andrebbero persi. Inoltre la tabella giornaliera è quella, che<br />
con l'ampliamento della finestra <strong>di</strong> Round Robin, ha subito l'incremento maggiore , in<br />
termini <strong>di</strong> spazio occupato sul <strong>di</strong>sco fisso, è l'unica che non può essere eliminata. In<br />
definitiva ho ritenuto inopportuno seguire questa strategia .<br />
Si è palesata la necessità <strong>di</strong> una ristrutturazione delle query, dove l'inserimento nella<br />
clausola WHERE <strong>di</strong> un criterio temporale, è stato opportuno al fine <strong>di</strong> ottenere<br />
esclusivamente i valori necessari a creare i grafici.<br />
Le clausole WHERE sono state introdotte in tutte le query, in ogni tipo <strong>di</strong> grafico, la<br />
clausola è stata adattata al tipo <strong>di</strong> grafico che si sta creando: le query per i grafici<br />
giornalieri, raccoglieranno solo i dati della data richiesta, quelli settimanali,<br />
partiranno dalla data richiesta per giungere fino ai 7 giorni precedenti e così via.<br />
Il co<strong>di</strong>ce riportato <strong>di</strong> seguito evidenzia la presenza della clausola temporale nel<br />
campo WHERE, inoltre viene riportata anche la query originale.<br />
Tommaso Foglia 961/147 Pagina 80 <strong>di</strong> 150
E' riportata una sola query come esempio, in appen<strong>di</strong>ce verranno poi evidenziate le<br />
<strong>di</strong>fferenze in tutte le query restanti.<br />
Figura 32: Dettaglio del co<strong>di</strong>ce <strong>di</strong> una query presa ad esempio. Notare come la<br />
clausola WHERE viene mo<strong>di</strong>ficata <strong>di</strong> volta in volta per adattarsi al tipo <strong>di</strong> grafico da<br />
realizzare.<br />
Figura 33: Dettaglio query originale. Assente la clausola WHERE.<br />
Nell'applicazione web è stato necessario introdurre un metodo per permettere<br />
all'utente <strong>di</strong> selezionare una data per la quale si vogliono visualizzare i grafici.Per il<br />
riempimenti <strong>di</strong> un form con un campo Date, ho introdotto un calendario in Javascript<br />
che ha il compito <strong>di</strong> permettere all'utente <strong>di</strong> selezionare la data. Anche per la data ho<br />
provveduto a creare una variabile <strong>di</strong> sessione, con il compito <strong>di</strong> informare l'utente<br />
Tommaso Foglia 961/147 Pagina 81 <strong>di</strong> 150
sulla data relativa ai grafici che sta visualizzando.<br />
Figura 34: Calendario Javascript utilizzato per la scelta della data.<br />
Anche la chiamata all'applicazione StackedArea, che ha il compito <strong>di</strong> creare i grafici,<br />
dovrà subire una mo<strong>di</strong>fica. E' necessario che l'utente, e quin<strong>di</strong> la pagina JSP,<br />
comunichi all'applicazione la data desiderata. E' stato necessario utilizzare una nuova<br />
signature, in modo che ci sia posto anche per la data. Il parametro così scelto<br />
dall'utente sarà salvato per la visualizzazione ed inviato all'applicazione per essere<br />
cosi' utilizzato da filtro nel campo WHERE.<br />
Figura 35: Dettaglio del co<strong>di</strong>ce raffigurante la chiamata all'applicazione per la<br />
generazione <strong>di</strong> grafici dove viene aggiungo il parametro data.<br />
Tommaso Foglia 961/147 Pagina 82 <strong>di</strong> 150
Per quanto riguarda il terzo requisito, ho dovuto costruire una nuova funzionalità.<br />
L'applicazione per la creazione dei grafici, non contempla la creazione <strong>di</strong> grafici con<br />
un periodo a scelta dell'utente. Produce i grafici relativi ai criteri temporali che già<br />
sono stati illustrati. Per inserire questa funzionalità è stato necessario aggiungere<br />
anche qui alcuni meto<strong>di</strong>, come verrà evidenziato esaustivamente in appen<strong>di</strong>ce.<br />
L'applicazione che produceva la stessa serie <strong>di</strong> grafici, per ogni criterio temporale,<br />
dovrà lavorare su un nuovo criterio che prevede la scelta da parte dell'utente. Nel<br />
momento in cui si sceglie il periodo custom, l'applicazione web ci permette <strong>di</strong><br />
selezionare due date: una <strong>di</strong> inizio periodo e l'altra <strong>di</strong> fine periodo. Per l'acquisizione<br />
<strong>di</strong> queste date è stato utilizzato un form con due campi <strong>di</strong> tipo Date. In tutti e due i<br />
campi è stato utilizzato un calendario Javascript per l'acquisizione.<br />
Figura 36: Selezionato il criterio temporale "custom", l'applicazione visualizza un<br />
form con due calendari per la scelta del periodo.<br />
Nel momento in cui vengono in<strong>di</strong>cate 2 date, il sistema controlla che il periodo <strong>di</strong><br />
riferimento corrisponda ad un periodo sul quale sia possibile costruire dei grafici.<br />
Non saranno accettati perio<strong>di</strong> precedenti alla data della creazione del database,<br />
perio<strong>di</strong> sconfinanti in date future, perio<strong>di</strong> dove la data <strong>di</strong> partenza risulta posteriore<br />
alla data <strong>di</strong> fine periodo o viceversa.<br />
Create altre due variabili <strong>di</strong> sessione, si presenta la necessità <strong>di</strong> comunicare<br />
all'applicazione StackedArea, i valori acquisiti, in modo da poter effettuare un<br />
filtraggio sull'intervallo temporale.<br />
Tommaso Foglia 961/147 Pagina 83 <strong>di</strong> 150
All'interno dell'applicazione ho inserito un controllo per riconoscere il tipo <strong>di</strong> grafici<br />
che viene chiesto <strong>di</strong> essere creato. Ho ideato una nuova signature, contenente<br />
entrambe le date, <strong>di</strong> inizio e fine periodo. L'applicazione dovrà creare esclusivamente<br />
i grafici relativi al periodo selezionato, quin<strong>di</strong> non dovrà produrre i grafici relativi<br />
agli altri criteri temporali. Di seguito sono riportate le mo<strong>di</strong>fiche alla chiamata per la<br />
generazioni <strong>di</strong> grafici <strong>di</strong> tipo Custom. Saranno passati come parametri le due date<br />
scelte dall'utente.<br />
Figura 37: Dettaglio del co<strong>di</strong>ce raffigurante la chiamata all'applicazione per generari<br />
i grafici dove vengono aggiunti i parametri relativi alle due date.<br />
Inoltre è presente un esempio <strong>di</strong> query con filtro temporale con due date.<br />
La clausola WHERE sarà utilizzata per filtrare tutti i dati appartenenti al periodo<br />
scelto dall'utente.<br />
Figura 38: Dettaglio del co<strong>di</strong>ce <strong>di</strong> una query. Notare nel campo WHERE la presenza<br />
<strong>di</strong> un filtro utilizzando le due date scelte dall'utente.<br />
Tommaso Foglia 961/147 Pagina 84 <strong>di</strong> 150
Le date scelte per il periodo saranno passate all'applicazione JAVA e saranno<br />
utilizzate per filtrare i dati recuperati dal database. I grafici creati saranno collocati<br />
nella cartella della data <strong>di</strong> inizio periodo, nella sua sottocartella della data <strong>di</strong> fine<br />
periodo, sottocartella che sarà allo stesso livello delle cartelle che contengono i<br />
grafici giornalieri,settimanali,mensili ed annui.<br />
Tommaso Foglia 961/147 Pagina 85 <strong>di</strong> 150
5.4 Requisiti non funzionali<br />
Nell'implementazione dei requisiti funzionali si è tenuto conto <strong>di</strong> alcuni requisiti non<br />
funzionali che hanno posto determinati problemi e per i quali è stata pensata una<br />
soluzione.<br />
E' stato mo<strong>di</strong>ficato il file <strong>di</strong> avvio del sistema ospitante l'applicazione, in modo che<br />
all'avvio del sistema, ed in seguito a qualsiasi crash o riavvio, il server Tomcat sia<br />
avviato in automatico. In questo modo il sistema non avrà problemi ad interagire con<br />
la pagina jsp, che potrà quin<strong>di</strong>, permettere all'utente <strong>di</strong> visualizzare in modo<br />
<strong>di</strong>namico, i grafici relativi ad un periodo predefinito o quelli relativi ad un periodo a<br />
scelta dell'utente.<br />
Figura 39: Servizio Tomcat attivo all'avvio della macchina.<br />
Il prototipo del sistema era formato in <strong>di</strong>versi sue parti, da un processo che si attivava<br />
ad intervalli <strong>di</strong> tempo. Liberarsi da questo modo <strong>di</strong> lavorare, e l'aver aggiunto delle<br />
chiamate all'orologio <strong>di</strong> sistema(crontab) ha fatto in modo che il sistema sia attivo ad<br />
ogni crash o riavvio non essendo più necessaria una chiamata manuale. Una<br />
soluzione pensata inserendo solo una chiamata con l'orologio <strong>di</strong> sistema in<br />
associazione al processo in continua esecuzione avrebbe attivato più istanze<br />
dell'applicazione che effettuavano le stesse operazioni.<br />
Per quanto riguarda la memorizzazione dei grafici, creati in formato jpg, ho scelto <strong>di</strong><br />
mantenere la struttura a cartelle con la sud<strong>di</strong>visione in giornalieri, settimanali, mensili<br />
Tommaso Foglia 961/147 Pagina 86 <strong>di</strong> 150
e annui. I grafici che venivano creati dal prototipo andavano a sovrascrivere i grafici<br />
creati precedentemente, senza avere la possibilità <strong>di</strong> conservarli.<br />
La tecnica messa a punto, mira a <strong>di</strong>minuire le richieste <strong>di</strong> creazione <strong>di</strong> grafici. Le<br />
cartelle della <strong>di</strong>visione temporale sono create all'interno <strong>di</strong> una cartella il cui nome<br />
rappresenta la data <strong>di</strong> riferimento per quei grafici.<br />
Un primo approccio prevedeva la creazione dei grafici solo quando ce ne fosse stato<br />
realmente bisogno. Ogni qualvolta si sottometteva alla pagina JSP la data<br />
corrispondente alla data o<strong>di</strong>erna, i dati venivano ricreati, in modo da far visualizzare<br />
tutti gli ultimi aggiornamenti.<br />
Questa tipologia <strong>di</strong> utilizzo non favoriva una visualizzazione multiutente, infatti c'e' il<br />
rischio che i grafici siano ricreati innumerevoli volte, durante l'intero arco della<br />
giornata.<br />
Inoltre i grafici <strong>di</strong> riferimento ad una data passata, venivano conservati nel sistema,<br />
ma rappresentavano la situazione aggiornata all'orario dell'ultimo accesso <strong>di</strong> un<br />
utente. Questo faceva si che si trovassero grafici che, non appartenendo alla giornata<br />
corrente, non venivano rigenerati, ma che riproducevano informazioni non complete.<br />
Un checkbox “replot” permetteva <strong>di</strong> ricreare i grafici per quella data, in modo che<br />
mostrassero esaurientemente i dati <strong>di</strong> quella giornata.<br />
Se da una parte può tornare utile fornire all'utente strumenti che gli consentano una<br />
corretta visualizzazione <strong>di</strong> tutte le informazioni <strong>di</strong> cui ha bisogno, dall'altra lasciare la<br />
creazione <strong>di</strong> grafici in questo modo, permetteva una <strong>di</strong>stribuzione del lavoro non<br />
uniforme, con lunghi perio<strong>di</strong> <strong>di</strong> inattività e con perio<strong>di</strong> invece <strong>di</strong> intenso lavoro, senza<br />
poter porre un limite superiore alla quantità <strong>di</strong> chiamate all'applicazione per generare<br />
i grafici.<br />
Un'ottimizzazione nella creazione dei grafici è stata sviluppata tenendo conto <strong>di</strong><br />
queste problematiche. Tramite l'orologio <strong>di</strong> sistema, partendo dalle 00:20, ogni 30<br />
minuti vengono creati dei grafici aggiornati per la data corrente. L'ultima chiamata<br />
avviene alle 23:50, in modo che i grafici riportati nella cartella <strong>di</strong> una giornata,<br />
Tommaso Foglia 961/147 Pagina 87 <strong>di</strong> 150
ispecchino fino all'ultimo il reale stato <strong>di</strong> occupazione della coda.<br />
Di seguito sono mostrate le chiamate che l'orologio <strong>di</strong> sistema effettua<br />
automaticamente per la creazione dei grafici.<br />
Figura 40: Chiamate all'applicazione per la generazione dei grafici che sono inserite<br />
nel crontab dell'utente root.<br />
Questa tecnica, permette <strong>di</strong> limitare superiormente il numero massimo <strong>di</strong> grafici che<br />
vengono creati per ogni data. Il sistema produrrà per ogni data 48 volte la stessa<br />
tipologia <strong>di</strong> grafici e <strong>di</strong> volta in volta i grafici copriranno l'intero arco temporale della<br />
giornata.<br />
Inoltre per evitare la creazione continua <strong>di</strong> grafici recenti, è stata creata una<br />
subroutine JAVA ,eliminagrafici, che ogni notte viene lanciata tramite crontab<br />
dall'utente root.<br />
L'applicazione controlla i nomi delle cartelle(sono date), fa un cast del tipo, per farlo<br />
<strong>di</strong>ventare <strong>di</strong> tipo DATE e tramite le funzioni messe a <strong>di</strong>sposizione da questa classe<br />
confronta la data memorizzata con la data corrente, cancellando tutta la produzione <strong>di</strong><br />
grafici più vecchia <strong>di</strong> 150 giorni.<br />
Proprio per questo motivo, nella creazione dei grafici “custom” ho scelto <strong>di</strong><br />
memorizzare i grafici nella cartella “data inizio periodo” creando una sottocartella<br />
“data fine periodo”. Anche questi grafici creati su richiesta saranno cancellati se la<br />
data <strong>di</strong> inizio periodo sarà antecedente i 150 giorni.<br />
Di seguito è mostrata la chiamata all'orologio <strong>di</strong> sistema che ogni notte effettua la<br />
pulizia dei grafici creati dall'applicazione.<br />
Tommaso Foglia 961/147 Pagina 88 <strong>di</strong> 150
Figura 41: Chiamata inserita nel crontab dell'utente root per la cancellazione<br />
automatica della produzione <strong>di</strong> grafici obsoleta.<br />
Di seguito è riproposto un esempio <strong>di</strong> esecuzione dell'applicazione eliminagrafici.<br />
Figura 42: Output dell'applicazione eliminagrafici.<br />
Questo tipo <strong>di</strong> memorizzazione permette un'imme<strong>di</strong>ata visualizzazione, tramite<br />
l'applicazione web, dei grafici creati negli ultimi 150 giorni, mantenendo quasi del<br />
tutto costante lo spazio occupato dai grafici sul <strong>di</strong>sco, lasciando alla sola creazione<br />
dei grafici su richiesta la libertà <strong>di</strong> far accrescere lo spazio occupato.<br />
Si è ridotto drasticamente il numero <strong>di</strong> chiamate alla funzione per creare grafici,<br />
offrendo un notevole guadagno in termini <strong>di</strong> performance per l'applicazione web.<br />
Non solo gli utenti troveranno già pronti i grafici relativi agli ultimi 150 giorni ma,<br />
due utenti, interessati ad esaminare lo stesso periodo custom, potranno<br />
tranquillamente visualizzare gli stessi grafici, senza ricorrere ad una nuova<br />
generazione e quin<strong>di</strong> ad un appesantimento del sistema.<br />
Nel casono si voglia visualizzare <strong>di</strong> una data antecedente i 150 giorni, il sistema<br />
provvederà alla creazione dei grafici, li renderà <strong>di</strong>sponibili all'utente fino alle ore 4:10<br />
Tommaso Foglia 961/147 Pagina 89 <strong>di</strong> 150
del giorno successivo. Orario in cui l'applicazione eliminagrafici viene mandata in<br />
esecuzione e i grafici saranno così cancellati.<br />
Nel caso <strong>di</strong> un accesso al sistema tra la mezzanotte e la prima creazione dei grafici,<br />
l'applicazione considera il giorno corrente non ancora creato, alla stregua <strong>di</strong> una<br />
giornata antecedente i 150 giorni, provvedendo alla creazione su <strong>di</strong>sco della cartella<br />
con la data e delle cartelle con i grafici.<br />
Nel creare grafici <strong>di</strong> tipo custom è stata inserita oltre ad una pausa <strong>di</strong> circa 8 secon<strong>di</strong>,<br />
all'interno della pagina JSP, un'pplicazione Javascript che informi l'utente del<br />
proce<strong>di</strong>mento <strong>di</strong> creazione dei grafici, in modo che la pagina nel crearsi non incorra<br />
in problemi <strong>di</strong> visualizzazione, dovuti all'eventuale lentezza dell'applicazione<br />
StackedArea nel rilasciare i primi grafici creati.<br />
Figura 43: Immagine dell'applicazione Javascript che informa l'utente riguardo<br />
all'elaborazione dei grafici per il periodo richiesto.<br />
Tommaso Foglia 961/147 Pagina 90 <strong>di</strong> 150
Per ovviare ai tempi <strong>di</strong> attesa nel caso in cui ci sia un appesantimento del sistema ho<br />
inserito un refresh automatico della pagina. Ho utilizzato un'applicazione Javascript<br />
per ricordare la posizione della scroll bar verticale, in modo che l'utente possa<br />
continuare a visualizzare i grafici che stava già visualizzando precedentemente, senza<br />
essere annoiato dal refresh <strong>di</strong> pagina.<br />
Tommaso Foglia 961/147 Pagina 91 <strong>di</strong> 150
5.5 Class <strong>di</strong>agram<br />
Per quanto riguarda il Class <strong>di</strong>agram delle applicazioni utilizzate nel complesso del<br />
sistema, Parser e StackedArea, vi è l'aggiunta <strong>di</strong> una nuova classe nel package Parser<br />
dell'applicazione Parser.jar e <strong>di</strong> una classe nel package StackedArea.<br />
Per quanto riguarda il Parser, come ho già spiegato, la necessità della creazione <strong>di</strong><br />
una nuova classe è scaturita dall'operazione <strong>di</strong> smembramento. Non lavorando più<br />
come processo che si riattiva tramite Timer, l'applicazione ha bisogno <strong>di</strong> comprendere<br />
le varie chiamate che riceve, <strong>di</strong> interpretare i nuovi argomenti che gli vengono passati<br />
e <strong>di</strong> produrre poi i giusti inserimenti. La creazione <strong>di</strong> una nuova classe<br />
AggiornaBatch.java ci assicura che il file XML aggiornato, contenente le nuove<br />
informazioni sullo stato effettivo <strong>di</strong> occupazione delle code, venga nuovamente<br />
processato. In questo modo l'applicazione effettua una nuova creazione dell'albero<br />
DOM del documento XML. Questo ha reso possibile che il popolamento del<br />
Database avvenga in maniera corretta.<br />
Per il modulo Parser, le classi sono:<br />
• AggiornaBatch: questa classe ha il compito <strong>di</strong> risolvere il problema della<br />
creazione dell'albero DOM del documento XML.<br />
• Configuratore: classe che controlla l'esistenza dei in input provenienti da<br />
interrogazioni del batch system, e crea un oggetto <strong>di</strong> tipo ManagerParser.<br />
• ManagerParser: classe che gestisce il sistema, interfacciandosi con il<br />
database, o con i file XML, effettuando operazioni come creazione e lettura<br />
del file <strong>di</strong> configurazione del sito, e creando l'oggetto <strong>di</strong> tipo ParserScheduler.<br />
• ParserScheduler: classe che si occupa dell'effettiva lettura dello stato delle<br />
code, effettuando il parser dei file xml provenienti dall'output dei coman<strong>di</strong> che<br />
interrogano lo stato dei batch system.<br />
• XMLValidator: classe che si occupa della gestione dei documenti xml.<br />
Tommaso Foglia 961/147 Pagina 92 <strong>di</strong> 150
• GridComponent: classe che contiene le informazioni generali sulle<br />
componenti della grid, reca, infatti, i meto<strong>di</strong> ed attributi comuni a<br />
VirtualOrganization, Coda, Gruppo.<br />
• VirtualOrganization: sottoclasse <strong>di</strong> GridComponent, mantiene informazioni<br />
sulla Vo, come il numero totali <strong>di</strong> job provenienti dai membri della vo, nei<br />
<strong>di</strong>versi stati.<br />
• Gruppo: sottoclasse <strong>di</strong> GridComponent, mantiene le informazioni relative ai<br />
gruppi facenti parte delle vo.<br />
• Coda: sottoclasse <strong>di</strong> GridComponent, mantiene informazioni sulle code<br />
associate alle Vo.<br />
Tommaso Foglia 961/147 Pagina 93 <strong>di</strong> 150
Possiamo <strong>di</strong>videre il modulo StackedArea in due parti, per la parte relativa alla<br />
produzione <strong>di</strong> grafici ci sono le seguenti classi:<br />
• Configuratore: classe che controlla l'esistenza dei file XML prodotti dal<br />
parser o la presenza dei dati nel database e permette l'avvio del generatore <strong>di</strong><br />
grafici.<br />
• GeneratoreGrafici: classe che si occupa della creazione perio<strong>di</strong>ca dei grafici<br />
• Grafico: classe, legge le informazioni recuperate dal parser, estraendole dai<br />
file xml o dal database, e produce i grafici in <strong>di</strong>versi formati.<br />
Le classi per la generazione dei grafici, interagiscono con le restanti classi che<br />
recuperano i dati dal Database.<br />
Tommaso Foglia 961/147 Pagina 94 <strong>di</strong> 150
Per la parte relativa alla GestioneDatabase, che nel suo class <strong>di</strong>agram non ha subito<br />
cambiamenti rilevanti, riportiamo le seguenti classi:<br />
• MyConnection: classe che effettua e gestisce la connessione al database.<br />
• DBCoda: classe che si occupa <strong>di</strong> gestire le informazioni relative alle code,<br />
all'interno del database.<br />
• DBGruppo: classe che si occupa <strong>di</strong> gestire le informazioni relative ai gruppi,<br />
all'interno del database.<br />
• DBVo: classe che si occupa <strong>di</strong> gestire le informazioni relative alle Virtual<br />
Organization, all'interno del database.<br />
• DBJob: classe che gestisce le informazioni relative ai job.<br />
• DBOsservazioni: classe che inserisce le misurazioni sullo stato delle code, vo e<br />
gruppi nel database<br />
• DBScheduler: classe che gestisce le informazioni sui batch system e sui siti che si<br />
stanno monitorando, gestisce anche i dati relativi agli intervalli temporali tra una<br />
misurazione e la successiva, per osservazioni giornaliere, settimanali, mensili ed<br />
annuali.<br />
• ControllerTimerTaskGiorno: classe che permette <strong>di</strong> gestire il timer per effettuare<br />
le misurazioni giornaliere, effettuando statistiche.<br />
• ControllerTimerTaskSettimana: classe che permette <strong>di</strong> gestire il timer per<br />
effettuare le misurazioni settimanali, effettuando statistiche.<br />
• ControllerTimerTaskMese: classe che permette <strong>di</strong> gestire il timer per effettuare le<br />
misurazioni mensili, effettuando statistiche.<br />
• ControllerTimerTaskAnno: classe che permette <strong>di</strong> gestire il timer per effettuare le<br />
misurazioni annuali, effettuando statistiche.<br />
• ControllerTimerTaskJob: classe che permette <strong>di</strong> gestire il timer per effettuare le<br />
misurazioni relative ai job presenti sulle code.<br />
Tommaso Foglia 961/147 Pagina 95 <strong>di</strong> 150
6 Conclusioni e sviluppi futuri<br />
Il sistema, come richiesto, permette la visualizzazioni <strong>di</strong> un'insieme <strong>di</strong> informazioni<br />
provenienti dal batch system. Tutti i requisiti sono stati implementati, cercando <strong>di</strong><br />
offrire all'utente, un sistema che sia facile da utilizzare ma che allo stesso tempo<br />
permetta <strong>di</strong> recuperare in maniera celere tutte le informazioni <strong>di</strong> cui ha bisogno.<br />
L'applicazione è già pre<strong>di</strong>sposta ad accogliere le informazioni provenienti da altri siti<br />
<strong>di</strong> monitoraggio, in modo da ottimizzare la natura <strong>di</strong>stribuita delle risorse che<br />
vengono monitorate.<br />
E' possibile lavorare con i due batch system presi in esame, ed uno sviluppo futuro<br />
potrà prevedere la possibilità <strong>di</strong> lavorare anche con altri batch system. Qualora gli<br />
utilizzatori lo ritengano necessario è anche possibile un ampliamento delle<br />
funzionalità, con l'introduzione <strong>di</strong> grafici o altri strumenti, allo scopo <strong>di</strong> poter<br />
visualizzare informazioni statistiche sull'attività <strong>di</strong> monitoraggio.<br />
Tommaso Foglia 961/147 Pagina 96 <strong>di</strong> 150
7 Bibliografia e Sitografia<br />
1. Introduction to grid computing, Frédéric Magoulès, Jie Pan, Kiat An Tan,<br />
Abhinit Kurnar. - Boca Raton : CRC press.<br />
2. Grid computing : making the global infrastructure a reality, E<strong>di</strong>ted by Fran<br />
Berman, Geoffrey Fox, Tony Hey. - Chichester [UK] : Wiley.<br />
3. WNoDeS: un servizio per la gestione <strong>di</strong> infrastrutture con<strong>di</strong>vise Cloud e Grid<br />
<strong>di</strong> D. Salomoni, A. Chierici, A. Italiano, E. Ronchieri, P. Solagna<br />
4. Reti <strong>di</strong> Calcolatori, A. S. Tanenbaum , Apogeo<br />
5. Sito PBS: http://hpc.sissa.it/pbs/pbs.html<br />
6. Sito Maui:<br />
http://www.adaptivecomputing.com/resources/docs/maui/mauiadmin.php<br />
7. Scalability Analysis of Job Scheduling using Virtual Nodes <strong>di</strong> Norman Bobro,<br />
Richard Coppinger, Liana Fong, Seetharami Seelam, Jing Xu<br />
8. Sito manuale LSF:<br />
http://users.cis.fiu.edu/~tho01/psg/3rdParty/lsf4_userGuide/admincontents.html<br />
Tommaso Foglia 961/147 Pagina 97 <strong>di</strong> 150
9. Sito Liferay :<br />
http://www.liferay.com/<br />
10. Sito Java:<br />
http://www.java.sun.com/<br />
11. Sito MySql<br />
http://mysql.it/<br />
12. Fondamenti <strong>di</strong> UML, J. T. Roff, McGraw-Hill, 2003<br />
13. Fabric Monitoring at the INFN Tier1 ,Joint OSG & EGEE Operations WS,<br />
Culham (UK) , Felice Rosso , 2005<br />
14. Sito centro testi <strong>Scope</strong>, dott. Fabrizio Marazita:<br />
http://www.scope.unina.it/tesi<strong>di</strong>laurea/Lists/Archivio%20Tesi%20<strong>di</strong><br />
%20Laurea/DispForm.aspxID=21<br />
15. Sito centro testi <strong>Scope</strong>, dott. Luisa Cesarano:<br />
http://www.scope.unina.it/tesi<strong>di</strong>laurea/Lists/Archivio%20Tesi%20<strong>di</strong><br />
%20Laurea/DispForm.aspxID=45<br />
Tommaso Foglia 961/147 Pagina 98 <strong>di</strong> 150
Appen<strong>di</strong>ce A<br />
Di seguito an<strong>di</strong>amo a mostrare il co<strong>di</strong>ce prodotto ex novo, relativo allo sviluppo del<br />
progetto WebApplication1.war, nello specifico verrà esaminata la pagina JSP. A<br />
seguire il co<strong>di</strong>ce relativo all'applicazione eliminagrafici.jar.<br />
Index.jsp :<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
html,body{margin:0;pad<strong>di</strong>ng:0}<br />
p{margin:0 10px 10px}<br />
a{<strong>di</strong>splay:block;color: #981793;pad<strong>di</strong>ng:10px}<br />
Tommaso Foglia 961/147 Pagina 99 <strong>di</strong> 150
<strong>di</strong>v#header h1{height:40px;line-height:40px;margin:0;<br />
pad<strong>di</strong>ng-left:10px;background: #EEE;color: #79B30B}<br />
<strong>di</strong>v#content1 {}<br />
<strong>di</strong>v#content2 {}<br />
<strong>di</strong>v#footer{background: #333;color: #FFF}<br />
<strong>di</strong>v#footer p{margin:0;pad<strong>di</strong>ng:5px 10px}<br />
<strong>di</strong>v#wrapper1{float:left;width:100%;margin-left:-50%}<br />
<strong>di</strong>v#wrapper2{float:right;width:50%;margin-left:-50%}<br />
<strong>di</strong>v#content1{margin-left:50%}<br />
<strong>di</strong>v#content2{margin-right:50%}<br />
<strong>di</strong>v#footer{clear:both;width:100%}<br />
#overlayfrm {background-color:#333; -moz-opacity:0.8; opacity:.80;<br />
filter:alpha(opacity=80);}<br />
<br />
<br />
<br />
<br />
<br />
RecoverScroll.start();<br />
<br />
Atlas Job monitoring<br />
<br />
<br />
Tommaso Foglia 961/147 Pagina 100 <strong>di</strong> 150
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Tommaso Foglia 961/147 Pagina 101 <strong>di</strong> 150
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
height="25" /><br />
<br />
<br />
<br />
<br />
<br />
<br />
data = oggi;<br />
}<br />
if (data5.after(unDate))<br />
{out.println("The required date is later than now");<br />
data = oggi;<br />
}<br />
}<br />
else {<br />
if(session.getAttribute("ladata")==null)<br />
data = oggi;<br />
else<br />
data = session.getAttribute("ladata").toString();<br />
}<br />
session.setAttribute("ladata",data);<br />
if (!tempo.startsWith("Cust"))<br />
{<br />
%><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
}<br />
//DATE PER I GRAFICI AD INTERVALLO<br />
String data1 = new String ();<br />
String data2 = new String ();<br />
Date data6,data7 = null;<br />
int d=1;<br />
if (request.getParameter("data1")!=null && request.getParameter("data2")!=null)<br />
{ data1 = request.getParameter("data1");<br />
data2 = request.getParameter("data2");<br />
if (!data1.isEmpty() && !data2.isEmpty())<br />
{ d=0; //porre d=0 per stampare i custom<br />
data6 = (Date)formato.parse(data1);<br />
data7 = (Date)formato.parse(data2);<br />
if (data7.before(data6))<br />
{<br />
out.println("Not a valid period: "+ data2 + " < " + data1);<br />
%>
if (data7.before(creazionedatabase) || data7.after(unDate))<br />
{ %> <br />
<br />
Start date<br />
Tommaso Foglia 961/147 Pagina 106 <strong>di</strong> 150
End date <br />
<br />
<br />
<br />
<br />
<br />
<br />
coda = session.getAttribute("lacoda").toString();<br />
}<br />
session.setAttribute("lacoda",coda);<br />
try{<br />
ResultSet rs = null;<br />
String query = null;<br />
if(criterio.startsWith("coda"))<br />
{query = "select Queue_name from coda order by Queue_name;";<br />
rs = stackedarea.ConnectionPool.inviaQuery(query);<br />
rs.beforeFirst();<br />
%> <br />
Queue selection <br />
all<br />
<br />
<br />
<br />
Tommaso Foglia 961/147 Pagina 108 <strong>di</strong> 150
Vo selection <br />
all<br />
out.print(Vo);%> <br />
<br />
}<br />
//SE I GRAFICI PER IL PERIDO CUSTOM SONO GIA' STATI CREATI PONGO D=1 per non<br />
farli ricalcolare<br />
if (fileObjects2[i].isDirectory() && fileNames2[i].matches(data1))<br />
{ String file3 =file2 + fileNames2[i] + "/";<br />
//out.println(file3);<br />
File f3 = new File(file3);<br />
String [] fileNames3 = f3.list();<br />
File [] fileObjects3= f3.listFiles();<br />
for (int z = 0; z < fileObjects3.length; z++)<br />
{if (fileObjects3[z].isDirectory() && fileNames3[z].matches(data2))<br />
{d=1;//out.println("Grafici gia' creati");<br />
}<br />
}<br />
}<br />
}<br />
VOLTA<br />
//PER IL GIORNO CORRENTE E' NECESSARIO GENERARE I GRAFICI OGNI<br />
(APPROCCI ABBANDONATI)<br />
// if(data.matches(oggi) && request.getParameter("data")!=null)<br />
// t=0;<br />
// CHECKBOX REPLOT ATTIVATO<br />
//if (request.getParameter("rielabora")!=null)<br />
// t=0;<br />
//CHIAMATA PER I GRAFICI A PERIODO PRESTABILITO<br />
String[] arg = new String[9];<br />
if (t==0)<br />
Tommaso Foglia 961/147 Pagina 111 <strong>di</strong> 150
System.out.println(" PLEASE WAIT - GENERATION IN<br />
PROGRESS");<br />
if (t==0)<br />
{<br />
arg[0] =("PBS");<br />
arg[1] =("-D") ;<br />
arg[2] = ("/home/qjmon/sito1/");<br />
arg[3] =("sito1");<br />
arg[4] = (data);<br />
arg[5] = ("Monitor");<br />
arg[6] = ("qjmon");<br />
arg[7] = ("admin");<br />
arg[8] = ("qjmon.scope.unina.it:3306");<br />
t=0");<br />
stackedarea.Configuratore.main(arg); //out.println("ho chimato con arg perchè<br />
//PAUSA PER FAR INIZIARE A PRODURRE QUALCHE GRAFICO ALTRIMENTI<br />
NULLPOINTER EXCEPTION<br />
Thread.sleep(8000);<br />
}<br />
//CHIAMATA PER GRAFICI CON PERIODO CUSTOM<br />
if (d==0)<br />
String[] arg1 = new String[11];<br />
System.out.println("<br />
PROGRESS");<br />
PLEASE WAIT - GENERATION IN<br />
if (d==0)<br />
{<br />
arg1[0] =("PBS");<br />
Tommaso Foglia 961/147 Pagina 112 <strong>di</strong> 150
arg1[1] =("-D") ;<br />
arg1[2] = ("/home/qjmon/sito1/");<br />
arg1[3] =("sito1");<br />
arg1[4] = (data);<br />
arg1[5] = ("Monitor");<br />
arg1[6] = ("qjmon");<br />
arg1[7] = ("admin");<br />
arg1[8] = ("qjmon.scope.unina.it:3306");<br />
arg1[9] = (data1);<br />
arg1[10] = (data2);<br />
stackedarea.Configuratore.main(arg1);//out.println("ho chimato con arg1<br />
perchè d=0");<br />
//PAUSA PER FAR INIZIARE A PRODURRE QUALCHE GRAFICO ALTRIMENTI<br />
NULLPOINTER EXCEPTION<br />
Thread.sleep(8000);<br />
}<br />
//CAMBIO VALORI PER POTER VISUALIZZARE I GRAFICI DEL PERIODO CUSTOM<br />
if (tempo.startsWith("Cust") )<br />
{if (!data1.isEmpty() && !data2.isEmpty())<br />
{data = data1;<br />
tempo = data2;<br />
//out.println("Now Plotting the custom period from " + data1 + " to " + data2);<br />
}<br />
else<br />
{tempo="test";<br />
//out.println("Please select a custom period");<br />
}<br />
} %><br />
Tommaso Foglia 961/147 Pagina 113 <strong>di</strong> 150
<br />
<br />
<br />
<br />
Tommaso Foglia 961/147 Pagina 114 <strong>di</strong> 150
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Tommaso Foglia 961/147 Pagina 115 <strong>di</strong> 150
<br />
<br />
<br />
<br />
<br />
<br />
fileNames[i].contains(vo))<br />
{// out.print("codaD codaD Vo");<br />
k=1;<br />
%><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Tommaso Foglia 961/147 Pagina 117 <strong>di</strong> 150
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Tommaso Foglia 961/147 Pagina 118 <strong>di</strong> 150
<br />
<br />
<br />
<br />
<br />
<br />
k=1;<br />
%><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
k=1;<br />
%><br />
<br />
<br />
<br />
<br />
tempo + "/" + fileNames[i] %>" id="img-background" width="600" height="500" /><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Tommaso Foglia 961/147 Pagina 122 <strong>di</strong> 150
}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Tommaso Foglia 961/147 Pagina 123 <strong>di</strong> 150
Eliminagrafici.java:<br />
package eliminagrafici;<br />
import java.text.*;<br />
import java.util.Date;<br />
import java.io.File;<br />
import java.util.Calendar;<br />
/**<br />
* @author DopatO<br />
* L'applicazione cancella ricorsivamente tutte le cartelle, relative ai grafici, più vecchie<br />
<strong>di</strong> 5 mesi.<br />
*/<br />
public class Eliminagrafici<br />
{ public static void main(String[] args)<br />
{ Calendar cal = Calendar.getInstance();<br />
System.out.println("Oggi : " + cal.getTime());<br />
cal.add(Calendar.DATE, -150);<br />
System.out.println("150 giori fa: " + cal.getTime());<br />
SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");<br />
//PATH DELLA CARTELLA GRAFICIDB<br />
String file2 = "/home/qjmon/sito1/" + "MONITOR/" + "GraficiDB/";<br />
File f2 = new File(file2);<br />
String [] fileNames2 = f2.list();<br />
File [] fileObjects2= f2.listFiles();<br />
Date date = null;<br />
int t=0;<br />
vengono cancellate<br />
//conta quante <strong>di</strong>rectory conteneti grafici <strong>di</strong> una deteminata data<br />
for (int i = 0; i < fileObjects2.length; i++)<br />
{ //out.println(fileObjects2[i]);<br />
Tommaso Foglia 961/147 Pagina 124 <strong>di</strong> 150
if (fileObjects2[i].isDirectory())<br />
{<br />
try{<br />
date = (Date)formato.parse(fileNames2[i]);<br />
if (date.before(cal.getTime()))<br />
{ String file3= (file2 + fileNames2[i] + "/");<br />
System.out.println(file3);<br />
File f3 = new File(file3);<br />
File [] fileObjects3= f3.listFiles();<br />
String [] fileNames3 = f3.list();<br />
for (int z = 0; z < fileObjects3.length; z++)<br />
{if (fileObjects3[z].isDirectory())<br />
{<br />
File f4 = new File(file3 + fileNames3[z]);<br />
File [] fileObjects4= f4.listFiles();<br />
String [] fileNames4 = f4.list();<br />
for (int q = 0; q < fileObjects4.length; q++)<br />
{fileObjects4[q].delete();<br />
}<br />
}<br />
fileObjects3[z].delete();<br />
}<br />
fileObjects2[i].delete();t++;<br />
System.out.println("<strong>di</strong>rectory cancellate:" + t);<br />
}<br />
}<br />
catch (ParseException e)<br />
{System.out.println("Exception :"+e);<br />
Tommaso Foglia 961/147 Pagina 125 <strong>di</strong> 150
}<br />
}<br />
}<br />
}<br />
}<br />
Tommaso Foglia 961/147 Pagina 126 <strong>di</strong> 150
Appen<strong>di</strong>ce B<br />
Di seguito verranno esaminati gli elementi costituenti l'applicazione Parser.jar.<br />
L'applicazione si sud<strong>di</strong>vide in due pacchetti Parser e GestioneDatabase. Il package<br />
Parser è composto dalle seguenti classi: AggiornaBatch.java, Configuratore.java,<br />
ControllerTimerFileG.java, ControllerTimerTaskGiorno.java, GridComponent.java,<br />
ManagerParser.java, ParserScheduler.java, TaskGiorno.java, XmlValidator.java.<br />
Il package GestioneDatabase è composto dalle seguenti classi: ConnectionPool.java,<br />
ConnectionPoolException.java, DBCoda.java, DBGruppo.java, DBJob.java,<br />
DBOsservazioni.java, DBScheduler.java, DBVo.java.<br />
Tuttavia l'ampliamento ha prodotto mo<strong>di</strong>fiche solo in alcuni <strong>di</strong> queste classi. Di<br />
seguito mostreremo solo le classe che hanno subito cambiamenti, evidenziando in<br />
modo particolare le nuove classi e le aggiunte <strong>di</strong> co<strong>di</strong>ce.<br />
AggiornaBatch.java:<br />
package Parser;<br />
import GestioneDatabase.*;<br />
import java.sql.ResultSet;<br />
import java.sql.SQLException;<br />
import java.util.Set;<br />
import java.util.TimerTask;<br />
import java.sql.Timestamp;<br />
import java.util.logging.Level;<br />
import java.util.logging.Logger;<br />
public class AggiornaBatch extends TimerTask {<br />
ManagerParser bacth;<br />
Tommaso Foglia 961/147 Pagina 127 <strong>di</strong> 150
String Sito;<br />
String Batch;<br />
public AggiornaBatch(String nomeSito,String nomeBatch){<br />
Sito=nomeSito;<br />
Batch=nomeBatch;<br />
}<br />
@Override<br />
public void run(){<br />
ManagerParser batch;<br />
batch = new ManagerParser("Job.xml",Sito, Batch, "Coda.xml");<br />
}<br />
}<br />
Configuratore.java:<br />
package Parser;<br />
import GestioneDatabase.*;<br />
import GestioneDatabase.ConnectionPool;<br />
import java.io.File;<br />
import java.util.Timer;<br />
import java.util.Set;<br />
public class Configuratore {<br />
static long secon<strong>di</strong>;<br />
public static String inputDatiScheduler,<br />
pathParserMONITOR, pathFileLog,<br />
pathOutputParserXML, pathOutputParserASC<strong>II</strong>,<br />
database, user, password, in<strong>di</strong>rizzo;<br />
Tommaso Foglia 961/147 Pagina 128 <strong>di</strong> 150
public static void main(String[] args) {<br />
ManagerParser batch;<br />
String Xsi = args[0]; // -X -NX<br />
String nomeBatch = args[1]; // LSF PBS<br />
String ModalitaDatabase = args[2]; // -D -ND<br />
String MappaSi = args[3]; // -M -N<br />
String PathMonitor = args[4]; // path della cartella monitor<br />
/* Inizializza il path della cartella MONITOR, che conterra tutti i file e cartelle<br />
* per un corretto funzionamento */<br />
pathParserMONITOR = PathMonitor + "/MONITOR/";<br />
inputDatiScheduler = pathParserMONITOR + "/mon/";<br />
pathFileLog = pathParserMONITOR + "file.log.txt";<br />
if (new File(pathParserMONITOR).isDirectory() == false) {<br />
new File(pathParserMONITOR).mk<strong>di</strong>rs();<br />
}<br />
if (ModalitaDatabase.compareToIgnoreCase("-ND") == 0) {<br />
String tempoMisurazione = args[5];<br />
/** Creazione dell'oggetto ManagerParser che prenderà i dati <strong>di</strong> intput dai file<br />
XML generati tramite i coman<strong>di</strong> per PBS : "PBS.txt" generato dal comando "qstat -x"<br />
per LSF : "LSF.txt" generato tramite il metodo statico "creaFileXML_LSF" dal file bj.txt */<br />
if (tempoMisurazione.compareToIgnoreCase("-g") == 0) {<br />
pathOutputParserXML = pathParserMONITOR + "XML/Giornalieri";<br />
pathOutputParserASC<strong>II</strong> = pathParserMONITOR + "ASC<strong>II</strong>/Giornalieri/";<br />
secon<strong>di</strong> = 86400;<br />
} else if (tempoMisurazione.compareToIgnoreCase("-s") == 0) {<br />
pathOutputParserXML = pathParserMONITOR + "XML/Settimanali";<br />
pathOutputParserASC<strong>II</strong> = pathParserMONITOR + "ASC<strong>II</strong>/Settimanali/";<br />
Tommaso Foglia 961/147 Pagina 129 <strong>di</strong> 150
secon<strong>di</strong> = 604800;<br />
} else if (tempoMisurazione.compareToIgnoreCase("-m") == 0) {<br />
pathOutputParserXML = pathParserMONITOR + "XML/Mensili";<br />
pathOutputParserASC<strong>II</strong> = pathParserMONITOR + "ASC<strong>II</strong>/Mensili/";<br />
secon<strong>di</strong> = 2592000;<br />
} else if (tempoMisurazione.compareToIgnoreCase("-a") == 0) {<br />
pathOutputParserXML = pathParserMONITOR + "XML/Annuali";<br />
pathOutputParserASC<strong>II</strong> = pathParserMONITOR + "ASC<strong>II</strong>/Annuali/";<br />
secon<strong>di</strong> = 31556926;<br />
}<br />
if (new File(pathOutputParserXML).isDirectory() == false) {<br />
new File(pathOutputParserXML).mk<strong>di</strong>rs();<br />
new File(pathOutputParserASC<strong>II</strong>).mk<strong>di</strong>rs();<br />
}<br />
if (Xsi.compareToIgnoreCase("-JX") == 0) {<br />
ManagerParser.creaFileJobXML_LSF("Job.xml", "bj.txt");<br />
}<br />
batch = new ManagerParser("Job.xml", null, nomeBatch, null);//<br />
inputDatiScheduler, pathOutputParserXML, pathOutputParserASC<strong>II</strong>);<br />
if (MappaSi.compareToIgnoreCase("-M") == 0) {<br />
/* Creazione del file XML che conterrà la mappatura tra Code - Vo - Gruppi<br />
* tramite i file "origineMappa.txt",generati tramite script shell basati su<br />
coman<strong>di</strong> PBS e LSF */<br />
batch.creaFileXML_Mappatura("origineMappa.txt");<br />
}<br />
/* Lettura della mappa del sito dal file xml */<br />
batch.leggiMappaGrid("mappa.conf.xml");<br />
Tommaso Foglia 961/147 Pagina 130 <strong>di</strong> 150
* Recupero delle informazioni sullo stato delle code/job */<br />
long epoch = System.currentTimeMillis() / 1000;<br />
System.out.println("info job GRUPPI - VO : da XML giorno");<br />
batch.recuperaInfoJobGruppi(secon<strong>di</strong>, epoch);<br />
System.out.println("info job CODE : da XML giorno");<br />
batch.recuperaInfoJobCode(secon<strong>di</strong>, epoch);<br />
System.out.println("Recupera Dettagli Code giorno");<br />
batch.recuperaDettagliUsoCoda(secon<strong>di</strong>, epoch);<br />
}<br />
if (ModalitaDatabase.compareToIgnoreCase("-D") == 0) {<br />
/* Database */<br />
int TD = Integer.parseInt(args[5]); // 5 min<br />
int TS = Integer.parseInt(args[6]); // 360 min = 6 ore<br />
int TM = Integer.parseInt(args[7]); // 720 min = 12 ore<br />
int TY = Integer.parseInt(args[8]); // 7200 min = 120 ore = 5 giorni<br />
String nomeSito = args[9];<br />
if (args.length > 10) {<br />
database = args[10];<br />
user = args[11];<br />
password = args[12];<br />
in<strong>di</strong>rizzo = args[13];<br />
}<br />
if (Xsi.compareToIgnoreCase("-JX") == 0) {<br />
ManagerParser.creaFileJobXML_LSF("Job.xml", "bj.txt");<br />
}<br />
if (Xsi.compareToIgnoreCase("-CX") == 0) {<br />
if (nomeBatch.compareToIgnoreCase("LSF") == 0) {<br />
ManagerParser.creaFileCodaXML_LSF("Coda.xml", "bq.txt");<br />
Tommaso Foglia 961/147 Pagina 131 <strong>di</strong> 150
}<br />
if (nomeBatch.compareToIgnoreCase("PBS") == 0) {<br />
ManagerParser.creaFileCodaXML_PBS("Coda.xml", "bq.txt");<br />
}<br />
}<br />
if (Xsi.compareToIgnoreCase("-JCX") == 0) {<br />
if (nomeBatch.compareToIgnoreCase("LSF") == 0) {<br />
ManagerParser.creaFileCodaXML_LSF("Coda.xml", "bq.txt");<br />
ManagerParser.creaFileJobXML_LSF("Job.xml", "bj.txt");<br />
}<br />
if (nomeBatch.compareToIgnoreCase("PBS") == 0) {<br />
ManagerParser.creaFileCodaXML_PBS("Coda.xml", "bq.txt");<br />
}<br />
}<br />
batch = new ManagerParser("Job.xml", nomeSito, nomeBatch, "Coda.xml");//,<br />
inputDatiScheduler, null, null);<br />
if (args.length == 16) {<br />
if (args[15].compareToIgnoreCase("-C") == 0) {<br />
System.out.println("Rinnovo Database");<br />
batch.eliminaDatabase();<br />
}<br />
}<br />
if (MappaSi.compareToIgnoreCase("-M") == 0) {<br />
batch.creaFileXML_Mappatura("origineMappa.txt");<br />
}<br />
batch.leggiMappaGrid("mappa.conf.xml");<br />
if (MappaSi.compareToIgnoreCase("-M") == 0) {<br />
System.out.println("Aggiornamento Database");<br />
Tommaso Foglia 961/147 Pagina 132 <strong>di</strong> 150
atch.aggiornaDatabase_Scheduler(TD, TS, TM, TY);<br />
System.out.println("Inserisce CODE - GRUPPI - VO ");<br />
batch.aggiornaDatabase_CodeVoGruppi("bq.txt");<br />
}<br />
//Timer timer = new Timer();<br />
DBJob.truncate();<br />
System.out.println("Inserisce JOB ");<br />
batch.aggiornaDatabase_Job();<br />
System.out.println(args[14]);<br />
if (args[14].compareToIgnoreCase("-g") == 0)<br />
{<br />
batch.Giorno(batch);<br />
}<br />
if (args[14].compareToIgnoreCase("-s") == 0)<br />
{<br />
batch.Settimana(batch);<br />
}<br />
if (args[14].compareToIgnoreCase("-m") == 0)<br />
{<br />
batch.Mese(batch);<br />
}<br />
if (args[14].compareToIgnoreCase("-a") == 0)<br />
{<br />
batch.Anno(batch);<br />
}<br />
Tommaso Foglia 961/147 Pagina 133 <strong>di</strong> 150
VECCHIA GESTIONE CON I TIMER<br />
// timer.schedule(new AggiornaBatch(nomeSito,nomeBatch), 0 , TD*60000);<br />
//timer.schedule(new TimerTaskJob(batch, Xsi), 100, TD * 60000); //1000 = 1<br />
secondo 60000= un minuto<br />
//timer.schedule(new ControllerTimerTaskGiorno(batch), 300, TD *<br />
60000); //1000 = 1 secondo 60000= un minuto<br />
// timer.schedule(new ControllerTimerTaskSettimana(batch), 400, TS * 60000);<br />
// timer.schedule(new ControllerTimerTaskMese(batch), 600, TM * 60000);<br />
// timer.schedule(new ControllerTimerTaskAnno(batch), 1200, TY * 60000);<br />
}<br />
}<br />
ManagerParser.java:<br />
Per la risoluzione della mancata rigenerazione dell'albero Dom del documento XML<br />
aggiornato è stato aggiunta qualche inclusione in testa al file<br />
import GestioneDatabase.*;<br />
import java.sql.ResultSet;<br />
import java.sql.SQLException;<br />
import java.util.Set;<br />
import java.util.logging.Level;<br />
import java.util.logging.Logger;<br />
e il co<strong>di</strong>ce <strong>di</strong> seguito in coda:<br />
public void Giorno (ManagerParser batch)<br />
{<br />
int minInGio = 1440;<br />
Set fuoriGruppo;<br />
System.out.println("Aggiornamento Misurazioni Giorno");<br />
int timeIntervalGio = DBScheduler.GetDay(batch.nomeScheduler,<br />
Tommaso Foglia 961/147 Pagina 134 <strong>di</strong> 150
atch.Nome_Sito);<br />
int numRow = minInGio / timeIntervalGio;<br />
int righeHd_vo = DBOsservazioni.CountTotOsservazioni("hd_vo");<br />
int righeHd_gruppo = DBOsservazioni.CountTotOsservazioni("hd_gruppo");<br />
int righeHd_coda = DBOsservazioni.CountTotOsservazioni("hd_coda");<br />
/*if (righeHd_coda > numRow) {<br />
DBOsservazioni.ElminaMin("hd_coda");<br />
}<br />
if (righeHd_gruppo > numRow) {<br />
DBOsservazioni.ElminaMin("hd_gruppo");<br />
}<br />
if (righeHd_vo > numRow) {<br />
DBOsservazioni.ElminaMin("hd_vo");<br />
}*/<br />
inserisciMisurazioniCoda_DB(batch);<br />
inserisciMisurazioniGruppo_DB(batch);<br />
inserisciMisurazioniFuoriGruppo_DB(batch);<br />
}<br />
public void Settimana(ManagerParser batch)<br />
{<br />
System.out.println("Aggiornamento Misurazioni Settimana");<br />
int minInSet = 10080;<br />
int timeIntervalSet = DBScheduler.GetWeek(batch.nomeScheduler,<br />
batch.Nome_Sito);<br />
int numRow = minInSet / timeIntervalSet;<br />
int righeHw_vo = DBOsservazioni.CountTotOsservazioni("hw_vo");<br />
int righeHw_gruppo = DBOsservazioni.CountTotOsservazioni("hw_gruppo");<br />
Tommaso Foglia 961/147 Pagina 135 <strong>di</strong> 150
int righeHw_coda = DBOsservazioni.CountTotOsservazioni("hw_coda");<br />
/*if (righeHw_coda >= numRow) {<br />
DBOsservazioni.ElminaMin("hw_coda");<br />
}<br />
if (righeHw_gruppo >= numRow) {<br />
DBOsservazioni.ElminaMin("hw_gruppo");<br />
}<br />
if (righeHw_vo >= numRow) {<br />
DBOsservazioni.ElminaMin("hw_vo");<br />
}*/<br />
DBOsservazioni.codaSettimana_inserisciOsservazioni(batch.nomeScheduler,<br />
batch.Nome_Sito);<br />
DBOsservazioni.gruppoSettimana_inserisciOsservazioni();<br />
DBOsservazioni.voSettimana_inserisciOsservazioni(batch.nomeScheduler,<br />
batch.Nome_Sito);<br />
}<br />
public void Mese(ManagerParser batch){<br />
System.out.println("Aggiornamento Misurazioni Mese");<br />
int minInMes = 525600;<br />
int timeIntervalMes = DBScheduler.GetMonth(batch.nomeScheduler,<br />
batch.Nome_Sito);<br />
int numRow = minInMes / timeIntervalMes;<br />
int righeHm_vo = DBOsservazioni.CountTotOsservazioni("hm_vo");<br />
int righeHm_gruppo = DBOsservazioni.CountTotOsservazioni("hm_gruppo");<br />
int righeHm_coda = DBOsservazioni.CountTotOsservazioni("hm_coda");<br />
/*if (righeHm_coda >= numRow) {<br />
DBOsservazioni.ElminaMin("hm_coda");<br />
}<br />
if (righeHm_gruppo >= numRow) {<br />
Tommaso Foglia 961/147 Pagina 136 <strong>di</strong> 150
DBOsservazioni.ElminaMin("hm_gruppo");<br />
}<br />
if (righeHm_vo >= numRow) {<br />
DBOsservazioni.ElminaMin("hm_vo");<br />
}*/<br />
DBOsservazioni.codaMese_inserisciOsservazioni(batch.nomeScheduler,<br />
batch.Nome_Sito);<br />
DBOsservazioni.gruppoMese_inserisciOsservazioni();<br />
DBOsservazioni.voMese_inserisciOsservazioni(batch.nomeScheduler,<br />
batch.Nome_Sito);<br />
}<br />
public void Anno(ManagerParser batch) {<br />
System.out.println("Aggiornamento Misurazioni Anno");<br />
int minInAnn = 525600;<br />
int timeIntervalAn = DBScheduler.GetYear(batch.nomeScheduler,<br />
batch.Nome_Sito);<br />
int numRow = minInAnn / timeIntervalAn;<br />
int righeHy_vo = DBOsservazioni.CountTotOsservazioni("hy_vo");<br />
int righeHy_gruppo = DBOsservazioni.CountTotOsservazioni("hy_gruppo");<br />
int righeHy_coda = DBOsservazioni.CountTotOsservazioni("hy_coda");<br />
/*if (righeHy_coda >= numRow) {<br />
DBOsservazioni.ElminaMin("hy_coda");<br />
}<br />
if (righeHy_gruppo >= numRow) {<br />
DBOsservazioni.ElminaMin("hy_gruppo");<br />
}<br />
if (righeHy_vo >= numRow) {<br />
DBOsservazioni.ElminaMin("hy_vo");<br />
}*/<br />
Tommaso Foglia 961/147 Pagina 137 <strong>di</strong> 150
DBOsservazioni.codaAnno_inserisci_Osservazioni(batch.nomeScheduler,<br />
batch.Nome_Sito);<br />
DBOsservazioni.GruppoAnno_inserisci_Osservazioni();<br />
DBOsservazioni.voAnno_inserisciOsservazioni(batch.nomeScheduler,<br />
batch.Nome_Sito);<br />
}<br />
private void inserisciMisurazioniCoda_DB(ManagerParser batch) {<br />
long epoch = System.currentTimeMillis() / 1000;<br />
Timestamp timestamp = new Timestamp(epoch * 1000);<br />
Set insiemeCode = batch.raggruppaCode();<br />
for (Coda c : insiemeCode) {<br />
try {<br />
int[] infoJobCoda = new int[]{0, 0, 0, 0, 0, 0, 0};<br />
infoJobCoda = batch.parser.recuperaInfoCodaDaXml(c.getNome());<br />
int Tot = infoJobCoda[4] + infoJobCoda[2] + infoJobCoda[1];<br />
DBOsservazioni.codaGiorno_inserisciOsservazioni(batch.nomeScheduler,<br />
timestamp, c.getNome(), String.valueOf(Tot), String.valueOf(infoJobCoda[2]),<br />
String.valueOf(infoJobCoda[1]), String.valueOf(infoJobCoda[4]), batch.Nome_Sito);<br />
} catch (Exception ex) {<br />
ManagerParser.printWriterFileLog.println("Eccezione da<br />
inserisciMisurazioniCoda_DB: " + ex.getMessage());<br />
}<br />
}<br />
}<br />
private void inserisciMisurazioniGruppo_DB(ManagerParser batch) {<br />
Set insiemeCode = batch.raggruppaCode();<br />
long epoch = System.currentTimeMillis() / 1000;<br />
Timestamp timestamp = new Timestamp(epoch * 1000);<br />
Tommaso Foglia 961/147 Pagina 138 <strong>di</strong> 150
for (Coda c : insiemeCode) {<br />
Set insiemeVOC = c.getVo();<br />
for (VirtualOrganization v : insiemeVOC) {<br />
int[] infoJobVO = new int[]{0, 0, 0};<br />
// Recupero per ogni Vo tutti i gruppi appartenenti<br />
Set gruppi = v.getGruppi();<br />
// Per ogni gruppo vengono estratte le informazioni relative ai JOB tramite il<br />
metodo del ParserScheduler<br />
for (Gruppo g : gruppi) {<br />
try {<br />
int[] infoJobGruppo = new int[]{0, 0, 0};<br />
infoJobGruppo = batch.parser.recuperaDettagliDaXml(g.getNome(),<br />
v.getNome(), c.getNome());<br />
int Tot = infoJobGruppo[0] + infoJobGruppo[1] + infoJobGruppo[2];<br />
for (int i = 0; i < 3; i++) {<br />
infoJobVO[i] += infoJobGruppo[i];<br />
}<br />
DBOsservazioni.gruppoGiorno_inserisciOsservazioni(batch.nomeSchedu<br />
ler, timestamp, g.getNome(), v.getNome(), c.getNome(), String.valueOf(Tot),<br />
String.valueOf(infoJobGruppo[0]), String.valueOf(infoJobGruppo[1]),<br />
String.valueOf(infoJobGruppo[2]), batch.Nome_Sito);<br />
} catch (Exception ex) {<br />
ManagerParser.printWriterFileLog.println("Eccezione da<br />
inserisciMisurazioniGruppi_DB: " + ex.getLocalizedMessage());<br />
}<br />
} // fine FOR gruppi<br />
int Tot = infoJobVO[ 0] + infoJobVO[ 1] + infoJobVO[ 2];<br />
DBOsservazioni.voGiorno_inserisciOsservazioni(batch.nomeScheduler,<br />
timestamp, v.getNome(), c.getNome(), String.valueOf(Tot),<br />
String.valueOf(infoJobVO[0]), String.valueOf(infoJobVO[1]),<br />
Tommaso Foglia 961/147 Pagina 139 <strong>di</strong> 150
String.valueOf(infoJobVO[2]), batch.Nome_Sito);<br />
} // fine FOR VO sulle VO<br />
}<br />
}<br />
private void inserisciMisurazioniFuoriGruppo_DB(ManagerParser batch) {<br />
long epoch = System.currentTimeMillis() / 1000;<br />
Timestamp timestamp = new Timestamp(epoch * 1000);<br />
int idSched = DBScheduler.getAdmin(batch.nomeScheduler, batch.Nome_Sito);<br />
// Recupera le info dalla struttura "fuoriGruppo" costruita dalla classe<br />
ParserScheduler<br />
ResultSet utenti = ConnectionPool.inviaQuery("select IdUtente, nome, IdCoda,<br />
idScheduler " +<br />
" from utente where idscheduler=" + idSched);<br />
try {<br />
if (utenti != null) {<br />
if (batch.nomeScheduler.compareTo("LSF") == 0) {<br />
while (utenti.next()) {<br />
int idUt = utenti.getInt("IdUtente");<br />
int idCod = utenti.getInt("IdCoda");<br />
ResultSet rs = ConnectionPool.inviaQuery("select p.statusPBS,<br />
p.numPBS, p.statusLSF, p.numLSF, " +<br />
" p.idutente, p.idqueue, p.job_name, " +<br />
" p.jobid_scheduler, p.nomeusers, c.queue_name from " +<br />
" (select j.statusPBS, count(j.statusPBS) as numPBS, j.statusLSF,<br />
count(j.statusLSF) as numLSF," +<br />
" j.idutente, j.idqueue, j.job_name, " +<br />
+ idUt + "'" +<br />
" jobid_scheduler, nomeusers FROM job as j where j.idutente='"<br />
Tommaso Foglia 961/147 Pagina 140 <strong>di</strong> 150
" and j.idqueue='" + idCod + "' group by statusPBS, statusLSF,<br />
j.idutente, j.idqueue) " +<br />
" as p join coda as c on p.idqueue=c.idqueue where<br />
c.idscheduler='" + idSched + "'");<br />
if (rs != null) {<br />
int r = 0;<br />
int w = 0;<br />
int q = 0;<br />
String nomeUt = null, coda = null;<br />
while (rs.next()) {<br />
nomeUt = rs.getString("nomeusers");<br />
coda = rs.getString("queue_name");<br />
String stat = rs.getString("statusLSF");<br />
if (stat.compareToIgnoreCase("R") == 0) {<br />
r = rs.getInt("numLSF");<br />
} else if (stat.compareToIgnoreCase("Q") == 0) {<br />
q = rs.getInt("numLSF");<br />
} else if (stat.compareToIgnoreCase("W") == 0) {<br />
w = rs.getInt("numLSF");<br />
}<br />
}<br />
int sumTot = r + w + q;<br />
DBOsservazioni.gruppoGiorno_inserisciOsservazioni(batch.nomeSche<br />
duler, timestamp, nomeUt, "", coda, String.valueOf(sumTot), String.valueOf(q),<br />
String.valueOf(r), String.valueOf(w), batch.Nome_Sito);<br />
}<br />
}<br />
} // IF batch system<br />
else {<br />
Tommaso Foglia 961/147 Pagina 141 <strong>di</strong> 150
while (utenti.next()) {<br />
int idUt = utenti.getInt("IdUtente");<br />
int idCod = utenti.getInt("IdCoda");<br />
System.out.println(idUt +"ciao"+ idCod);<br />
ResultSet rs = ConnectionPool.inviaQuery("select p.statusPBS,<br />
p.numPBS, " + " p.idutente, p.idqueue, p.job_name, " +<br />
" p.jobid_scheduler, p.nomeusers, c.queue_name from " +<br />
" (select j.statusPBS, count(j.statusPBS) as numPBS, j.statusLSF,<br />
count(j.statusLSF) as numLSF," + " j.idutente, j.idqueue, j.job_name, " +<br />
+ idUt + "'" +<br />
" jobid_scheduler, nomeusers FROM job as j where j.idutente='"<br />
" and j.idqueue='" + idCod + "' group by statusPBS, statusLSF,<br />
j.idutente, j.idqueue) " +<br />
" as p join coda as c on p.idqueue=c.idqueue where<br />
c.idscheduler='" + idSched + "'");<br />
if (rs != null) {<br />
int r = 0;<br />
int w = 0;<br />
int q = 0;<br />
String nomeUt = null, coda = null;<br />
while (rs.next()) {<br />
nomeUt = rs.getString("nomeusers");<br />
coda = rs.getString("queue_name");<br />
System.out.println(coda + "bprima");<br />
String stat = rs.getString("statusPBS");<br />
if (stat.compareToIgnoreCase("R") == 0) {<br />
r = rs.getInt("numPBS");<br />
} else if (stat.compareToIgnoreCase("Q") == 0) {<br />
q = rs.getInt("numPBS");<br />
Tommaso Foglia 961/147 Pagina 142 <strong>di</strong> 150
} else if (stat.compareToIgnoreCase("W") == 0) {<br />
}<br />
w = rs.getInt("numPBS");<br />
}<br />
int sumTot = r + w + q;<br />
System.out.println(nomeUt + coda);<br />
if (nomeUt != null || coda != null)<br />
DBOsservazioni.gruppoGiorno_inserisciOsservazioni(batch.nomeSche<br />
duler, timestamp, nomeUt, "", coda, String.valueOf(sumTot), String.valueOf(q),<br />
String.valueOf(r), String.valueOf(w), batch.Nome_Sito);<br />
}<br />
} // WHILE NEXT<br />
} // ELSE su batch system<br />
}// IF UTENTI == NULL<br />
} catch (SQLException ex) {<br />
Logger.getLogger(ControllerTimerTaskGiorno.class.getName()).log(Level.SEVER<br />
E, null, ex);<br />
}<br />
}<br />
}<br />
Tommaso Foglia 961/147 Pagina 143 <strong>di</strong> 150
Appen<strong>di</strong>ce C<br />
Di seguito saranno riproposte esclusivamente le integrazioni <strong>di</strong> co<strong>di</strong>ce<br />
sull'applicazione StackedArea per la creazione <strong>di</strong> grafici. L'applicazione<br />
StackedArea.jar è composta dalle seguenti classi: AvvioGrafici.java,<br />
Configuratore.java, ConnectionPool.java, ConnectionPoolException.java,<br />
DBScheduler.java, GeneratoreGrafici.java, Grafico.java, XMLValidator.java.<br />
AvvioGrafici.java è <strong>di</strong> nuova creazione:<br />
package stackedarea;<br />
import java.text.*;<br />
import java.util.Date;<br />
import java.io.File;<br />
import java.util.Calendar;<br />
/**<br />
* @author DopatO<br />
*/<br />
public class AvvioGrafici {<br />
public static void main(String[] args){<br />
Date unDate = new Date();<br />
SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");<br />
String data = formato.format(unDate);<br />
System.out.println(data);<br />
String[] arg = new String[9];<br />
//out.println("GENERANDO");<br />
arg[0] =("PBS");<br />
arg[1] =("-D") ;<br />
arg[2] = ("/home/qjmon/sito1/");<br />
Tommaso Foglia 961/147 Pagina 144 <strong>di</strong> 150
arg[3] =("sito1");<br />
arg[4] = (data);<br />
arg[5] = ("Monitor");<br />
arg[6] = ("qjmon");<br />
arg[7] = ("admin");<br />
arg[8] = ("qjmon.scope.unina.it:3306");<br />
stackedarea.Configuratore.main(arg);<br />
}<br />
}<br />
Configuratore.java è stato adeguato con le seguenti linee, per creare anche i grafici<br />
Custom:<br />
//Creazione cartella Output anche per il nuovo caso C<br />
File CartellaOutputDB,CartellaOutputC;<br />
//CASO CODA<br />
else if (!datad1.isEmpty()) {<br />
CartellaOutputC = new File(folderOutput_C);<br />
CartellaOutputDB = CartellaOutputC;<br />
for (i = 0; i < numCode; i++) {<br />
Grafico graficoC = new Grafico(vetCode[i], -1,<br />
CartellaOutputDB.getAbsolutePath(), "coda." + nomeCode[i],<br />
"hc_coda",datad1,datad2);<br />
graficoC.idScheduler = idScheduler;<br />
listaGraficiDB_C.add(graficoC);<br />
}<br />
//CASO VO<br />
Tommaso Foglia 961/147 Pagina 145 <strong>di</strong> 150
else if (!datad1.isEmpty()) {<br />
CartellaOutputC = new File(folderOutput_C);<br />
CartellaOutputDB = CartellaOutputC;<br />
for (i = 0; i < numVo; i++) {<br />
Grafico graficoC = new Grafico(vetVo[i], -1,<br />
CartellaOutputDB.getAbsolutePath(), "vo." + nomeVo[i], "hc_gruppo",datad1,datad2);<br />
graficoC.idScheduler = idScheduler;<br />
listaGraficiDB_VG.add(graficoC);<br />
}<br />
//CASO CODA DETTAGLI<br />
else if (!datad1.isEmpty()) {<br />
CartellaOutputC = new File(folderOutput_C);<br />
CartellaOutputDB = CartellaOutputC;<br />
for (i = 0; i < numGrup; i++) {<br />
Grafico graficoC = new Grafico(idCoda[i], idVoG[i],<br />
CartellaOutputDB.getAbsolutePath(), "codaDettagli." + nomeCoda[i] + "." + nomeVo[i],<br />
"hc_gruppo",datad1,datad2);<br />
graficoC.idScheduler = idScheduler;<br />
listaGraficiDB_VG.add(graficoC);<br />
}<br />
//CASO OTHER<br />
else if (!datad1.isEmpty()) {<br />
CartellaOutputC = new File(folderOutput_C);<br />
CartellaOutputDB = CartellaOutputC;<br />
for (f = 0; f < numfuori; f++) {<br />
Grafico graficoC = new Grafico(idUserfuori[f], idCodafuori[f],<br />
CartellaOutputDB.getAbsolutePath(), "other." + nomeUserfuori[f],<br />
"hc_gruppo",datad1,datad2);<br />
graficoC.idScheduler = idScheduler;<br />
Tommaso Foglia 961/147 Pagina 146 <strong>di</strong> 150
listaGraficiDB_VG.add(graficoC);<br />
}<br />
}<br />
//INTEGRAZIONE NEL METODO MAIN<br />
if (arg.length > 5) {<br />
database = arg[5];<br />
user = arg[6];<br />
password = arg[7];<br />
in<strong>di</strong>rizzo = arg[8];<br />
}<br />
datad1= null;datad2=null;<br />
if (arg.length > 9) {<br />
datad1 = arg[9];<br />
datad2 = arg[10];<br />
data = datad1;<br />
folderOutput_C = pathMonitor + "GraficiDB/" + datad1 + "/" + datad2;<br />
(new File(folderOutput_C)).mk<strong>di</strong>rs();<br />
} folderOutput_G = pathMonitor + "GraficiDB/" + data + "/Giornalieri";<br />
folderOutput_S = pathMonitor + "GraficiDB/" + data + "/Settimanali";<br />
folderOutput_M = pathMonitor + "GraficiDB/" + data + "/Mensili";<br />
folderOutput_A = pathMonitor + "GraficiDB/" + data + "/Annuali";<br />
test = pathMonitor + "GraficiDB/" + data + "/test";<br />
if (datad1==null && (new File(folderOutput_G)).isDirectory() == false) {<br />
(new File(folderOutput_G)).mk<strong>di</strong>rs();<br />
(new File(folderOutput_S)).mk<strong>di</strong>rs();<br />
(new File(folderOutput_M)).mk<strong>di</strong>rs();<br />
(new File(folderOutput_A)).mk<strong>di</strong>rs();<br />
(new File(test)).mk<strong>di</strong>rs();<br />
Tommaso Foglia 961/147 Pagina 147 <strong>di</strong> 150
Grafico.java: I meto<strong>di</strong> per la creazione <strong>di</strong> grafici dovranno contenere i campi per le<br />
date. Tutte le query sono state riscritte e <strong>di</strong>versificate in base ai vari criteri temporali.<br />
Grafico(int idQuery, int idDettagli, String cartellaOutput, String nomeFile, String<br />
nomeTABELLA,String data) {<br />
this.idQuery = idQuery;<br />
this.idDettagli = idDettagli;<br />
this.cartellaDATI_OUTPUT = cartellaOutput;<br />
this.nomeTABELLA = nomeTABELLA;<br />
this.nomeFILE_GRAFICO = nomeFile;<br />
this.data= data;<br />
}<br />
Grafico(int idQuery, int idDettagli, String cartellaOutput, String nomeFile, String<br />
nomeTABELLA,String data1, String data2) {<br />
this.idQuery = idQuery;<br />
this.idDettagli = idDettagli;<br />
this.cartellaDATI_OUTPUT = cartellaOutput;<br />
this.nomeTABELLA = nomeTABELLA;<br />
this.nomeFILE_GRAFICO = nomeFile;<br />
this.data1= data1;<br />
this.data2= data2;<br />
}<br />
Mostriamo a titolo <strong>di</strong> esempio un'unica ristrutturazione <strong>di</strong> query evitando una te<strong>di</strong>osa<br />
ripetizione.<br />
try {<br />
if (nomeTABELLA.startsWith("hd"))<br />
query2 = "select date,a.idVo,g.idgruppo,g.nome as nomeGruppo, " +<br />
Tommaso Foglia 961/147 Pagina 148 <strong>di</strong> 150
" sum(Pend) as Pend ,sum(Run) as Run,sum(Susp) as Susp" +<br />
" from " + nomeTABELLA + " as a left outer join gruppo as g on<br />
a.idgruppo=g.idgruppo" +<br />
" where a.idvo='" + idQuery + "' and idscheduler='" + idScheduler +"'<br />
and DATE_FORMAT(date,'%Y-%m-%d')='" + data + "'" +<br />
" group by date, a.idvo, g.idgruppo order by nomeGruppo, date";<br />
else if (nomeTABELLA.startsWith("hw"))<br />
query2 = "select date,a.idVo,g.idgruppo,g.nome as nomeGruppo, " +<br />
" sum(Pend) as Pend ,sum(Run) as Run,sum(Susp) as Susp" +<br />
" from " + nomeTABELLA + " as a left outer join gruppo as g on<br />
a.idgruppo=g.idgruppo" +<br />
" where a.idvo='" + idQuery + "' and idscheduler='" + idScheduler +"'<br />
and DATE_FORMAT(date,'%Y-%m-%d') between DATE_SUB('" + data + "',INTERVAL 1<br />
WEEK) and '" + data + "'" +<br />
" group by date, a.idvo, g.idgruppo order by nomeGruppo, date";<br />
else if (nomeTABELLA.startsWith("hm"))<br />
query2 = "select date,a.idVo,g.idgruppo,g.nome as nomeGruppo, " +<br />
" sum(Pend) as Pend ,sum(Run) as Run,sum(Susp) as Susp" +<br />
" from " + nomeTABELLA + " as a left outer join gruppo as g on<br />
a.idgruppo=g.idgruppo" +<br />
" where a.idvo='" + idQuery + "' and idscheduler='" + idScheduler +"'<br />
and DATE_FORMAT(date,'%Y-%m-%d') between DATE_SUB('" + data + "',INTERVAL 1<br />
MONTH) and '" + data + "'" +<br />
" group by date, a.idvo, g.idgruppo order by nomeGruppo, date";<br />
else if (nomeTABELLA.startsWith("hy"))<br />
query2 = "select date,a.idVo,g.idgruppo,g.nome as nomeGruppo, " +<br />
" sum(Pend) as Pend ,sum(Run) as Run,sum(Susp) as Susp" +<br />
Tommaso Foglia 961/147 Pagina 149 <strong>di</strong> 150
" from " + nomeTABELLA + " as a left outer join gruppo as g on<br />
a.idgruppo=g.idgruppo" +<br />
" where a.idvo='" + idQuery + "' and idscheduler='" + idScheduler +"'<br />
and DATE_FORMAT(date,'%Y-%m-%d') between DATE_SUB('" + data + "',INTERVAL 1<br />
YEAR) and '" + data + "'" +<br />
" group by date, a.idvo, g.idgruppo order by nomeGruppo, date";<br />
else if (nomeTABELLA.startsWith("hc"))<br />
query2 = "select date,a.idVo,g.idgruppo,g.nome as nomeGruppo, " +<br />
" sum(Pend) as Pend ,sum(Run) as Run,sum(Susp) as Susp" +<br />
a.idgruppo=g.idgruppo" +<br />
" from hd_gruppo as a left outer join gruppo as g on<br />
" where a.idvo='" + idQuery + "' and idscheduler='" + idScheduler +"'<br />
and DATE_FORMAT(date,'%Y-%m-%d') between '"+ data1+ "' and '" + data2 + "' "+<br />
" group by date, a.idvo, g.idgruppo order by nomeGruppo, date";<br />
/* QUERY originale query2 = "select date,a.idVo,a.idgruppo,g.nome as<br />
nomeGruppo, " +<br />
" sum(Pend) as Pend ,sum(Run) as Run,sum(Susp) as Susp" +<br />
" from " + nomeTABELLA + " as a left outer join gruppo as g on<br />
a.idgruppo=g.idgruppo" +<br />
" where a.idvo=" + idQuery + " and idscheduler=" + idScheduler + " " +<br />
" group by date, a.idvo, a.idgruppo order by nomeGruppo, date";<br />
*/<br />
Tommaso Foglia 961/147 Pagina 150 <strong>di</strong> 150