03.01.2015 Views

Università degli Studi di Napoli Federico II - Scope

Università degli Studi di Napoli Federico II - Scope

Università degli Studi di Napoli Federico II - Scope

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!