Università degli Studi di Perugia
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Laurea in Informatica
Tesi di Laurea
Sviluppo di procedure per
l’automatizzazione del flusso di
lavoro per l’analisi dati distribuita
in Grid nell’esperimento CMS
Candidato
Mattia Cinquilli
Relatore
Prof. Leonello Servoli
Correlatore
Dott. Daniele Spiga
ii
Indice
Introduzione
1
1 Grid
5
1.1
Introduzione a Grid . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
1.2
Grid computing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
1.2.1
Definizione di Grid . . . . . . . . . . . . . . . . . . . . . . . . .
8
Architettura Grid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
1.3.1
Livelli architetturali . . . . . . . . . . . . . . . . . . . . . . . .
10
Grid di produzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
1.3
1.4
1.4.1
zioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
Da Grid a cloud computing . . . . . . . . . . . . . . . . . . . .
14
Architettura WLCG/EGEE . . . . . . . . . . . . . . . . . . . . . . . .
15
1.5.1
Utenti e VO . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
1.5.2
Sicurezza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
1.5.3
Elementi principali del middleware . . . . . . . . . . . . . . . .
17
1.5.4
Job flow: sottomissione . . . . . . . . . . . . . . . . . . . . . .
19
1.5.5
MAGIC-5: un caso d’uso della Grid . . . . . . . . . . . . . . .
20
1.4.2
1.5
1.6
Sostenibilità dell’infrastruttura Grid: dallo sviluppo alle opera-
Flussi di lavoro complessi in ambienti distribuiti
. . . . . . . . . . . .
2 Client-server computing
2.1
2.2
21
23
Definizione di client-server computing . . . . . . . . . . . . . . . . . .
23
2.1.1
Un server per ogni client . . . . . . . . . . . . . . . . . . . . . .
24
2.1.2
Caratterizzazione . . . . . . . . . . . . . . . . . . . . . . . . . .
26
2.1.3
Funzioni del client . . . . . . . . . . . . . . . . . . . . . . . . .
28
2.1.4
Funzioni del server . . . . . . . . . . . . . . . . . . . . . . . . .
28
2.1.5
Modelli strutturali . . . . . . . . . . . . . . . . . . . . . . . . .
29
2.1.6
Integrazione con il calcolo distribuito . . . . . . . . . . . . . . .
30
Classificazione dei sistemi client-server in base alla topologia . . . . . .
31
iv
2.3
2.4
2.5
2.6
2.2.1
Modello a due livelli (two-tiers) . . . . . . . . . . . . . . . . . .
31
2.2.2
Modello a tre livelli (three-tiers) . . . . . . . . . . . . . . . . .
32
2.2.3
Modello a N livelli (N-tiers) . . . . . . . . . . . . . . . . . . . .
36
Client-server: vantaggi e svantaggi . . . . . . . . . . . . . . . . . . . .
37
2.3.1
Vantaggi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
2.3.2
Svantaggi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
Sviluppo di un sistema client-server . . . . . . . . . . . . . . . . . . . .
40
2.4.1
Strumenti di sviluppo . . . . . . . . . . . . . . . . . . . . . . .
40
Software Development Life Cycle . . . . . . . . . . . . . . . . . . . . .
41
2.5.1
Pianificazione . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
2.5.2
Definizione dei requisiti . . . . . . . . . . . . . . . . . . . . . .
42
2.5.3
Progettazione . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
2.5.4
Sviluppo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
2.5.5
Integrazione e test . . . . . . . . . . . . . . . . . . . . . . . . .
43
2.5.6
Installazione . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
Client-server: sicurezza . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
2.6.1
Le minacce di sicurezza emergenti . . . . . . . . . . . . . . . .
45
2.6.2
Server: possibili minacce . . . . . . . . . . . . . . . . . . . . . .
45
3 LHC e CMS
47
3.1
LHC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
3.2
CMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
3.2.1
L’ambiente computazionale di CMS . . . . . . . . . . . . . . .
50
3.2.2
Framework dell’analisi distribuita in CMS . . . . . . . . . . . .
51
4 CRAB: evoluzione verso un’architettura client-server
4.1
Motivazioni dell’evoluzione
4.2
Client-server: fattorizzazione del flusso di lavoro
4.3
Strategia implementativa
4.4
4.5
. . . . . . . . . . . . . . . . . . . . . . . .
63
. . . . . . . . . . . . . . . . . . . . . . . . .
65
Architettura del server . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
4.4.1
Classificazione logica delle componenti . . . . . . . . . . . . . .
70
4.4.2
Descrizione agenti di input/output . . . . . . . . . . . . . . . .
74
4.4.3
Descrizione agenti di logica e di gestione . . . . . . . . . . . . .
75
4.4.4
Descrizione agenti per l’interazione con la Grid . . . . . . . . .
77
Interfaccia al middleware ed ai sistemi di batch: BossLite . . . . . . .
80
Richieste degli utenti: task
83
. . . . . . . . . . . . . . . . . . . . . . . .
83
Task e job . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
84
Componente per l’aggregazione delle informazioni sui task . . . . . . .
85
5.1.1
5.2
59
. . . . . . . . . . . .
5 Implementazione dei componenti di gestione dei task
5.1
59
v
5.2.1
5.3
5.4
TaskTracking: architettura . . . . . . . . . . . . . . . . . . . .
89
Componente per la gestione del ciclo di vita dei task . . . . . . . . . .
95
5.3.1
TaskLifeManager: architettura . . . . . . . . . . . . . . . . . .
97
Supporto per l’interazione trasparente con Storage Element . . . . . .
99
5.4.1
SEAPI: architettura . . . . . . . . . . . . . . . . . . . . . . . . 100
5.4.2
SEAPI: funzionamento . . . . . . . . . . . . . . . . . . . . . . . 101
6 Risultati
105
6.1
Dalla fase di test alle operazioni in produzione . . . . . . . . . . . . . 105
6.2
Test di scala del server . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
6.3
6.2.1
Fase con un solo utente . . . . . . . . . . . . . . . . . . . . . . 107
6.2.2
Fase multiutente . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Utilizzo del server di CRAB in produzione . . . . . . . . . . . . . . . . 109
6.3.1
Valutazione dell’efficienza dei job . . . . . . . . . . . . . . . . . 110
Conclusioni
115
Ringraziamenti
117
Bibliografia
119
vi
Elenco delle figure
1.1
I tre macro livelli architetturali di una griglia computazionale. . . . . .
10
1.2
Autentificazione nella Grid. . . . . . . . . . . . . . . . . . . . . . . . .
17
1.3
Elementi della Grid WLCG/EGEE. . . . . . . . . . . . . . . . . . . .
18
1.4
Job Flow nella Grid WLCG/EGEE. . . . . . . . . . . . . . . . . . . .
19
2.1
Topologia client-server con un server per un unico client. . . . . . . . .
29
2.2
Topologia client-server con un solo server per client multipli. . . . . . .
29
2.3
Topologia client-server con più server e più client. . . . . . . . . . . . .
30
2.4
Modello client-server su due livelli. . . . . . . . . . . . . . . . . . . . .
31
2.5
Modello client-server su tre livelli.
. . . . . . . . . . . . . . . . . . . .
33
2.6
Modello client-server su N livelli. . . . . . . . . . . . . . . . . . . . . .
37
2.7
SDLC: fasi base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
3.1
Il progetto LHC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
3.2
Struttura del rivelatore CMS. . . . . . . . . . . . . . . . . . . . . . . .
49
3.3
Il modello computazionale di CMS: l’architettura su livelli. . . . . . .
51
3.4
Velocità dei trasferimenti di PhEDEx dal 2004 al 2008. . . . . . . . . .
55
3.5
CRAB workflow. WMS può essere inteso sia come gLite WMS che come
glidein WMS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
4.1
CRAB: flusso di lavoro e interazioni. . . . . . . . . . . . . . . . . . . .
61
4.2
L’aggiunta di un nuovo livello fra la Grid e l’utente. . . . . . . . . . .
62
4.3
CRAB: flusso di lavoro e interazioni con l’introduzione del server. . . .
64
4.4
Schema SQL del supporto per la gestione del Message Service. . . . .
67
4.5
Vista schematica dell’architettura del server di CRAB. . . . . . . . . .
72
4.6
Job per sito sottomessi dal 20 Novembre 2009 al 28 Dicembre 2009.
Grafico prelevato dall’HTTPFrontend del server di analisi di Legnaro.
76
4.7
Implementazione con un pool di thread della componente JobTracking.
79
4.8
Schema UML della componente GetOutput. . . . . . . . . . . . . . . .
80
4.9
Vista schematica dell’architettura di BossLite. . . . . . . . . . . . . . .
82
viii
5.1
Architettura e componenti del server di CRAB; in rosso sono evidenziati
gli agenti dedicati alla gestione dei task e le frecce relative all’interazione
con lo Storage Element attraverso le SEAPI.
5.2
. . . . . . . . . . . . . .
85
Schema delle interazioni della TaskTracking con le altre componenti del
server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
87
5.3
Diagramma delle classi degli oggetti della TaskTracking costruito con
la specifica UML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
90
5.4
Schema del funzionamento dei thread e della coda dei task. . . . . . .
93
5.5
Diagramma delle classi degli oggetti della TaskLifeManager costruito
con la specifica UML. . . . . . . . . . . . . . . . . . . . . . . . . . . .
97
5.6
Principali componenti logiche delle SEAPI. . . . . . . . . . . . . . . . 102
5.7
Diagramma delle classi degli oggetti delle SEAPI costruito con la specifica UML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.8
Schema di un caso d’uso delle SEAPI nel caso di un tasferimento da
uno Storage Element ad un altro. . . . . . . . . . . . . . . . . . . . . . 103
6.1
Distribuzione per stato dei job sottomessi attraverso il server di CRAB
sul middleware gLite durante la fase di test di sottomissioni controllate
con singolo utente. Informazioni prelavate dai dati contenuti nella base
di dati del server, attraverso l’HTTPFrontend (cap. 4). . . . . . . . . . 108
6.2
Utilizzo percentuale della CPU (scala verticale) distribuito nel tempo
(scala orizzontale) da parte del server MySQL (sorgente: HTTPFrontend ). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
6.3
Distribuzione per stato dei job sottomessi al server durante la fase di
test multiutente (sorgente: HTTPFrontend ). . . . . . . . . . . . . . . 110
6.4
Distribuzione giornaliera del numeri di utenti diversi che hanno utilizzato i server di CRAB a partire da Gennaio 2009 fino a metà Gennatio
2010. Grafico generato tramite le informazioni messe a disposizione
dalla Dashboard (cap. 3). . . . . . . . . . . . . . . . . . . . . . . . . . 111
6.5
Distribuzione dei job sottomessi tramite i server di CRAB fra i siti della
collaborazione CMS (sorgente: Dashboard ). . . . . . . . . . . . . . . . 112
6.6
Distribuzione della frazione giornaliera di jobs terminati con successo
durante tutto l’anno 2009 (sorgente: Dashboard ). . . . . . . . . . . . . 113
6.7
Distribuzione giornaliera della percentuale di jobs terminati con stato
Abort durante tutto l’anno 2009 (sorgente: Dashboard ). . . . . . . . . 113
Introduzione
Una Griglia Computazionale è un ambiente sviluppato per il calcolo distribuito che
consente la condivisione, selezione e aggregazione di risorse autonome geograficamente
distribuite utilizzate a tempo di esecuzione, a seconda della loro disponibilità, capacità e prestazioni. La crescente domanda di risorse di calcolo nel mondo moderno ha
portato dagli anni ’50 ad oggi all’incremento esponenziale della potenza di calcolo.
Dalla costruzione dei primi Supercomputer che concentravano tutta la potenza in unico sistema, si è arrivati all’unione delle risorse di piú computer collegati su di una rete
locale, cioé il Cluster Computing. Successivamente, l’idea che il potenziale generato
da un sistema di computer in cluster connessi fra loro fosse sufficiente per soddisfare
le richieste delle applicazioni più onerose, portò l’esigenza di andare oltre quella che
era stata la comune struttura di un sistema di calcolo. Quindi vennero create le prime
griglie computazionali. Attualmente esistono molteplici implementazioni di questo paradigma con casi d’uso che vanno dalla ricerca di nuove terapie di cura delle malattie
(come l’Alzheimer e l’AIDS) , fino ai servizi finanziari . Fra gli utilizzatori della griglia
computazionale vi sono anche gli esperimenti di fisica delle alte energie in funzione al
Large Hadron Collider (LHC) del CERN a Ginevra, che hanno individuato in questa
tecnologia le potenzialità in grado di soddisfare le proprie esigenze computazionali.
Il Compact Muon Solenoid (CMS) è uno dei 4 esperimenti di LHC che ha progettato
il modello di calcolo sul paradigma di Grid. A regime il rilevatore CMS sarà in grado
di acquisire una quantità di dati annua pari a 1 PB. Il processamento e quindi l’analisi
di questa mole di dati richiede una quantità di risorse di calcolo e di memorizzazione
senza precedenti. La griglia computazionale fornisce la risposta a queste esigenze,
garantendo inoltre ad ogni utente della vasta collaborazione la possibilità di accesso
ai dati distribuiti in Grid. CMS nel corso degli anni ha quindi sviluppato delle applicazioni basate su sitemi Grid che possono essere classificate in due categorie: quelle
necessarie alla gestione dei dati e quelle necessarie alla gestione dei flussi di lavoro per
il relativo processamento.
Lo scopo di questo lavoro di tesi è la progettazione e lo sviluppo di componenti fondamentali di un sistema basato su architettura client/server, specializzato nella gestione
2
del flusso di lavoro dell’analisi dati distribuita, tale che rappresenti una piattaforma
per il supporto di flussi complessi quali quelli concatenati, tipici di alcuni casi d’uso di
un esperimento di fisica delle alte energie (calibrazione ed allineamento del rivelatore
di particelle elementari).
Il modello di calcolo di CMS prevede tre livelli computazionali (detti Tier) organizzati
gerarchicamente. Dopo una prima fase di processamento cha avviene al Tier-0 del
CERN, i dati sono spediti ai Tier-1. Questi ultimi devono garantirne la custodia e la
potenza di calcolo per i successivi riprocessamenti. I dati vengono infine resi disponibili ai Tier-2, centri di calcolo di dimensioni inferiori ai Tier-1, responsabili per il
supporto di tutte le attività di analisi dell’utente. Secondo questo schema computazionale i fisici della collaborazione CMS sono obbligati ad interagire con il complesso
ambiente distribuito di Grid. Tale aspetto può essere piuttosto complicato soprattutto
per utenti di fisica, storicamente più interessati ai risultati dell’analisi piuttosto che
agli aspetti tecnici del sistema di calcolo. Il miglior modo di soddisfare tali esigenze è
quello di incapsulare l’utente finale in un ambiente protetto, da cui la scelta di disegnare un’applicazione basata all’architettura client/server.
La presentazione del lavoro di tesi si articola in 6 capitoli.
Nel primo viene data una descrizione della griglia computazionale come infrastruttura
di calcolo distribuito, della sua architettura, delle implementazioni più importanti e
delle varie fasi del flusso di lavoro.
Nel secondo viene descritta la teoria del client/server computing illustrandone l’architettura e le varie topologie d’implementazione, descrivendo in particolar modo i
vantaggi e gli svantaggi del suo utilizzo.
Nel terzo viene fatto un quadro dell’esperimento CMS da un punto di vista prettamente computazionale, descrivendo quindi: i servizi e le applicazioni specifiche per la
gestione dei dati, del software per l’analisi dei dati e le applicazioni d’interfaccia alla
griglia computazionale.
Negli ultimi tre capitoli si illustra la parte originale del lavoro di tesi.
In particolare nel capito quattro vengono descritte in dettaglio le motivazioni per la
scelta di un’applicazione client/server, la strategia e l’architettura utilizzata.
Il quinto capitolo presenta i dettagli dello sviluppo di due componenti del server (TaskTracking e TaskLifeManager) e delle librerie necessarie ad interagire con i servizi di
memorizzazione della griglia.
Infine nel sesto capitolo vengono presentati i risultati ottenuti durate un intero anno
di attività.
“C’è tanta gente infelice che tuttavia non prende l’iniziativa di cambiare la propria
situazione perché è condizionata dalla sicurezza, dal conformismo, dal
tradizionalismo, tutte cose che sembrano assicurare la pace dello spirito, ma in realtà
per l’animo avventuroso di un uomo non esiste nulla di più devastante di un futuro
certo. Il vero nucleo dello spirito vitale di una persona è la passione per l’avventura.
La gioia di vivere deriva dall’incontro con nuove esperienze, e quindi non esiste gioia
più grande dell’avere un orizzonte in continuo cambiamento, del trovarsi ogni giorno
sotto un sole nuovo e diverso. Se vuoi avere di più dalla vita, devi liberarti dalla tua
inclinazione alla sicurezza monotona e adottare uno stile più movimentato che al
principio ti sembrarà folle, ma non appena ti ci sarai abituato, ne assaporerai il
pieno significato e l’incredibile bellezza.”
Chris McCandless
4
Capitolo 1
Grid
“The secret of a Grid’s success is
not so much its structure as the
imagination with which it is used.”
Allen Hurlburt
1.1
Introduzione a Grid
Dalla creazione del primo microprocessore su di un solo chip agli inizi degli anni ’70 è
stata fatta molta strada nell’incremento delle prestazioni computazionali. Proprio in
quegli anni il cofondatore della Intel Corporation, Gordon Moore, diceva:
“Le prestazioni dei processori, e il numero di transistor ad esso relativo,
raddoppiano ogni 18 mesi.”[1]
Questa previsione si rivelò corretta e per tutti gli anni ’70 e ’80 le prestazioni delle
CPU andavano migliorando ad un ritmo equivalente a quello che Moore aveva previsto.
Inoltre, dagli inizi degli anni ’80 si assistette ad una crescente commercializzazione di
personal computer ed all’avvio dell’informatizzazione di massa.
L’ascensione vertiginosa delle prestazioni di un singolo microprocessore non era destinata a durare ancora per molto. Nonostante l’introduzione di supercomputer1 e
mainframe2 , gli onerosi calcoli scientifici, ma non solo quelli, richiedevano prestazioni
di calcolo sempre più bisognose di risorse. La velocità con cui aumentava la complessità dei software, e quindi la loro necessità di risorse era maggiore delle prestazioni
1I
supercomputer sono dei sistemi di elaborazione progettati per ottenere potenze di calcolo molto
elevate.
2 Mainframe: un computer grande e dotato di elevata capacità di elaborazione in grado di
supportare l’utilizzo contemporaneo da parte di numerosi utenti, anche migliaia.
6
1 Grid
hardware che potevano essere fornite. Questo ha portato all’unione delle risorse di
piú computer collegati su di una rete telematica locale sviluppando tecnologie quali
il Cluster Computing, che permette di e↵ettuare calcoli in parallelo. I calcolatori facenti parte di questo sistema possono essere eterogenei, funzionando comunque in un
modo tale da poter essere considerati come un singolo computer. Questo permette
di scomporre un problema che richiede molte elaborazioni in sottoproblemi separabili
che possono essere distribuiti fra i vari nodi del cluster, e dove applicabile per risolverli
in parallelo.
Sono state sviluppate varie tecnologie per la creazione di programmi in grado di essere
eseguiti in parallelo e per l’interfacciamento del cluster stesso; tra cui MPI e PVM.
Quest’ultimo è acronimo di Parallel Virtual Machine[2], ed è un software progettato per permettere a macchine eterogenee, connesse via rete, di essere usate come un
singolo processore parallelo e distribuito. L’MPI (Message Passing Interface)[3] è un
protocollo di comunicazione fra computer, o nodi, che eseguono un programma parallelo su di un sistema distribuito.
Una naturale evoluzione di questi concetti è il Grid computing o Grid cluster che è
una tecnologia strettamente collegata al cluster computing.
Nel 1996 venne pubblicato su “The International Journal of Supercomputer Applications and High Performance Computing”[4] un articolo destinato a far tramontare la
legge di Moore. La pubblicazione fu intitolata “Overview of the I-WAY: Wide Area
Visual Supercomputing” e tra gli autori vanta Ian Foster3 .
Il progetto I-WAY (Information Wide Area Year) è stato il primo riguardante:
• la costruzione di applicazioni in una realtà virtuale distribuita;
• la gestione di risorse distribuite in una WAN4 ;
• il relativo scheduling della richiesta di risorse.
Lo scopo dell’esperimento era quello di usare risorse per consentire ai ricercatori di
e↵ettuare calcoli computazionali su larga scala. Connettendo 17 centri tramite una
comunicazione via rete di tipo ATM5 usando i collegamenti di rete già esistenti, 5 siti
di ricerca virtuale ed oltre 60 gruppi di applicazioni, il progetto I-WAY venne creato
in una WAN6 eterogenea. L’obiettivo principale era quello di avere applicazioni che
3 Ian
Foster è ricercatore presso il Mathematics and Computer Science Division all’Argonne Natio-
nal Laboratory e professore di Informatica all’University of Chicago; meglio conosciuto come ’father
of the Grid’ (il padre della griglia)
4 WAN (Wide Area Network) è una rete di computer usata per connettere LAN (Loacal Area
Network)
5 Asynchronous Transfer Mode
6 WAN: Wide Area Network (rete geografica), che collega nodi a distanza qualsiasi, anche
planetaria.
1.1 Introduzione a Grid
7
usassero più di un supercomputer, di uno o più dispositivi virtuali e di avere una
‘tecnologia collaborativa’ usando spazi virtuali comuni nei quali condurre una scienza
computazionale. L’obiettivo secondario da un punto di vista teorico, ma non da un
punto di vista tecnico, era quello di scoprire problemi legati ad un uso esteso della
tecnologia basata su sistemi distribuiti. Questo portò all’analisi ed alla relativa risoluzione di problematiche molto importanti nello sviluppo di applicazioni distribuite,
quali:
• sicurezza;
• ambienti computazionali uniformi;
• scheduling globale delle risorse distribuite;
• riserva (lock) di risorse;
• definizione e gestione di gruppi di ricerca virtuali distribuiti, ma collaborativi.
I-WAY permise di sperimentare un nuovo metodo per rendere possibili calcoli che
necessitavano di risorse sempre maggiori, andando a sfruttare la potenza di calcolo
di tutti quei computer dedicati ad altre attività, ma momentaneamente inutilizzati.
Una metodologia di calcolo computazionale distribuito, che avrebbe permesso di condividere dati e potenza di calcolo tramite una rete a pubblico accesso, creando una
vastissima risorsa computazionale, venne quindi considerata la soluzione ideale per
risolvere problemi.
Questo nuovo sviluppo avvenne parallelamente alla progressiva involuzione della legge
di Moore, causata soprattutto da limiti tecnologici, quali: l’impossibilità di ridurre la
scala del gate del singolo transistor a causa dell’incremento della densità di corrente
e la difficoltà legata alla schermatura dei chip all’aumentare delle frequenze di calcolo
(circa 3 GHz odierni).
Oramai le performance dei chip non raddoppiavano più e il loro prezzo non stava
diminuendo come era accaduto in passato. Inoltre dall’avvento del progetto I-WAY
l’obiettivo principale non era più quello di creare risorse per il calcolo computazionale
sempre più potenti in una densità sempre minore: era di rendere l’utilizzo di risorse
geograficamente distribuite sempre più facile ed efficiente. Ma sotto un altro punto di
vista, l’avvento del progetto di Ian Foster aveva portato nuova linfa allo sviluppo del
calcolo computazionale, costruendo una nuova struttura che si potesse interporre fra
l’hardware e l’utente, migliorando ulteriormente le prestazioni di calcolo, senza il bisogno di aumentare ancora una volta vertiginosamente la complessità della circuiteria
di un computer.
Il progetto di Ian Foster era l’inizio di quell’infrastruttura di calcolo computazionale
8
1 Grid
che evolvendosi ha portato a focalizzare lo sviluppo su quelle che oggi sono le griglie
computazionali.
1.2
Grid computing
In seguito al progetto I-WAY vi fu un moltiplicarsi di progetti che prevedevano lo sviluppo di un’infrastruttura di calcolo simile ad esso. Tutti i progetti avevano in comune
la stessa architettura globale e tecnologie simili venivano usate per la realizzazione.
La Grid vera e propria nacque ad un gruppo di lavoro presso l’Argonne National Laboratory nel Settembre del 1997. Questo fu seguito da una pubblicazione del 1998
intitolata “The Grid: Blueprint for a New Computing Infrastructure”[5] di Ian Foster
e Carl Kesselman, ma meglio conosciuta come “La bibbia di Grid”.
1.2.1
Definizione di Grid
La griglia computazionale è un tipo di sistema parallelo e distribuito che consente la
condivisione, selezione e aggregazione di risorse autonome geograficamente distribuite
utilizzate a tempo di esecuzione, a seconda della loro disponibilità, capacità, prestazione, costo e qualità del servizio richiesto dall’utente. Dunque il Grid Computing è
l’applicazione infrastrutturale di quella logica di condivisione delle risorse che consente
di utilizzare la potenza di elaborazione di una serie di computer collegati in rete via
Internet, dividendo i processi di calcolo e di memoria secondo regole di distribuzione
definite dai gestori della Grid.
Ciò che rende possibile quest’infrastruttura intermediando fra diverse entità è il middleware. Questo è un software di connessione formato da un insieme di servizi e
di ambienti di sviluppo che consentono a più entità, che possono risiedere su uno o
più elaboratori, di interagire attraverso una rete di connessione a dispetto di di↵erenze nei protocolli di comunicazione, architetture dei sistemi locali, sistemi operativi,
ecc. . . Dunque, lo scopo del middleware è quello di o↵rire servizi di comunicazione,
astrazione, collaborazione ed un’ambiente di sviluppo delle applicazioni per permettere l’interoperabilità e la connettività fra applicazioni distribuite su risorse eterogenee.
[5]
Passiamo ad analizzare in dettaglio le proprietà della Grid.
• Condivisione di risorse
La possibilità di condividere risorse eterogenee, intese come potenza di calcolo
e spazio disco, in scala globale è una caratteristica essenziale della Grid. Le
risorse possono essere costituite da piattaforme di↵erenti, con diverse architetture hardware e software, con diversi linguaggi computazionali, situate in luoghi
1.2 Grid computing
9
di↵erenti, appartenenti a di↵erenti domini amministrativi.
La condivisione deve essere ad un livello di astrazione tale da rendere una generica operazione completamente trasparente all’utente. Questo ha il vantaggio di
proiettare l’utente stesso in un ambiente virtualizzato, nel quale accedere a dati
e risorse locali o distribuiti nella Grid non faccia alcuna di↵erenza. Da questo
punto di vista Grid è un’evoluzione di Internet in quanto permette di migliorare
i collegamenti, definendo opportuni protocolli di comunicazione, ma in un contesto generico. Nella definizione di questi protocolli entra in gioco il concetto di
sicurezza che è un aspetto importante e critico della Grid e che deve essere ad
un livello molto alto.
• Sicurezza
Poiché non è possibile una condivisione incondizionata di risorse a livello di Internet, è fondamentale che l’aspetto della sicurezza sia trattato in una Computing
Grid. Per questo, vengono definiti tre livelli di sicurezza:
– politica di accesso: i fornitori di risorse e gli utenti devono definire con
chiarezza e precisione a chi è permesso di condividere risorse e per quali
condizioni le risorse possono essere accedute;
– autenticazione: è fondamentale un meccanismo per la verifica dell’identità
di una risorsa e di un utente;
– autorizzazione: è necessario un meccanismo per determinare se un operazione è permessa, a seconda del tipo di politica di accesso delle risorse.
Quindi è importante sapere chi è autorizzato ad usare Grid e quali risorse in
particolare; chi certifica che l’utente autentificato sia proprio quell’utente; quali
sono le politiche d’uso delle risorse.
• Uso delle risorse
Con un quantitativo di risorse molto grande, è fondamentale un efficiente uso
delle stesse. Questo perché non ha importanza avere un numero di risorse molto
elevato se ogni volta che un utente voglia accedervi esso trovi lunghe code di
utenti per la stessa risorsa. È primario l’obiettivo di distribuire i lavori fra le
code, allocando i lavori efficientemente in modo da distribuire gli accessi fra
più risorse. Quindi, in linea di principio, un utente ha informazioni relative a
diversi lavori (jobs) sottomessi su Grid ed è possibile calcolare una distribuzione
ottimale per l’allocazione delle risorse. Un software che esegua questa analisi di
carico e distribuzione di jobs è da considerare parte integrante del middleware
della Grid.
10
1 Grid
1.3
Architettura Grid
Non è possibile definire un’architettura Grid che possa essere considerata come definitiva perché le caratteristiche e l’architettura dipendono fortemente dal caso concreto.
Ad esempio è ben diverso avere risorse omogenee gestite amministrativamente in maniera centralizzata dall’organizzare risorse eterogenee e controllabili solo localmente.
In questo ultimo caso, che è quello che ci interessa, una delle richieste a cui dovrà
soddisfare la Grid è quella di assemblare risorse eterogenee, di mettere a disposizione
un’infrastruttura scalabile che assicuri dinamicità nell’uso e nell’organizzazione delle
risorse. È tuttavia possibile definire come è organizzata in generale una Grid da un
punto di vista concettuale.
1.3.1
Livelli architetturali
Come è possibile vedere in figura 1.1 sono distinguibili tre macro-livelli.
Applicazioni Scientifiche, Business e Ingegneristiche
APPLICAZIONI
Applicazioni d'ambiente per lo sviluppo
High Level
Knowledge
Services
Security
Workload
Management
System
MIDDLEWARE
Low Level
Communica
tion
Scheduling
Monitoring
Risorse
Computers
Dati
FABRIC
Storage
Elements
Figura 1.1: I tre macro livelli architetturali di una griglia computazionale.
1.3 Architettura Grid
11
• Livello delle Applicazioni
Ne fanno parte tutte le applicazioni dell’utente che interagiscono, direttamente
o non, con la Grid. Talvolta contiene l’interfaccia che consente all’utente di interagire con la Grid e quindi anche l’ambiente di programmazione (API). Questo è
caratterizzato da un’assoluta portabilità attraverso vari tipi di sistemi hardwaresoftware e loro combinazioni in un contesto di eterogeneità e dinamicità. Inoltre
tutto il meccanismo della gestione dei gruppi di lavoro è parte integrante di
questo livello.
• Livello Middleware
Questo livello è a sua volta scomponibile in due parti: un livello più vicino
all’utente (High Level) ed uno più vicino alle risorse (Low Level).
L’High Level è costituito da:
– Knowledge Discovery: servizi di Grid che forniscono un accesso consistente,
pervasivo ed efficace a risorse computazionali, con un interesse rivolto allo
sfruttamento della Grid come un sofisticato strumento di “Web computing”;
– Sicurezza: la possibilità di un efficace ed efficiente controllo di accesso alla
griglia per avere ambienti di Grid sicuri, ma anche per una cooperazione
tra ambienti Grid appartenenti a di↵erenti organizzazioni;
– Resource Broker: servizio che fornisce un collegamento tra la richiesta di
risorse e le risorse disponibili.
Il Low Level è composto da:
– Scheduling: interagendo con i servizi del suo livello e di quello superiore si
occupa di mappare costantemente le risorse della Grid, decidendo su quali siti devono essere assegnati i vari lavori, bilanciando il carico di lavoro
a seconda delle informazioni disponibili; quindi garantisce un accesso altamente efficiente ad informazioni statiche e dinamiche traducendo le richieste
di alto livello in richieste di basso livello;
– Monitoring: questo servizio si incarica di controllare l’utilizzo delle risorse del sistema e di dare un supporto diagnostico in caso di guasti e
sovraccarichi;
– Comunication: definisce i protocolli di comunicazione e autenticazione per
le transazioni di rete abilitando lo scambio dei dati con il livello fabric. I
protocolli di comunicazione permettono lo scambio di dati tra le risorse del
livello inferiore, cioè implementano i servizi di trasporto, routing e naming;
mentre i protocolli di autenticazione forniscono un meccanismo di autoriz-
12
1 Grid
zazione e protezione delle comunicazioni in uno scenario multi-istituzionale
permettendo l’interoperabilità tra le varie soluzioni locali.
• Livello Fabric
Le risorse sono oggetti che hanno proprietari, che possono essere usate per un
certo periodo di tempo e che possono essere rinnovabili oppure no. Sono gestite
tramite lo Scheduling, il Knowledge Discovery e il Resource Broker. Questi
permettono di allocare le risorse di cui ha bisogno un utente, sottraendole a
quelle disponibili. I dati possono essere replicati per l’ottimizzazione delle risorse
di memorizzazione, garantendo prestazioni migliori nell’accesso ai dati. Alcuni
esempi di risorse possono essere lo spazio disco, la banda di rete, il tempo di
CPU o semplicemente i dati.
1.4
Grid di produzione
Dopo il progetto I-WAY sono nati nuovi e sempre più avanzati progetti che prevedono
l’applicazione della Grid, per scopi principalmente scientifici e finanziari. Ecco un
elenco dei principali:
• Condor[6]. È un progetto sviluppato a partire dal 1988 dall’ University of Wi-
sconsin (Madison, USA) con l’idea di sfruttare la potenza di calcolo dei desktop
universitari accesi ma momentaneamente inutilizzati. L’obiettivo del progetto è
quello di sviluppare, implementare, di↵ondere e valutare i meccanismi e le linee
di condotta per il supporto dell’High Throughput Computing (HTC) in grandi
insiemi di risorse computazionali proprietarie e distribuite. Gli utenti sottomettono i loro job, seriali o paralleli che siano, a Condor; quest’ultimo mette i job
in una coda, sceglie quando e dove eseguire i job, ne segue l’andamento, ed alla
fine informa l’utente al termine dell’esecuzione.
• UNICORE[7]. É una tecnologia di Grid Computing che fornisce l’accesso traspa-
rente, sicuro e intuitivo a risorse distribuite Grid come supercomputer o sistemi
cluster e le informazioni memorizzate nelle basi di dati. UNICORE (Uniform
Interface to Computing Resources) è stato sviluppato in due progetti finanziati
dal ministero tedesco per l’istruzione e la ricerca. L’architettura è costituita da
tre livelli: l’utente (client), il server e il sito di destinazione.
• NorduGrid[8]. Nasce come infrastruttura di calcolo distribuito a disposizione
delle università e dei centri di ricerca del Nord Europa. NorduGrid utilizza
il middleware ARC[9] che include molteplici applicativi e librerie mediante le
quali è possibile realizzare i servizi base (monitoraggio delle risorse distribuite,
gestione dei dati, comunicazione, autenticazione e sicurezza, portabilità) su cui
1.4 Grid di produzione
13
definire il middleware di livello superiore. Le sue diverse componenti possono
essere adoperate indipendentemente l’una dall’altra oppure in maniera congiunta
al fine di sviluppare applicativi per il Grid Computing.
• LCG[10]. L’LHC Computing Grid Project è stato creato dal CERN (Ginevra,
Svizzera) nel 2001 con lo scopo di costruire e mantenere l’infrastruttura com-
putazionale necessaria per la memorizzazione e l’analisi dei dati provenienti dai
quattro esperimenti dell’LHC (ALICE, ATLAS, CMS e LHCb). LCG costituisce
un test di vitale importanza per le nuove tecnologie informatiche Grid e potrebbe rivoluzionare il modo in cui utilizziamo le risorse dei computer in aree che
vanno dalla ricerca fondamentale alla diagnostica medica.
• EGEE[11]. “Enabling Grid for E-sciencE” è il progetto finanziato dalla Co-
munità Europea che ha come scopo la realizzazione di un’infrastruttura Grid
sicura, affidabile e robusta, che consenta di accedere a risorse geograficamente
distribuite 24 ore al giorno. La base di partenza è stata quella del preesistente LHC Computing Grid (LCG), e uno degli scopi è di fornire a LCG nuove
versioni del middleware. Questo progetto garantisce anche l’interoperabilità di
implementazioni diverse (gLite[12], ARC, UNICORE).
• OSG[13]. L’Open Science Grid è un’infrastruttura Grid per la scienza su larga
scala, sviluppata ed adoperata da un consorzio di università e laboratori degli
Stati Uniti. È stata formata nel 2004 per permettere a di↵erenti comunità di
scienziati di accedere ad una infrastruttura Grid che permettesse di sfruttare
le risorse comuni. Questa include due progetti: Integration e Production Grid.
L’Integration Grid permette di verificare nuove tecnologie e applicazioni, mentre
la Production Grid fornisce un ambiente stabile e supportato per applicazioni
destinate ad un uso a lungo termine. Le capacità e la linea di sviluppo di questo
progetto, sono guidate dai partecipanti degli Stati Uniti negli esperimenti presso l’LHC. Inoltre, molti dei gruppi di lavoro dell’OSG collaborano e lavorano
sull’interoperabilità con l’infrastruttura EGEE. La correlazione fra LCG e le risorse degli Stati Uniti avviene attraverso gli esperimenti a LHC a cui partecipano
anche i ricercatori statunitensi.
• WLCG[10]. La Worldwide LHC Computing Grid è stata creata per preparare
le infrastrutture necessarie alla simulazione e all’analisi dei dati prodotti dagli
esperimenti dell’acceleratore LHC. Essa dipende da una stretta collaborazione
con i maggiori progetti ed organizzazioni che fruiscono di fondi pubblici, per la
fornitura di servizi di rete, software di Grid specializzato e per il controllo dell’infrastruttura Grid. Proprio per questo, i progetti WLCG ed EGEE condividono
14
1 Grid
una gran parte dei loro servizi operando in congiunzione e creando un sistema
WLCG/EGEE.
1.4.1
Sostenibilità dell’infrastruttura Grid: dallo sviluppo alle
operazioni
Attualmente gli stati membri e la Commissione Europea hanno progettato e stanno
mettendo in atto un piano per garantire la sostenibilità a lungo termine del middleware
della infrastruttura della Grid di base con l’European Grid Initiative (EGI)[14]. Questa è un’associazione fra un ente di coordinazione e le National Grid Initiative (NGI).
Queste ultime sono delle entità nazionali legali il cui compito è quello di prendersi
carico sia delle operazioni inerenti all’infrastruttura Grid nei rispettivi stati, che delle
richieste delle comunità scientifiche che vengono supportate. L’obiettivo principale
dell’evoluzione di EGEE è quello di collegare fra di loro le Grid nazionali esistenti e
di supportare attivamente l’avvio di nuove iniziative in quegli stati dove ancora non
esistono.
Le attività dei progetti correnti (EGEE) vengono progressivamente trasformate in
servizi di EGI: questa fase deve ancora essere completata e per poter garantire una
continuità dei servizi per gli utenti della Grid europea. Alla fine della transizione
l’infrastruttura dovrà essere sostenibile nel lungo periodo in termini di costi e risorse
e dovrà coordinare le singole iniziative dei 42 paesi europei ed extra-europei che partecipano all’iniziativa. Particolare attenzione verrà prestata allo sviluppo dei sistemi
middleware necessari per i servizi o↵erti, nonché alla validazione e standardizzazione dei software che saranno messi a disposizione da sistemi di Grid Computing (già
sviluppati a livello nazionale). Il progetto prevede anche la realizzazione di specifici
standard per le interfacce Grid e la promozione di questa tecnologia presso l’industria,
per un corretto trasferimento tecnologico. Oltre al trasferimento delle nuove tecnologie, è necessario che l’attuale middleware della Grid europea venga continuamente
sviluppato. Tale sviluppo continuerà anche nell’ambito del progetto UMD: Unified
Middleware Distribution. Questo altri non è che l’unione dei tre consorzi di EGEE
(ARC, gLite e UNICORE) che permetterà di coordinare a livello europeo gli sviluppi
che attualmente sono paralleli, evitando una duplicazione degli sforzi.
1.4.2
Da Grid a cloud computing
Il passaggio ad una struttura con maggiore sostenibilità, consente anche un passaggio
da Grid a Cloud Computing[15]. Questo implica che l’infrastruttura Grid potrà essere
vista come un insieme di servizi da mettere a disposizione agli utenti tramite un’o↵erta
1.5 Architettura WLCG/EGEE
15
(commerciale) attraverso un servizio web di risorse di calcolo e storage con un ambiente
virtuale creato secondo le esigenze degli utenti in un dominio amministrativo unico,
cosı̀ come stanno già facendo Amazon, Google o IBM. Quest’approccio rende semplice
e flessibile l’accesso ad hardware, software e storage grazie a una nuova interfaccia web
e l’o↵erta di ambienti virtuali (Worker Node on Demand7 ). La funzionalità nei servizi
Cloud può essere descritta in molti modi e dipende dai tipi di astrazione e servizi che
si intende mettere a disposizione. Le astrazioni tipiche sono:
• Hardware as a Service (HaaS): mettere l’hardware a disposizione dei clienti.
• Software as a Service (SaaS): fornire dei servizi software pronti per essere usati.
• Data as a Service (DaaS): consentire accesso ai dati disponibili da varie fonti.
Queste astrazioni possono essere viste collettivamente come l’o↵erta di una Platform
as a Service (Paas), o, piú in generale, di una Infrastructure as a Service (IaaS).
L’infrastruttura (come IGI8 ) potrà potenzialmente diventare un servizio che si compra
e si vende facilmente via web, cosı́ che la Grid integrata con Cloud e virtualizzazione
possa estendere l’uso dell’infrastruttura dalla ricerca a potenzialemente ogni utente
(Pubblica Amministrazione e aziende).
1.5
Architettura WLCG/EGEE
I requisiti computazionali degli esperimenti di LHC sono enormi: circa 12-14 PetaBytes di dati saranno prodotti ogni anno. Analizzare questa mole di dati richiederà
l’equivalente di 70 mila computer del tipo più veloce tra quelli oggi prodotti, che per
vari motivi non possono essere tutti concentrati in un solo posto.
La Worldwide LHC Computing Grid viene incontro a queste necessità attraverso il
dispiegamento di un servizio di calcolo Grid a livello mondiale, integrando le risorse dei
centri di calcolo scientifici disseminati in Europa, America e Asia, in un’organizzazione
globale di calcolo virtuale.
1.5.1
Utenti e VO
Le organizzazioni virtuali (VO, Virtual Organization)[16] sono un insieme dinamico,
multi-istituzionale e virtuale di entità che condividono risorse. Ognuna ha una dimensione di↵erente e persegue un diverso scopo con una diversa durata temporale.
Nell’architettura WLCG/EGEE le VO sono utilizzate per fornire agli utenti di un
gruppo, senza una particolare caratterizzazione geografica, la potenzialità di accedere
7 WNOD:
8 Italian
selezione dinamica di risorse virtuali tramite Grid
Grid Initiative: é la NGI italiana che fa parte del progetto EGI
16
1 Grid
alla risorse di un sistema distribuito, garantendone un accesso coordinato e controllato, o↵rendo all’utente la visibilità di un unico sistema di calcolo logico, facilmente
scalabile.
Ogni entità mette a disposizione della griglia computazionale un insieme di risorse
locali. Ognuna di queste entità può utilizzare le risorse della griglia computazionale
combinandole nel modo più opportuno per risolvere i propri problemi. Inoltre, ogni
entità agisce sia da client che da server (cosı̀ come avviene nella tecnologia peer to
peer).
1.5.2
Sicurezza
La Grid Security Infrastructure (GSI)[17] è una specifica d’autenticazione per una
comunicazione segreta e protetta fra software nell’ambiente Grid. Questa si basa sul
concetto di chiave pubblica criptata (certificati X.5099 ) e sul protocollo di comunicazione Secure Socket Layer (SSL)
10
. Dunque una generica entità della Grid (qualsiasi
essa sia: utente o risorsa) necessita di un certificato digitale rilasciato da una Certification Authority (CA) 11 riconosciuta da WLCG/EGEE.
Il certificato, la cui chiave privata è protetta da una password, è usato per generare e
certificare un proxy certificate, che corrisponde ad un certificato temporaneo (generalmente con una durata di 24 ore) usato per l’attuale autentifica all’interno della Grid
e che non necessita di password. Spesso i lavori che gli utenti hanno la necessità di
eseguire sulla Grid hanno durate molto più lunghe -anche di molti giorni- e potrebbe
accadere che le credenziali scadano prima della fine dei lavori, cosı̀ che questi vengano
invalidati per mancanza di autorizzazione ed eventualmente i risultati prodotti non
siano accessibili. Anche per questo motivo è stato introdotto un sistema di deposito
delle credenziali dell’utente, permettendo la creazione e la relativa memorizzazione
di un certificato proxy a lunga durata in un server dedicato. Il nome del server è
MyProxy, ed il certificato contenuto in questo server viene utilizzato per rinnovare
periodicamente il proxy di un utente che sta per scadere. Lo schema di autenticazione
è mostrato in figura 1.2. Questo servizio oltre che a mantenere a lungo termine le
credenziali degli utenti permette di avere un’autenticazione unica dal punto di vista
dell’utente, cosı̀ che ogni servizio Grid si limiti ad interrogare il MyProxy, senza che
l’utente debba inserire la password della chiave privata per ogni singolo servizio.
Il Virtual Organization Membership Service (VOMS) è un sistema che permette di
complementare un certificato con delle estensioni contenenti informazioni relative alla
VO, il gruppo VO a cui appartiene l’utente, e il ruolo che l’utente ha all’interno della
VO. Nella terminologia VO, un gruppo è un sottoinsieme dell’organizzazione virtuale,
9 In
crittografia, X.509 è uno standard per le infrastrutture a chiave pubblica
è un protocollo realizzato per comunicazioni cifrate su Internet
11 Certification authority è un’entità che rilascia certificati digitali verso terze parti
10 SSL
17
1.5 Architettura WLCG/EGEE
M yP roxy
CA
FIRMA DIGITALE
U te nte
FIRMA DIGITALE
P roxy..1
FIRMA DIGITALE
P roxy..n
FIRMA DIGITALE
Figura 1.2: Autentificazione nella Grid: dalla Certification Autority al servizio
MyProxy.
contenente i membri che condividono responsabilità e privilegi nel progetto. I gruppi
sono organizzati in modo gerarchico.
1.5.3
Elementi principali del middleware
In figura 1.3 sono mostrate le interazioni fra gli elementi principali, a cui corrispondono una o più macchine dedicate, che compongono la Grid di WLCG/EGEE.
Interfaccia Utente
L’Interfaccia Utente (UI, User Interface) è il punto d’accesso alla Grid di WLCG/EGEE.
Questa può essere un qualsiasi computer nel quale l’utente abbia un account e il proprio certificato installato. Dall’interfaccia l’utente può essere autorizzato ad utilizzare
le risorse della Grid, accedendo alle funzionalità o↵erte dall’Information, Workload e
Data Management Systems.
Computing Element
Per la terminologia Grid, un Computing Element (CE) corrisponde ad un insieme di
risorse computazionali localizzate in un sito (esempio: cluster, farm computazionale).
La funzionalità principale del CE è quella della gestione dei job (sottomissione, controllo, etc.). Una delle risorse facenti parte del CE sono i Worker Nodes (WN). Questo
è l’insieme dei nodi che formano il cluster; i WN eseguono i job e contengono gli stessi
comandi e librerie installate nelle UI.
Storage Element
18
1 Grid
Lo Storage Element (SE) è un’entità logica che garantisce un accesso uniforme alle
risorse di memoria. Queste ultime possono essere disk server, disk array o tape disk.
Gli Storage Element possono supportare di↵erenti tipi di protocolli ed interfacce per
l’accesso ai dati memorizzati.
Molti dei siti WLCG/EGEE forniscono almeno uno SE.
COMPONENTE
FISICA
USER
INTERFACE
INFORMATION
INDEX
STORAGE
ELEMENT
WORKER
NODE
RESOURCE
BROKER
COMPUTING
ELEMENT
WORKER
NODE
Figura 1.3: Elementi della Grid WLCG/EGEE.
Resource Broker
Il Resource Broker (RB), è il modulo della Grid che riceve le richieste degli utenti e
interroga l’Information Service per trovare le risorse adatte. Il Workload Management
System (WMS) è un software che risiede nel Resource Broker. Il suo obiettivo è quello
di accettare i job degli utenti, assegnarli ai più appropriati CE, registrare il loro stato
e ritirarne il relativo output al termine dell’esecuzione. Dunque, questa entità regola
l’accesso alle risorse distribuite e↵ettuando il processo detto di match-making.
Information System
L’Information System (IS) fornisce informazioni circa le risorse WLCG/EGEE ed il
loro stato. I sistemi di informazione attualmente utilizzati dalla Grid WLCG/EGEE
sono due: il “Monitoring and Discovering Service” (MDS)[18] che è usato per la scoperta di risorse e per pubblicarne lo stato; il “Relational Grid Monitoring Architecture”
(R-GMA)[19] che invece è usato per il controllo delle risorse e la loro relativa pubbli-
1.5 Architettura WLCG/EGEE
19
cazione ad un livello utente.
Questi servizi si appoggiano a BDII (Berkeley Database Information Index), un database che serve per memorizzare lo stato delle risorse e che contiene tutte le informazioni
disponibili relative a Grid.
1.5.4
Job flow: sottomissione
La figura 1.4 mostra il flusso di lavoro nella sottomissione di un Job nella griglia computazionale WLCG/EGEE.
Figura 1.4: Job Flow nella Grid WLCG/EGEE.
I passi principali sono i seguenti:
• a: l’utente ottiene un certificato digitale dalla Certification Authority; si registra
ad una VO ed ottiene un account ad una Interfaccia Utente; da qui crea un
certificato proxy che permette all’utente di e↵ettuare operazioni;
• b: viene sottomesso un job dall’UI al Resource Broker, specificando i files da
copiare nei Worker Nodes (Input Sandbox); lo stato del job è SUBMITTED;
20
1 Grid
• c: il Workload Management System cerca il miglior Computing Element dispo-
nibile secondo le richieste specificate dall’utente, interrogando il BDII; lo stato
del job è WAITING;
• d: il RB prepara il job per la sottomissione ed invia le informazioni necessarie
al CE selezionato; lo stato del job è READY;
• e: il CE riceve la richiesta; lo stato del job è SCHEDULED;
• f: il manager di risorse locale della farm invia l’esecuzione del job ai WN locali
e i file dell’utente vengono copiati dal RB al WN dove viene eseguito il job; lo
stato del job è RUNNING;
• g: mentre il job è in esecuzione i file possono essere letti da uno Storage Element;
• h: il job può produrre dei file di output nuovi; questi possono essere memorizzati
negli SE ed essere acceduti da altri utenti;
• i: nel caso in cui l’esecuzione del job termina senza errori e l’output prodotto
(Output Sandbox) è di dimensioni non molto grandi quest’ultimo viene copiato
nel Resource Broker; lo stato del job è DONE;
• j: ora l’utente può ritirare l’output del suo job nella sua User Interface; lo stato
del job è CLEARED;
• k: le richieste per il controllo dello stato del job e delle risorse possono essere
e↵ettuate dalla UI;
• l: se un sito a cui è stato inviato il job, non è in grado di accettarlo e di
eseguirlo, allora il job può essere passato ad un altro CE; dopo un certo numero
di risottomissioni il job viene marcato ABORTED.
1.5.5
MAGIC-5: un caso d’uso della Grid
MAGIC-5[20] (Medical Application on a Grid Infrastructure Connection) è una collaborazione italiana fra vari istituti INFN e ospedali il cui fine è quello di sviluppare un
sistema software per applicazioni mediche, che fornisca un’individuazione assistita dal
computer (CAD, Computer Aided Detection) su basi di dati distribuite d’immagini
mediche (mammografia, TAC, . . . ) e la loro scansione automatizzata tramite l’ausilio della tecnologia Grid. Data l’enorme mole di dati da controllare e le dimensioni
delle singole immagini che sconsigliano il trasferimento (vietato d’altra parte da motivi di riservatezza dei dati), l’uso di un sistema automatico distribuito per l’analisi
di immagini mediche è di grandissima importanza per i programmi di monitoraggio;
1.6 Flussi di lavoro complessi in ambienti distribuiti
21
alcuni esempi di applicazione sono: immagini mammografiche ai raggi-x per la diagnosi di cancro al seno, immagini per l’individuazione del cancro al polmone fornite
dalla Computed Tomography (CT) e immagini fornite dalla tomografia ad emissione
di positroni (PET, Positron Emission Tomography), per una diagnosi precoce dell’Alzheimer. Questo permette un’organizzazione dei dati ed una loro analisi remota,
consentendo anche una diagnosi remota interattiva. In questo caso la Grid consente
anche di operare su dati remoti rispettando i limiti previsti dalla legge; infatti, secondo
la tutela della privacy del paziente, non è possibile trasferire dei dati relativi ad esso,
da una struttura ospedaliera ad un’altra senza una burocrazia molto pesante.
MAGIC-5, prevede di trasferire ed eseguire il software sul sito contenente i dati di
interesse e di ricevere il risultato dell’esecuzione del software su quei dati anonimizzati
o meno a seconda dell’applicazione. Questo, oltre a provocare una certa riduzione
dei ritardi associati al processo di monitoraggio, permette un’analisi più efficiente e
sicura, segnalando i casi da sottoporre ad ulteriore analisi da parte di un medico.
1.6
Flussi di lavoro complessi in ambienti distribuiti
I modelli computazionali definiti dalle organizzazioni o istituzioni che hanno bisogno
di una grande quantità di risorse spesso necessitano dell’implementazione di flussi di
lavoro complessi che devono però coesistere con la richiesta di scalabilità. La Grid
dá la possibilità di risolvere i problemi relativi alla scalabilità introducendo servizi e
infrastrutture che permettono a ogni collaborazione di costruire applicazioni specifiche. Quest’ultime implementano di↵erenti flussi di lavoro permettendo di dare una
soluzione alla quasi totalità dei casi d’uso. Soddisfare tutti i requisiti appena descritti
è difficile -o forse impossibile- se s’interagisce direttamente con la Grid, e la tendenza
attuale è quella di andare verso il Client/Server Computing in sostituzione alle applicazioni autonome e indipendenti. L’introduzione di un tale nuovo livello di servizi per
le applicazioni, che si interpone fra quest’ultime e il middleware della Grid, permette
di soddisfare i requisiti in termini di scalabilità dell’infrastruttura e funzionalità messe
a disposizione degli utenti. Inoltre l’utente viene isolato dalle complessità del sistema
distribuito permettendo di costruire un ambiente di lavoro dinamico e modulare. Infatti le applicazioni basate sul client/server computing permettono di mettere in atto,
migliorare e ottimizzare l’utilizzo del middleware della Grid. In particolare la presenza
di un server (o meglio: un insieme di servizi distribuiti su molteplici server) permette
di:
• implementare dei flussi di lavoro specifici e allo stesso tempo complessi;
• gestire facilmente le politiche dell’applicazione decise dalle relative Virtual Organization, centralizzando eventuali cambiamenti;
22
1 Grid
• sganciarsi dall’infrastruttura Grid, con la possibilità per gli amministratori di
gestire le esigenze della VO senza passare dalla Grid;
• nascondere le complessità della Grid agli utenti.
Capitolo 2
Client-server computing
“Real men don’t use backups, they
post their stu↵ on a public ftp server
and let the rest of the world make
copies.”
Linus Torvalds
Negli ultimi anni la crescita esponenziale del Web ha portato allo sviluppo di servizi
fortemente centralizzati in netto contrasto con la natura fortemente distribuita della
rete stessa cosı̀ come era stata concepita. Il sistema client-server, che rappresenta il
core system di molti sistemi presenti ad oggi su Internet, ha portato infatti notevoli
vantaggi in termini di fruizione del servizio. Oltre che nei sistemi Internet, il sistema
client-server ha trovato applicazione in tutti quei contesti in cui è necessaria una
condivisione di risorse e/o una suddivisione dei lavori.
Il termine client-server venne usato per la prima volta nel 1980 in riferimento ad un
personal computer (PC) su una rete, evolvendo nell’attuale modello solamente verso la
fine degli anni ’80. Tale evoluzione ha portato a considerare questo termine un concetto
logico, che non dipende né dalla diversità né dalla locazione dell’hardware; infatti
una singola macchina può essere sia client che server a seconda della configurazione
del software. La tecnologia client-server è dunque un modello per l’interazione tra i
processi di un software che vengono eseguiti contemporaneamente.
2.1
Definizione di client-server computing
Il client-server computing viene usato per descrivere un modello architetturale per
lo sviluppo di sistemi computazionali. Questo modello è basato sulla distribuzione
delle funzioni fra due tipi di processi autonomi e indipendenti: il server e il client.
24
2 Client-server computing
Un client è un qualsiasi processo che richiede uno specifico servizio al processo del
server. Un server è un processo che fornisce i servizi che sono stati richiesti dal client.
I due processi possono risiedere nello stesso computer o su computer diversi, a patto
che questi siano connessi da una rete. Un client può richiedere servizi a più server
all’interno di una rete, senza preoccuparsi della posizione o delle caratteristiche fisiche
del computer su cui si trova il processo del server. La rete che collega il client e il
server diventa cosı̀ il mezzo attraverso il quale i vari processi possono comunicare.
La caratteristica principale del client-server computing è la distribuzione dei compiti
e delle funzioni, potendo cosı̀ concentrare la potenza di calcolo dove vengono svolte le
funzioni computazionalmente più complesse (generalmente è il server). [21]
2.1.1
Un server per ogni client
Alcune tipologie di server sono:
File Server È una macchina progettata per condividere file all’interno di una
rete. Questa mette a disposizione degli utilizzatori di una rete di computer (i client)
dello spazio su un disco (disco singolo o composto da più dischi) nel quale sia possibile
salvare, leggere, modificare, creare file e cartelle condivise da tutti, secondo regole
o autorizzazioni che generalmente il gestore di rete organizza e gestisce. Il processo
server è in un certo senso primitivo, perché per poter trovare i dati richiesti tende a
esigere lo scambio di un alto numero di messaggi. Alcuni esempi di File Server sono:
• UNIX: Network File Services (NFS) creato da Sun Microsystems [22].
• Microsoft Windows “Map Drive” e.g., Rivier College’s “P-drive”.
• Samba: Samba è un progetto libero che fornisce servizi di condivisione di file e
stampanti a client SMB/CIFS [23].
Print Server Questo tipo di server gestisce l’accesso ai dispositivi di uscita condivisi, come le stampanti. Questi sono stati il primo tipo di server. Un servizio di
stampa può trovarsi in un solo Print Server o su più macchine separate, che funzionano
come un unico Print Server.
Application Server Questa macchina gestisce l’accesso ad applicazioni software
centralizzate, come nel caso di un database condiviso. Quando l’utente richiede delle
informazioni l’Application Server processa la richiesta e ritorna il risultato del processo all’utente.
Mail Server Questo servizio gestisce il flusso della posta elettronica, della messaggistica e della comunicazione nei sistemi a larga scala, come con sistemi di tipo
2.1 Definizione di client-server computing
25
Mainframe.
Fax Server Fornisce la struttura per inviare e ricevere i fax attraverso una singola
connessione di rete telematica. Il Fax Server può essere costituito da una stazione di
lavoro con una scheda che permette d’interfacciarsi al Fax e da un software gestionale
specifico, oppure può essere semplicemente costituito da un dispositivo specializzato
dedicato e progettato per servizi Fax. Questa macchina gestisce il flusso delle informazioni del Fax da e per la rete (simile al Mail Server).
Directory Services Server Sistema tipico negli ambienti a larga scala in cui i
dati sono distribuiti attraverso più server. I servizi di directory forniscono uno strato
di astrazione tra le risorse e gli utenti, organizzando e memorizzando le informazioni
su reti di computer e su risorse condivise disponibili tramite la rete. Il servizio di
directory fornisce anche un controllo degli accessi sull’utilizzo delle risorse condivise
in modo da favorire il lavoro dell’amministratore di sistema.
Web Server Sistema che memorizza e recupera dati da Internet o dall’intranet.
Tipicamente ci sono dei client leggeri, come i browser web, che consentono di richiedere una pagina web (spesso scritta in HTML), messa a disposizione dal server. Le
informazioni inviate dal server web viaggiano in rete trasportate dal protocollo HTTP
(Hyper Text Transfer Protocol). L’insieme di server web dà vita al World Wide Web,
uno dei servizi più utilizzati di Internet. Normalmente un server web risiede su sistemi
dedicati ma può essere eseguito su computer ove risiedano altri server o che vengano
utilizzati anche per altri scopi.
Web Application Server È un software che fornisce l’infrastruttura e le funzionalità di supporto, sviluppo ed esecuzione di applicazioni e componenti server in un
contesto distribuito orientato per il web. Si tratta di un complesso di servizi per la
realizzazione di applicazioni multilivello ed enterprise, con alto grado di complessità.
Alcuni esempi di Web Application Server sono: Internet Information Server (IIS) di
Microsoft, iPlanet della Netscape, WebSphere della IBM, WebLogic di BEA and Oracle Application Server.
Database Server Un server di basi di dati è un servizio che fornisce l’accesso
ai dati organizzati all’interno del database localizzato sul server. Questo si occupa di
fornire i servizi di utilizzo del database ad altri programmi e ad altri computer secondo
la modalità client-server. Il server memorizza i dati, riceve le richieste dei client ed
elabora le risposte appropriate. I Database Server sono complessi sistemi software
26
2 Client-server computing
concepiti, oltre che per memorizzare i dati, anche per fornire un accesso rapido ed
efficace ad una pluralità di utenti contemporaneamente e garantire protezione sia dai
guasti che dagli accessi indebiti. Un esempio di Database Server è: Oracle9i[24].
2.1.2
Caratterizzazione
Le caratteristiche in base alle quali possiamo classificare i sistemi client-server sono
principalmente due:
• il tipo di distribuzione dei servizi fra le due entità che permette di definire i
concetti di Fat Client e Fat Server.
• la capacità del server di avere transazioni indipendenti da ogni precedente interazione o meno, cioè di avere un server con o senza stati.
Client-server: massiccio o snello (fat or thin).
Un’entità è chiamata client o server a seconda di quale sia il livello di condivisione delle
operazioni fra di essi. Un client snello (thin) è un client che esegue direttamente solo
un minimo dell’elaborazione, mentre uno massiccio (fat) si fa carico di una proporzione
dell’elaborazione decisamente più amplia. Il criterio di definizione del concetto di Fat
Client o Fat Server è dato dal criterio di quanto un’applicazione sia sul client o sul
server.
• Fat Client: vengono utilizzati nei tradizionali modelli di client-server compu-
ting; spesso la loro introduzione comporta problemi non indi↵erenti dal punto di
vista della manutenzione o dell’assistenza. Un esempio ne sono le applicazioni
Web 2.0 come Google Mail che presenta un’interfaccia ricca (scritta in Ajax) ad
un sistema di posta elettronica.
• Fat Server: il server contiene la logica del sistema, mettendo a disposizione
un livello di servizi astratto. Il vantaggio più grande nell’usare un server massiccio è dovuto al fatto che la gestione è più semplice, perché, in caso di
una qualsiasi modifica al software del server è sufficiente intervenire solamente
sul server, invece che andare a modificare tutti i client che sono potenzialmente
disponibili. Le tendenze attuali privilegiano questo tipo di sistema, dove sempre
più spesso il client leggero corrisponde a un browser web.
Client-server: con o senza stati stateless or stateful Un server senza stati
(Stateless Server ) è un server che tratta ogni richiesta come una transazione indipendente scorrelata da ogni precedente richiesta [25]. Il vantaggio più grande di questa
proprietà è che semplifica di molto la progettazione del server, perché esso non ha
bisogno nè di tenere in relazione transazioni diverse, nè di allocare dinamicamente
2.1 Definizione di client-server computing
27
un’area di memoria dedicata o di preoccuparsi di liberare lo spazio allocato se il client
s’interrompe nel mezzo della transazione. Ovviamente ci sono anche degli svantaggi,
quali:
• dover includere un quantitativo di informazioni maggiore per ogni richiesta;
• il server deve ogni volta interpretare tutte le informazioni.
Un esempio di un server senza stati è un server del World Wide Web (fatta eccezione
dei cookies1 ): questi prendono come input la richiesta (URL) che specifica completamente il documento richiesto e non hanno bisogno di nessun contesto particolare o
memoria allocata durante una precedente richiesta. Questo tipo di server contrasta
con un tradizionale server FTP[26], che gestisce una sessione interattiva con l’utente.
Nel caso di una richiesta per un file che si trova sul server FTP, si assume che l’utente si sia precedentemente autenticato e che la directory corrente e la modalità di
trasferimento del file siano già state definite. Un server con stati (Stateful Server ) ha
una tabella che permette di registrare in modo incrementale le informazioni e lo stato
delle interazioni in corso con i client, incluse le risposte ad ogni richiesta, in modo
che il server possa tener traccia di tutte le richieste e↵ettuate dal client. Il vantaggio di un server con stati è che i messaggi scambiati sono di dimensioni minori e che
sono trattati in modo più efficiente. Alcuni svantaggi sono invece dovuti ai possibili
problemi che il client incontra: nel caso in cui questo incorra in interruzioni ripetute
e frequenti, la grande quantità di informazioni che devono essere gestite dal server
possono peggiorare le prestazioni di quest’ultimo. L’esempio migliore di un server con
stati è un File Server remoto.
Stateless vs Stateful Server.
Confrontando da un punto di vista analitico i server con e senza stati possiamo notare
che:
• Un server con stati tiene traccia dei dati del client (dati) fra una richiesta e la
successiva.
• Un server senza stati non mantiene nessuna informazione sullo stato; ad esempio,
usando un File Server che non mantenga gli stati, per ogni richiesta il client
devrebbe indicare il nome completo del file, specificando dove leggere e scrivere,
riautenticandosi ad ogni richiesta.
1I
cookie HTTP (più comunemente denominati Web cookies, tracking cookies o semplicemente
cookie) sono frammenti di testo inviati da un server ad un Web client (di solito un browser) e poi
rimandati indietro dal client al server - senza subire modifiche - ogni volta che il client accede allo stesso
server. I cookie HTTP sono usati per eseguire autenticazioni e tracking di sessioni e memorizzare
informazioni specifiche riguardanti gli utenti che accedono al server.
28
2 Client-server computing
• Usando un File Server con stati il client può inviare meno informazioni per ogni
richiesta, diventando cosı̀ il modello più semplice.
D’altro canto, un server senza stati è più robusto e ad esempio:
• le connessioni perse non lasciano un file in uno stato invalido;
• riavviando il server non viene persa nessuna informazione;
• un riavvio del client non causa nessuna confusione in un server senza stati.
2.1.3
Funzioni del client
Le operazioni principali dei sistemi client sono:
• Gestione dell’interfaccia utente.
• Controllo della sintassi degli input degli utenti.
• Gestione della logica dell’applicazione.
• Generazione delle richieste per le operazioni da eseguire e loro trasmissione al
server.
• Gestione della comunicazione con il server.
2.1.4
Funzioni del server
Le operazioni principali che sono svolte dal server sono:
• Accettazione e trattamento delle richieste ricevute dal client.
• Controllo dell’autorizzazione.
• Garanzia di preservare l’integrità.
• Esecuzione delle operazioni necessarie e trasmissione delle risposte al client.
• Manutenzione di un catalogo/tabella del sistema.
• Capacità di uso concorrente tra più client (multiclient).
• Ripristino del sistema in caso di fallimento.
29
2.1 Definizione di client-server computing
2.1.5
Modelli strutturali
Quando si parla di topologia nei sistemi client-server ci si riferisce alla disposizione
e alla struttura fisica della rete client-server, in cui tutti i client e tutti i server sono
connessi gli uni con gli altri, includendo tutte le stazioni di lavoro. I diversi schemi di
topologie e strategie usate sono i seguenti [27]:
• Unico client, unico server: in questa topologia un unico client è connesso al
server come mostrato in figura 2.1.
• Più client, unico server: i client sono multipli e sono connessi ad un unico server,
figura 2.2.
• Più client, più server: i client sono multipli e sono connessi a molteplici server,
figura 2.3.
Server
Client
Figura 2.1: Topologia client-server con un server per un unico client.
Server
Client
Client
Client
Client
Client
Figura 2.2: Topologia client-server con un solo server per client multipli.
La struttura dei due casi in figura 2.2 e 2.2 è tale da introdurre il problema legato
alla presenza di un unico server, infatti nel caso di non disponibilità di quest’ultimo
i servizi non sono più accessibili. Questo problema è conosciuto come Single Point
of Failure. L’indisponibilità di tale servizio può essere legata a un attacco maligno,
un problema di rete o la semplice manutenzione del server. La soluzione ridondante
mostrata in figura 2.3 permette di avere un servizio più stabile dal punto di vista della
disponibilità, in quanto è basata su server multipli. Questi introducono la capacità di
30
2 Client-server computing
Server
Server
Server
Server
Server
Client
Client
Client
Client
Client
Figura 2.3: Topologia client-server con più server e più client.
cambiare server quando quello precedentemente contattato è terminato inaspettatamente o non è stato proprio possibile contrattarlo (failover ). Tale tecnica avviene in
modo trasparente senza l’intervento umano e senza nessun avvertimento. [28]
2.1.6
Integrazione con il calcolo distribuito
Una caratteristica tipica del calcolo distribuito è quella di avere delle tecnologie implementate attraverso ambienti eterogenei 1.2.1. Nel caso dei sistemi eterogenei, questo
implica la capacità di comunicare con altri sistemi e protocolli. Il calcolo distribuito ha
un’architettura complessa, che implica la progettazione delle applicazioni e lo sviluppo
dei sistemi in una nuova ottica, andando ad aumentare l’efficienza di manutenzione
della rete nel suo insieme. Molte entità distribuite lavorano per conto di un client
che e↵ettua una richiesta e proprio la presenza di più server fa si che il sistema sia in
grado di tollerare gli errori (fault tolerant), il che è un vantaggio enorme rispetto ai
sistemi centralizzati. Per far sı̀ che il calcolo distribuito diventi efficace e di fatto rivoluzionario, gli sviluppatori delle applicazioni distribuite devono fare tutto il possibile
per minimizzare la complessità delle architetture e della manutenzione, integrando i
vari software con le varie piattaforme. La progettazione di applicazioni basate su di
un’architettura di tipo client-server necessita della modularizzazione delle applicazioni
e delle relative funzioni in componenti discrete. Queste componenti devono essere legate solamente da dati incapsulati e funzioni che possono essere spostate da un sistema
ad un altro. Questo modello di progettazione dà ai software basati sull’architettura
client-server una maggiore adattabilità e flessibilità.
2.2 Classificazione dei sistemi client-server in base alla topologia
2.2
31
Classificazione dei sistemi client-server in base
alla topologia
Esistono tre tipi di sistemi client-server [25]:
• Due livelli (Two-tiers).
• Tre livelli (Three-tiers).
• N-livelli (N-tiers).
2.2.1
Modello a due livelli (two-tiers)
I due livelli di un’applicazione basata su questo tipo di sistema sono generalmente
collegati dalla rete, ma in alcuni casi entrambi i livelli possono essere presenti sulla
stessa macchina. La tendenza è quella di centralizzare la logica dell’applicazione sul
server, rendendo la manutenzione del codice più semplice. L’architettura client-server
è per definizione composta da almeno due livelli, dove il client è il primo livello mentre
il secondo livello è costituito dal server. Il client richiede i servizi al server, comunicando direttamente con esso senza nessun altra entità intermedia. Un’illustrazione del
modello a due livelli è mostrata in figura 2.4.
CLIENT
APPLICAZIONE
LIBRERIE
INTERFACCIA
DI RETE
INTERFACCIA
DI RETE
LIBRERIE
APPLICAZIONE
SERVER
Figura 2.4: Modello client-server su due livelli.
Un esempio tipico di applicazione che implementa questo modello è il Database
32
2 Client-server computing
Server, in cui le richieste (query SQL) vengono fatte dall’applicazione e poi processate
dal database per l’esecuzione. I risultati vengono quindi mandati indietro attraverso
lo stesso meccanismo, ma nella direzione opposta.
I sistemi a due livelli presentano vari vantaggi:
• Permettono di avere un’applicazione con un’interfaccia grafica più accattivante,
rispetto a quanto fosse possibile con le precedenti tecnologie.
• L’implementazione è più veloce e meno complicata rispetto ai sistemi con un
numero maggiore di livelli.
• O↵rono la possibilità di una gestione semplice e flessibile.
• La disponibilità di strumenti ben integrati come quelli messi a disposizione dai
produttori di DBMS.
Contrariamente vi sono alcuni svantaggi con le architetture su due livelli:
• Lo sviluppo dell’applicazione dev’essere portato avanti anche lato client, la ma-
nutenzione del client è di conseguenza costosa; infatti in un’architettura a due
livelli il client è generalmente fat client;
• Maggiore carico della rete: poiché l’elaborazione dei dati avviene sul client, i
dati devono essere trasportati nella rete, portando uno stress maggiore alla rete.
• La procedura di distribuzione del software per il modello in questione è complicata. Siccome la logica dell’applicazione si trova anche lato client, tutte le
macchine che ne ospitano uno devono essere aggiornate in caso di una nuova
release. Questa procedura oltre che essere complicata, costosa e soggetta ad
errori, porta via molto tempo.
• Le macchine client sono considerate deboli in termini di sicurezza e sono relativamente facili da corrompere.
• Le librerie necessarie all’esecuzione dell’applicazione devono essere caricate sul
client.
• L’architettura su due livelli causa problemi quando è implementata su Internet.
2.2.2
Modello a tre livelli (three-tiers)
Più la logica dell’applicazione è distribuita fra i vari livelli dell’architettura più diventa
difficile raggiungere un buon livello di riusabilità. Per evitare di includere la logica
dell’applicazione sia a livello del server che lato client, un terzo livello software può
2.2 Classificazione dei sistemi client-server in base alla topologia
33
essere inserito nel mezzo. In questo caso si parla di un’architettura a tre livelli (threetiers), dove la maggior parte della logica si trova nel livello intermedio e dove ogni
livello corrisponde ad un servizio che viene messo a disposizione dal sistema. Con
questo tipo di struttura quando è necessario cambiare la logica dell’applicazione è
sufficiente modificare solo il livello intermedio. Ogni livello architetturale può essere
associato ad un specifica categoria logica:
• Rappresentazione (GUI) dei servizi per l’utente: include la manutenzione dell’interfaccia grafica per l’utente e la presentazione di ció che gli utenti vedono
sul monitor.
• Servizi dell’applicazione e della logica: includono l’esecuzione di applicazioni e il
flusso del programma di controllo, cioè la logica che si occupa della convalida dei
dati e delle richieste/risposte nella comunicazione fra i processi dei vari livelli.
• Core server: si riferisce al server che esegue e↵ettivamente le richieste e che
eventualmente gestisce la base di dati sottostante. In questo caso la logica del
server interagisce con la gestione, l’accesso e la sicurezza dei dati.
Sulla base di queste tre categorie logiche, i tre livelli dell’architettura del sistema
client-server sono mostrati in figura 2.5.
PROXY SERVER
LIBRERIE
APPLICAZIONE
INTERFACCIA
DI RETE
INTERFACCIA
DI RETE
INTERFACCIA
DI RETE
LIBRERIE
LIBRERIE
APPLICAZIONE
APPLICAZIONE
CLIENT
SERVER
Figura 2.5: Modello client-server su tre livelli.
Il server del livello intermedio funziona come un proxy per tutte le richieste che
vengono dai client, inoltrandole al Core server e restituendo il risultato al client dopo
che la richiesta è stata processata. Oltre a funzionare come un livello intermedio, il
34
2 Client-server computing
proxy server coordina l’esecuzione dei lavori sul Core server.
Quest’architettura permette di creare un ambiente di lavoro più sicuro per il server
che svolge le richieste. Ma anche per questo modello ci sono un paio di inconvenienti:
• la necessità di avere un piccolo processo (listener) all’interno del server intermedio;
• tutte le richieste del client devono essere trasmesse in una rete tramite un
protocollo ben definito.
I confini fra i vari livelli sono di tipo logico.
Primo livello (client). La responsabilità principale di questo livello è quella di
ricevere gli eventi degli utenti, controllare l’interfaccia utente e rappresentare i dati
sull’interfaccia. Poiché con questa architettura la maggior parte del software è rimosso
dal client, questo è sottile (thin).
Secondo livello (application/proxy server). La parte complessa della logica dell’applicazione è all’interno di questo livello ed è disponibile per il livello client,
quando questo la richiede. Tale livello costituisce l’entità centrale per la soluzione dei
problemi presenti nel modello a due livelli, anche proteggendo l’accesso diretto di dati.
Terzo livello (core server). Questo livello è responsabile della memorizzazione
dei dati, spesso tramite un File Server e un gestore di basi di dati.
I livelli sopra elencati possono essere eseguiti tutti in un’unica e medesima macchina, in quanto è importante che il sistema sia ben strutturato e che la progettazione
dei confini fra i vari software esistenti nei diversi livelli sia ben definita. Alcuni dei
vantaggi derivanti dall’utilizzo del modello a tre livelli includono:
• La manutenzione delle applicazioni è centralizzata perché la logica necessaria
agli utenti finali è nel server intermedio. Ciò permette di eliminare una delle
problematiche più importanti che è presente nel modello tradizionale a due livelli:
la distribuzione del software.
• Attraverso la separazione netta fra l’interfaccia utente, il controllo e la presentazione dei dati dalla parte logica dell’applicazione più client possono accedere
ad una vasta gamma di applicazioni messe a disposizione dal server. I vantaggi
principali per le applicazioni client sono due: uno sviluppo più rapido grazie al
riutilizzo delle componenti logiche già esistenti ed una fase di test più breve, in
quanto le componenti del server sono già state testate a parte.
2.2 Classificazione dei sistemi client-server in base alla topologia
35
• Molti utenti sono in grado di accedere ad una vasta gamma di applicazioni server,
proprio perché tutte le applicazioni logiche sono messe a disposizione sul server
del terzo livello.
• Di regola i server sono sistemi fidati (trusted ) e l’autorizzazione è più semplice
rispetto a quella di numerosi client non attendibili, cosı̀ che la protezione e la
sicurezza dei dati sono più semplici da ottenere. Pertanto, questo sistema ha
senso anche per l’esecuzione di tutti quei processi critici in cui la sicurezza dei
dati sensibili sul server è uno dei punti chiave.
• La ridefinizione delle strategie di memorizzazione non influenza i client. Nei
sistemi ben progettati, il client accede ai dati attraverso un’interfaccia stabile
che incapsula tutti i dettagli della memorizzazione.
• Il bilanciamento del carico è più facile grazie alla separazione della logica dell’applicazione dal Core server.
• Il bilanciamento dinamico del carico: nel caso in cui vi siano dei colli di bottiglia
in termini di prestazioni il processo del server può essere trasferito ad altri server
in fase di esecuzione.
• La necessità di avere un hardware meno costoso per quanto riguarda il client
(thin).
• La gestione di un qualsiasi cambiamento nella logica è più facile e più veloce da
eseguire, perché la componente logica è implementata sul server, quindi in un
unico posto piuttosto che su numerosi client.
• La modularità dei vari livelli rende più facile modificare o sostituire un livello
senza che vengano interessati gli altri livelli.
• I client non hanno bisogno di avere le librerie native caricate a livello locale, ma
queste possono essere gestite centralmente.
• Il server principale può non essere direttamente visibile a Internet.
Un ulteriore vantaggio dell’architettura a tre livelli è che mappa in modo del tutto
naturale il Web, con un browser Web che agisce come thin client e un server Web che
agisce come application server.
Alcuni svantaggi di questo modello invece sono:
• Il client non mantiene una connessione persistente e diretta al server principale
(come nel caso di un Database Server).
• Può essere necessario un proxy server separato.
36
2 Client-server computing
• Nel caso in cui venga utilizzato un proxy server separato puó venire generato un
traffico di rete maggiore.
• Il protocolli di rete utilizzati possono essere protocolli proprietari.
L’architettura a tre livelli può essere facilmente estesa a N livelli, con dei livelli
aggiuntivi necessari a fornire una maggiore flessibilità e scalabilità. Ad esempio, il
livello intermedio del modello a tre livelli potrebbe essere diviso in due, con un livello
per il server Web e un altro per il server delle applicazioni.
Architettura a tre livelli e Internet.
Con il rapido sviluppo di Internet e delle tecnologie Web, le applicazioni clientserver in esecuzione su Internet e intranet stanno diventando un nuovo tipo di calcolo
distribuito. Una tipica applicazione web utilizza la seguente architettura su tre livelli.
• L’interfaccia utente viene eseguita sul desktop come client.
• Il client è collegato (attraverso uno o più collegamenti immediati al server) ad
un Web server, che può essere un magazzino per delle applicazioni scaricabili (le
componenti software).
• Il server web è, a sua volta, sostenuto da un Database Server che tiene traccia
delle informazioni specifiche per l’interesse del client e la relativa storia.
• Queste applicazioni web si basano su standard di Internet (HTTP, HTML, XML,
ecc).
2.2.3
Modello a N livelli (N-tiers)
Nel modello computazionale a N livelli gli sviluppatori sono obbligati a progettare
le componenti secondo un ben preciso schema che rappresenti le entità, i rapporti, le
attività e le regole, per una distribuzione ottimale delle funzioni tra livelli logici e fisici,
consentendo un migliore utilizzo delle piattaforma hardware e delle risorse condivise.
Un altro aspetto della suddivisione su N livelli è che sia gli sviluppatori di applicazioni
che gli amministratori sono in grado di identificare i colli di bottiglia e quindi:
• aggiungere più hardware dove necessario, permettendo un bilanciamento migliore del carico;
• duplicare i servizi per avere una disponibiltà continua in caso di fallimento (failover ).
La suddivisione può essere e↵ettuata fra la logica delle componenti dell’applicazione,
la sicurezza logica e la logica di presentazione, il calcolo ad alta intensità e le componenti con un alto I/O e cosı̀ via. Nella progettazione di un sistema con questa
37
2.3 Client-server: vantaggi e svantaggi
topologia l’approccio che viene più comunemente utilizzato è quello con un’architettura su tre livelli. I modelli su tre o N livelli sono simili, se non per il fatto che quello su
quest’ultimo permette di definire un maggior scomposizione e quindi modularitá dei
servizi. Perció, per la distribuzione dei servizi di alcuni sistemi spesso si opta per una
struttura con ben più di tre livelli, infatti un’infrastruttura che supporta tre livelli è
spesso composta da svariate macchine e servizi, le cui funzionalità non fanno parte
della progettazione. In figura 2.6 è illustrata l’architettura N-tier.
Server 1
Server 2
CLIENT
Server 3
SERVER N
Server X
Server N-2
Figura 2.6: Modello client-server su N livelli.
Un sistema client-server su N livelli o↵re numerosi vantaggi rispetto ai modelli
tradizionali su uno o due livelli, fra cui:
• migliori prestazioni complessive;
• logica dell’applicazione centralizzata;
• raggiunto un livello di protezione nettamente più avanzato.
2.3
Client-server: vantaggi e svantaggi
2.3.1
Vantaggi
Ci sono diversi vantaggi associabili al modello di client-server computing:
• Prestazioni e carico di lavoro ridotto: l’elaborazione è ripartita tra il client
e il server, quindi le prestazioni dell’applicazione non sono legate principalmen-
te alle caratteristiche della postazione di lavoro (desktop); questa deve essere
solamente in grado di eseguire il software del client (aumentando la durata dei
vecchi PC, da un punto di vista dell’utilità nel tempo). Di conseguenza c’è anche l’e↵etto di riduzione del carico sulla rete che collega la stazione di lavoro al
server, che invece di inviare tutte le richieste del client avanti e indietro, si limita
a inviare solo le domande e le risposte dal server dell’applicazione.
38
2 Client-server computing
• Indipendenza dalla stazione di lavoro: gli utenti non sono limitati a un solo
tipo di sistema o piattaforma, in quanto è possibile avere sistemi compatibili
con tutte o quasi le stazioni di lavoro (in base al tipo e alla versione del sistema
operativo), in modo del tutto trasparente.
• Interoperabilità dei sistemi: il modello client-server, non permette solo
di cambiare in modo del tutto trasparente una componente, ma dà anche la
possibilità alle diverse componenti o sistemi (client, rete o server) di lavorare
assieme.
• Scalabilità: la natura modulare del sistema client-server permette sostituzioni
senza danneggiare il resto del sistema. Per esempio, è possibile aggiornare il
server ad una macchina più potente, senza cambiamenti visibili all’utente. Questa capacità di cambiare le componenti del sistema rende il modello client-server
particolarmente aperto all’introduzione di nuove tecnologie, sia hardware che
software.
• Integrità dei dati: è preservata, in quanto il server può usufruire e fornire un
numero di servizi che proteggano i dati come, l’archiviazione crittografata dei file,
il backup in tempo reale (mentre i dati stanno venendo elaborati), il mirroring
del disco (dove i dati sono automaticamente duplicati su un’altra partizione
dello stesso disco fisso), la duplicazione dei dati (i dati vengono automaticamente
scritti su un disco rigido diverso), l’elaborazione delle transazioni che consente di
tenere traccia delle modifiche apportate ai dati e di correggere eventuali problemi
che possono sorgere (ad esempio in caso di crash del server).
• Accessibilità dei dati: poiché il server detiene la maggior parte dei dati in una
posizione centralizzata, più utenti possono accedere e lavorare simultaneamente
sui dati garantendone una maggiore condivisione.
• Amministrazione del sistema: l’ambiente client-server é particolarmente maneggevole, favorendo una gestione centralizzata del sistema. Inoltre, poiché i dati
sono centralizzati, la gestione di questi può anch’essa essere centralizzata. Alcune delle funzioni di amministrazione del sistema sono relative alla gestione della
sicurezza, dell’integrità dei dati e il recupero del sistema in caso di fallimenti.
• Servizi integrati: tutte le informazioni che il client ha il diritto di utilizzare
sono disponibili sulla propria stazione di lavoro, tramite l’interfaccia, cosı̀ che non
vi sia la necessità di modificare le modalità di accesso diretto alle informazioni.
• Mascheramento dell’accesso fisico ai dati: l’accesso ai dati memorizzati in
un punto qualsiasi della rete, dal PC locale, al server locale o anche al server su
2.3 Client-server: vantaggi e svantaggi
39
WAN, avviene utilizzando lo stesso tipo di richiesta dei dati. L’unica di↵erenza
può essere dovuta ad una riduzione delle prestazioni, ad esempio se la larghezza
di banda della rete è insufficiente.
• Indipendenza dal luogo di trattamento dei dati: gli utenti accedono tramite una stazione di lavoro senza nessuna preoccupazione riguardante l’ubicazione
o la tecnologia dei processori coinvolti. Con un sistema utente centrico il desktop fornisce il punto di accesso al sistema (ed eventualmente al gruppo di lavoro,
servizi aziendali inclusi), senza nessun legame con la piattaforma di esecuzione
dell’applicazione.
• Costi operativi ridotti: il costo dell’hardware e del software è in continua
discesa, il che significa che il valore di calcolo è in continuo aumento. Il modello
client-server o↵re un modo per sfruttare questo andamento, sostituendo i sistemi
di grandi dimensioni spesso molto costosi, con quelli meno costosi e più piccoli
ma collegati in rete.
• Costo dell’hardware ridotto: il costo dell’hardware può essere ridotto, in
quanto è solo il server che richiede lo spazio e la potenza di elaborazione sufficiente per memorizzare e gestire l’applicazione.
• Costi di comunicazione sono ridotti: l’applicazione svolge parte delle ope-
razioni lato client, inviando solo una richiesta per l’accesso ai servizi del server
attraverso la rete, quindi una minore quantità di dati passa attraverso la rete.
2.3.2
Svantaggi
Pure gli svantaggi connessi all’uso del modello computazionale client-server sono diversi:
• Costi di manutenzione: il principale svantaggio di questo modello è dato
dall’aumento del costo del personale amministrativo e di sostegno per mantenere
il server. In genere l’amministratore di rete può prendersi carico anche della
gestione e manutenzione del server, di controllare l’accesso degli utenti ad esso
e di supportare le relative applicazioni. Tuttavia, quando il numero degli utenti
del server aumenta, o non appena aumenta la quantità di informazioni gestite
dal server stesso, diviene necessario assumere un amministratore del server.
• Costo della formazione: la formazione può comportare dei costi aggiuntivi,
in quanto il personale d’amministrazione deve acquisire familiarità con il sistema
operativo e l’applicazione, specialmente lato server.
40
2 Client-server computing
• Costo dell’hardware: quando si vuole avere un server con delle buone presta-
zioni e un’integrità dei dati ottima si verifica un aumento dei costi dell’hardware,
dovuto all’acquisto di hardware ad alta potenza (grande quantità di RAM, spazio
su disco rigido, ...).
• Costo del software: il costo complessivo del software è generalmente superiore
a quello dei PC tradizionali.
• Complessità: le componenti che costituiscono l’intero sistema client-server possono essere molte, e, più sono le componenti, più sono le cose che possono anda-
re storte, rendendo più difficile individuare la sorgente del problema quando si
verificano degli errori o, ancora peggio, quando il sistema si blocca.
2.4
Sviluppo di un sistema client-server
Lo sviluppo nel caso di sistemi client-server è un processo molto diverso dai tradizionali
metodi di sviluppo dei sistemi informativi. Ad esempio, l’approccio nel caso dello
sviluppo di sistemi orientati verso un ambiente centralizzato come quello mainframe e
basato sui tradizionali linguaggi di programmazione che difficilmente può essere usato
per poter ottenere uno sviluppo ottimale di un sistema client-server che si basa sulla
diversità di hardware e software fra le entità coinvolte. Inoltre, gli utenti moderni sono
più esigenti e hanno una conoscenza migliore della tecnologia informatica rispetto agli
utenti che usavano il PC quando questo è comparso. [29]
2.4.1
Strumenti di sviluppo
In un contesto in rapida e continua evoluzione come quello attuale, una delle decisioni
più critiche per lo sviluppo di un’applicazione client-server è la scelta degli strumenti
più adeguati al problema. Come regola generale, i manager tendono a scegliere uno
strumento che abbia un potenziale di sopravvivenza a lungo termine. Tuttavia, la
scelta di uno strumento per la progettazione o lo sviluppo di applicazioni deve essere
guidato dalle esigenze di sviluppo del sistema. Una volta che tali requisiti siano stati
definiti, è opportuno determinare le caratteristiche dello strumento che si vorrebbe
avere. Gli strumenti per lo sviluppo client-server includono:
• Interfaccia grafica (GUI ) per lo sviluppo.
• Costruttore d’interfacce grafiche per le applicazioni.
• Sviluppo orientato agli oggetti, utilizzando un repository centrale per i dati e le
applicazioni.
2.5 Software Development Life Cycle
41
• Supporto per database multipli (gerarchici, in rete, relazionali).
• Accesso ai dati indipendentemente dal modello di dati.
• Definizione di un SDLC (System Development Life Cycle) completo che serva
come supporto dalla progettazione, all’implementazione e alla manutenzione del
progetto.
• Gruppo di sviluppo e di supporto.
• Supporto per gli strumenti di sviluppo appartenenti a terze parti (es: librerie)
• Supporto per piattaforme multiple (sistema operativo, hardware e GUI).
• Supporto del protocollo di rete (TCP / IP, IXP / SPX, NetBIOS, e cosı̀ via).
Non è possibile definire quale sia la scelta migliore per ogni singolo strumento necessario allo sviluppo delle applicazioni, ad esempio non tutti gli strumenti supporteranno
tutte le GUI, i sistemi operativi, i middleware o i database. I manager del progetto devono scegliere uno strumento che si adatti sia alle esigenze di sviluppo delle
applicazioni sia che corrisponda alle risorse umane disponibili, nonché all’infrastruttura hardware. È probabile che il sistema richiederà più strumenti di quanti ne siano
e↵ettivamente utili, assicurarandosi che tutti o la maggior parte dei requisiti siano
soddisfatti. Individuare gli strumenti di sviluppo è solo il primo passo, mentre fare in
modo che il sistema soddisfi i suoi obiettivi a livello di client, server, e di rete è un
altro problema.
2.5
Software Development Life Cycle
Nell’ingegneria del software il System Development Life Cycle (SDLC) è il processo
di creare o alterare i sistemi, e consiste nell’insieme di modelli e metodologie usati
specialmente nell’ingegneria del software per il loro sviluppo. Queste metodologie
costituiscono il framework per pianificare e controllare la creazione di un sistema
informativo: il processo di sviluppo software.
Il SDLC aderisce alle fasi importanti che sono essenziali per gli sviluppatori, come
la pianificazione, l’analisi, la progettazione e l’implementazione e ne esistono svariati
modelli. Storicamente il piú antico è quello a cascata: una sequenza di fasi nelle
quali l’output di ogni fase è l’input della successiva. Generalmente queste fasi seguono
sempre quelle di base, ma molte metodologie a cascata danno diversi nomi alle fasi
e il numero di queste puó variare da 4 a 7. Comunque, non si puó parlare di un
modello SDLC definitivamente corretto, in quanto ogni fase puó essere caratterizzata
e suddivisa in varie fasi.
42
2 Client-server computing
Nel modello a cascata (waterfall model) ogni fase è costruita sovrapponendone una
sull’altra, prendendo l’output della fase precedente, aggiungendo ulteriore lavoro e
producendo dei risultati che sono influenzati da quelle precedenti. Questo tipo di
approccio top-down serve per soddisfare le intenzioni originarie mantenendo la qualitá
del prodotto.
Nei prossimi paragrafi sono descritte le fasi principali, quelle che possiamo considerare
essere la base di uno sviluppo, cosı́ come sono mostrate in figura 2.7.
PLANNING
REQUISITI
(definizione)
DESIGN
SVILUPPO
TEST
(integrazione)
INSTALLAZIONE
Figura 2.7: SDLC: fasi base.
2.5.1
Pianificazione
La fase di pianificazione stabilisce una vista ad ampio spettro di quello che sará il
software finale, usandola per definire la struttura base del progetto, valutare la fattibilitá e i rischi associati ad esso, descrivendo una gestione appropriata e gli approcci
piú tecnici.
La parte piú critica di questa fase è la definizione ad alto livello dei requisiti del prodotto, soprattutto riferito ai suoi obiettivi, mentre tutti i requisiti del software devono
essere definiti nella fase relativa.
L’output di questa fase consiste dei piani di configurazione della gestione, un piano di
assicurazione della qualitá e il piano del progetto con il relativo programma di lavoro
che include le attivitá per la fase successiva.
2.5.2
Definizione dei requisiti
Questo processo prende in input gli obiettivi identificati nella sezione dei requisiti ad
alto livello della fase di pianificazione. Ogni obiettivo viene quindi raffinato in un
insieme di uno o piú requisiti. Questi requisiti definiscono:
2.5 Software Development Life Cycle
43
• le funzioni principali dell’applicazione desiderata,
• le aree dati operative,
• entitá dati iniziali.
Questa fase consiste nel ripartire il sistema in parti di↵erenti e disegnare un diagramma
per un’analisi dettagliata. Analizzare gli obiettivi del progetto, ripartire le funzionalitá
che devono essere create e coinvolgere gli utenti cosı́ che possano essere definiti dei
requisiti definitivi.
L’output di questa fase è costituito da un documento contenente la lista dei requisiti
e da un piano di lavoro aggiornato.
2.5.3
Progettazione
Questa fase ha in input i requisiti definiti nella precedente. Per ogni requisito identificato, viene prodotto un insieme di uno o piú elementi. Gli elementi di progettazione
descrivono le funzionalitá desiderate nel software e generalmente includono diagrammi, tabelle con regole e anche pseudocodice. Questi elementi di progettazione hanno
il fine di descrivere il software abbastanza in dettaglio da consentire ad un programmatore esperto di poterlo sviluppare con poche altre informazioni in piú.
L’output della fase sono i documenti di progettazione e l’aggiornamento dei requisiti
e del piano di lavoro.
2.5.4
Sviluppo
La fase di sviluppo prende in input gli elementi prodotti dalla fase di progettazione.
Per ogni elemento, un insieme di uno o piú implementazioni software vengono prodotte.
Dunque, in questa fase viene e↵ettivamente scritto il codice di programmazione dei
vari sottosistemi. Inoltre gli sviluppatori e↵ettuano i controlli necessari sui singoli
elementi (unit testing) e sui moduli interi.
L’output di questa fase include un insieme completo di software che soddisfa i requisiti
e gli elementi di progettazione precedentemente documentati, un sistema di supporto
che descrive le operazioni del software (online help), un piano di test che descrive i
vari casi in cui validare la correttezza e la completezza del software. Inoltre vengono
aggiornati i requisiti e il piano di lavoro.
2.5.5
Integrazione e test
Durante questa fase, le implementazioni software, l’online help e i dati per il test vengono migrati dall’ambiente di sviluppo ad un altro ambiente analogo, necessario per la
fase di test. Quindi, tutti i casi di test vengono eseguiti per verificare la correttezza e
44
2 Client-server computing
la completezza del software. Successivamente l’esecuzione della suite di test conferma
la robustezza e la completezza delle potenzialitá di migrazione. Inoltre, i dati vengono
preparati per un uso in produzione, vengono identificati gli utenti e collegati ai ruoli
a loro appropriati.
L’output della fase di integrazione e di test include l’insieme dei software opportunamente integrato, un sistema di aiuto online, un mappa d’implementazione, un piano
di messa in produzione che descrive i dati e gli utenti.
2.5.6
Installazione
Nella fase d’installazione, le implementazioni software, l’online help e i dati iniziali
sono caricati nel server di produzione (deployment). A questo punto tutti i casi
di test per verificare la correttezza e la completezza del software sono stati eseguiti.
Successivamente i test vengono nuovamente eseguiti per validare il sistema e come
prerequisito per l’accettazione del software da parte del destinatario.
L’output di questa fase include un’applicazione in produzione e una test di suite
completa.
2.6
Client-server: sicurezza
Una minaccia per la sicurezza è definita come la circostanza, la condizione, o un evento
che abbia la possibilità di causare qualche tipo di difficoltà distruttiva a dati o risorse
di rete. La divulgazione di dati riservati (disclosure), la modifica non autorizzata o
sbagliata dei dati (data integrity), la negazione del servizio (Denial of Service) e la
frode sono alcune delle possibili minacce ad un qualsiasi sistema informativo. Nel caso
di un sistema distribuito la sicurezza è una questione delicata, specialmente nel caso
in cui ci si trovi in una rete aperta come Internet. Tuttavia, per ogni sistema di questo
tipo si presentano delle questioni da trattare con metodi diversi a seconda del contesto
e delle politiche di sicurezza e protezione che sono state definite nell’organizzazione,
azienda o sistema specifico. I temi principali nel caso di un sistema di tipo clientserver sono l’autorizzazione e l’autenticazione. Per queste operazioni esistono vari
meccanismi che permettono di gestirle, fra cui la protezione con password, con smart
card crittografate o attraverso la biometria.
I problemi di sicurezza nel client-server computing possono essere dovuti alle seguenti
falle:
• sicurezza credenziali: si presentano quando un individuo qualsiasi riesce ad otte-
nere l’accesso non autorizzato a un computer attraverso le credenziali di accesso
di qualche utente.
45
2.6 Client-server: sicurezza
• sicurezza del software: alcuni difetti (bug) nel software possono causare la presenza di errori nel sistema compromettendo i risultati.
• uso incoerente: possono accadere quando due usi diversi di un sistema contrastano su un unico punto di sicurezza;
• sicurezza fisica: si presentano quando un qualsiasi vi è un qualsiasi accesso fisico
alla macchina che ospita il server o una delle sue componenti (ad esempio: se
un malintenzionato riesce ad accedere alla sala in cui è contenuta la macchina
fisica e porta via l’hard disk o manomette il sistema).
Gli ultimi due tipi di falle possono essere eliminate grazie ad un’attenta progettazione
e implementazione del sistema, mentre per risolvere le falle dovute ai problemi di
sicurezza fisica possono essere utilizzati dei metodi di protezione migliori. Questi
metodi di protezione e sicurezza possono essere classificati nelle seguenti categorie:
• sicurezza basata sulla fiducia (trust based ),
• sicurezza attraverso segretezza,
• schema della password,
• sistema biometrico.
2.6.1
Le minacce di sicurezza emergenti
Possiamo identificare le minacce di sicurezza emergenti dei sistemi client-server come:
• minacce all’ambiente di elaborazione locale da mobile code
2
• minacce ai server che possono includere l’impersonificazione, le intercettazioni,
i denial of service o la modifica dei pacchetti di rete.
Il metodo di protezione consiste nella ricerca di dati dannosi e frammenti di programma
che sono trasferiti dal server al client filtrando i dati e programmi noti per essere
pericolosi.
2.6.2
Server: possibili minacce
Le possibili minacce di sicurezza al server possono essere dei seguenti tipi:
• L’intercettazione è l’attività di ascoltare in modo passivo i dati inviati attraverso
la rete. Questo sistema consente ad un malintenzionato di ottenere la trascrizione
2 è
un software trasferibile fra sistemi diversi, ad esempio, trasferibili attraverso la rete o tramite
una penna USB, ed eseguito su un sistema locale, senza l’esplicita esecuzione da parte del destinatario.
46
2 Client-server computing
completa delle attività di rete e in tal modo di ottenere informazioni sensibili,
come password, dati e procedure per svolgere delle funzioni. La crittografia può
impedire gli intercettatori dall’ottenere dati che viaggiano su reti non protette.
• Denial of service è la situazione in cui un utente rende il sistema inutilizzabile per
gli utenti legittimi monopolizzando o danneggiando una risorsa in modo che non
possa essere utilizzata. Le forme più comuni di questo attacco sono le seguenti:
– Sovraccarico di servizio (Service Overloading): un server può essere reso
inutilizzabile tramite l’invio di una grande quantità di richieste di servizio illegittime, atte a consumare le sue risorse (in particolare il ciclo di
CPU). In una tale situazione il server può negare (per limiti fisici o anche
implementativi) le richieste di servizi che invece sono legittime.
– Inondazione di Messaggi (Message flooding): si tratta di un processo che
punta a saturare il disco del server inviando ripetutamente e concorrentemente richieste o file di grandi dimensioni. Questo può causare il blocco
del disco.
– Attacco di risposta (Replay Attack ): è una forma di attacco di rete che
consiste nell’impossessarsi di una credenziale di autenticazione comunicata
da una macchina ad un altra e riproporla successivamente simulando l’identità dell’emittente. In genere l’azione viene compiuta da un attaccante
che s’interpone tra i due lati comunicanti (man in the middle). Questo tipo di minaccia può essere risolto utilizzando dei token di sessione generati
pseudocasualmente, oppure utilizzando una marca temporale e all’interno
nel corpo del messaggio crittografato.
Capitolo 3
LHC e CMS
“Physics is the universe’s operating
system.”
Steven R. Garman
3.1
LHC
Il Large Hadron Collider (LHC)[30], è il piú grande e potente acceleratore di particelle
mai costruito. L’acceleratore è collocato in un tunnel circolare di 27 km di circonferenza, inizialmente scavato per ospitare il Large Electron Positron Collider (LEP)[31],
situato a circa 100m sotto la campagna che circonda Ginevra a cavallo della frontiera
franco-svizzera. LHC accelera due fasci di protoni circolanti in senso opposto, ognuno
contenuto in un tubo a vuoto, ed è stato disegnato per far collidere i due fasci ad
un’energia nel centro di massa di 14 TeV (1 TeV = 1 miliardo di elettronvolt = 101 2
eV1 ). Le collisioni avvengono in quattro punti. In corrispondenza di queste zone di
collisione sono stati installati quattro grandi apparati sperimentali: ATLAS (A Toroidal LHC Apparatus), CMS (Compact Muon Solenoid), LHCb ed ALICE (A Large Ion
Collider Experiment). Questi si occupano di rivelare le collisioni prodotte da LHC e,
a valori nominali, produrranno una quantità di dati pari a quella che oggi producono
l’insieme delle reti di telecomunicazione europee! Due di questi, ATLAS e CMS, sono
rivelatori dedicati ad uno studio generale della fisica di LHC. I restanti due (ALICE
e LHCb) sono più piccoli e più specializzati.
I primi fasci di protoni sono stati fatti circolare, a bassa energia e senza farli collidere
tra loro, il 10 settembre 2008. Dopodiché LHC è tornato operativo solo il 19 novembre
1 Un
elettronvolt (simbolo eV) è l’energia acquistata da un elettrone libero quando passa attraverso
una di↵erenza di potenziale elettrico di 1 volt.
48
3 LHC e CMS
2009. Il 23 novembre 2009 i 4 esperimenti hanno registrato i primi eventi da collisioni
protone-protone di LHC.
Figura 3.1: Il progetto LHC.
Le ricerche e↵ettuate con LHC serviranno per lo studio della fisica ad alte energie,
per la conferma delle attuali teorie della fisica ed in particolare della verifica del Modello Standard. Il Modello Standard è una teoria della fisica che spiega esattamente
una vasta gamma di fenomeni subnucleari, lasciando tuttavia ancora senza risposta
molte domande fondamentali. Di conseguenza i fisici ritengono che quello di cui siamo
a conoscenza non sia tutto e questo è il motivo per cui si sta cercando la nuova fisica
che sta oltre il Modello Standard, che permetterà loro di arrivare ad una teoria più
completa.
3.2
CMS
CMS (Compact Muon Solenoid)[32] è uno dei due grandi esperimenti general-purpose
di fisica delle particelle installati all’acceleratore protone-protone LHC del laboratorio
CERN di Ginevra. Circa 3600 persone da 183 istituti scientifici di 38 stati formano la
collaborazione CMS che ha costruito il rivelatore. Il rivelatore CMS è capace di studiare tutti gli aspetti fisici delle collisioni protone-protone ad un’energia nel centro di
49
3.2 CMS
massa di 14 TeV. L’apparato sperimentale contiene sotto-rivelatori capaci di misurare
l’energia e l’impulso di fotoni, elettroni, muoni e altre particelle create nelle collisioni.
È suddiviso geometricamente in una parte cilindrica centrale (barrel ) chiuso alle due
estremità da due tappi (endcaps). Il rivelatore piú vicino al punto di collisione è il
tracciatore al silicio. Attorno ad esso vi è il calorimetro elettromagnetico, che è poi
seguito dal calorimetrico adronico. Il tracciatore ed i calorimetri sono collocati all’interno del magnete solenoidale superconduttore che genera un campo magnetico di 4
Tesla. All’esterno del magnete vi è il sistema di rivelazione dei muoni, che è collocato
nel giogo in ferro che chiude le linee di forza del campo magnetico. L’intero apparato
sperimentale di CMS ha un diametro di 15 m, è lungo 21m ed ha un peso totale di
oltre 12000 tonnellate.
Figura 3.2: Struttura del rivelatore CMS.
Ognuno dei 5 sotto-rivelatori ha dei canali di lettura propri (per un totale di 15 milioni di canali di lettura) attraverso i quali CMS puó raccogliere dati per vari TB/s, di
cui peró solo alcuni saranno selezionati per essere scritti su disco (100 MB/s). Il sistema di selezione on-line (trigger ) è basato su due livelli: uno hardware ed uno software.
Questi permetteranno di ridurre la frequenza dai 40 MHz (frequenza di collisione a
LHC) a 100 Hz (frequenza di scrittura dati), cioè 100 MB/s, che corrispondono alla
scrittura di circa 1 PB di dati (raw data) per ogni anno. La mole di dati scritta de-
50
3 LHC e CMS
ve poi essere resa accessibile ad ogni membro della collaborazione indipendentemente
dalla sua locazione geografica. Inoltre le risorse di calcolo sono messe a disposizione sia
dal centro di calcolo del CERN sia per la maggior parte dei membri della collaborazione, per questo diventa fondamentale mettere a punto un sistema computazionale che
permetta di sfruttare questa potenza di calcolo distribuita. Nell’ottica di soddisfare
le suddette problematiche, CMS ha deciso di fare uso della Grid. L’ammontare dei
dati crescerá nel tempo e il paradigma Grid sembra essere l’unico sistema per rendere
trattabile questa mole di dati (che dovrebbe corrispondere al 10% della massa di dati
prodotti annualmente sulla Terra).
3.2.1
L’ambiente computazionale di CMS
L’utilizzo degli strumenti Grid messi a disposizione dai progetti LCG ed OSG consente
di risolvere il problema piú complicato ed importante, ossia rendere accessibili dati e
risorse distribuiti.
Il modello computazionale distribuito di CMS[33] è stato progettato proprio per servire, elaborare e archiviare il gran numero di eventi che verranno registrati durante
la presa dei dati. Le risorse computazionali sono geograficamente distribuite, interconesse tramite reti ad alta capacità e accedute attraverso la Grid. La scelta di un
sistema distribuito permette la delega delle responsabilità della gestione alle comunità
locali di CMS, accedendo ad ulteriori canali di finanziamento e assicurando un maggiore equilibrio del carico delle risorse disponibile, replicando i dati d’interesse su siti
di↵erenti.
Architettura gerarchica Il modello di calcolo di CMS ha definito una struttura
gerarchica dei vari centri della collaborazione che sono detti Tier. Come mostrato in
figura 3.3 sono presenti quattro livelli:
Tier-0 : del Tier-0 fa parte un solo centro computazionale, localizzato al CERN che
riceve dati dal CMS Data Acquisition System, li archivia e fornisce una prima ricostruzione degli stessi. I dati ricostruiti, assieme ai dati grezzi (raw data), sono distribuiti
sui Tier-1 attraverso una rete privata in fibra ottica che è lo scheletro della rete appositamente costruita per LHC, in modo da interconnettere il CERN e i Tier-1. In
aggiunta al Tier-0, il CERN ospita la CMS Analysis Facilities (CAF)[33] disegnata
per supportare attività che necessitano di un periodo di latenza più breve possibile.
Tier-1 : è il livello sottostante al Tier-0; i centri che ne fanno parte sono distribuiti
in vari paesi; questi siti o↵rono servizi in grado di archiviare, ricostruire e calibrare
dati. Piú in generale questo livello fornisce dei servizi su larga scala, fondamentali per
la gestione dei dati ed e↵ettuati con un lavoro centralizzato. Questo livello assicura
la custodia di una parte dei row data prodotti dal rilevatore CMS e dei dati simulati
51
3.2 CMS
prodotti ai centri Tier-2 connessi.
Tier-2 : sono centri piú piccoli ma piú numerosi di quelli al livello precedente (attualmente più di 50); questi siti forniscono principalmente notevoli risorse computazionali
(CPU) e capacitá di analisi; i Tier-2 sono associati gerarchicamente ad uno specifico
Tier-1 e fanno riferimento a questi ultimi per accedere a degli insiemi di dati (dataset)
molto grandi.
Tier-3 : il livello piú vicino all’utente è il livello Tier-3 (risorsa dipartimentale); i siti
appartenenti a questo livello forniscono le risorse locali per i gruppi e non hanno obblighi formali verso la collaborazione, ma solo responsabilità verso gli utenti.
Tier-0, Tier-1 e Tier-2 sono risorse globali dell’esperimento, mentre i Tier-3 sono risorse a disposizione essenzialmente degli utenti locali.
Figura 3.3: Il modello computazionale di CMS: l’architettura su livelli.
3.2.2
Framework dell’analisi distribuita in CMS
Il modello d’analisi di CMS prevede che le attività siano guidate dalla locazione dei
dati (data driven). Questi ultimi vengono distribuiti attraverso i vari centri computazionali (Tier-2). Al momento della richiesta di processamento di una specifica porzione
di dati, saranno i siti che ospitano i dati richiesti ad o↵rire la potenza di calcolo neces-
52
3 LHC e CMS
saria all’analisi e quindi non saranno i dati ad essere spostati a tempo di esecuzione.
Ovviamente, per permettere tali operazioni in un ambiente distribuito ed eterogeneo,
sono necessarie delle applicazioni adeguate atte ad interfacciarsi con il complesso sistema di calcolo ed a nascondere agli utenti gli aspetti tecnici, garantendo cosı́ un
accesso trasparente alle risorse. Per tali motivazioni è stato sviluppato un’insieme di
strumenti, andando cosı̀ a costituire dei servizi specifici di CMS sopra i servizi Grid già
esistenti. Questi strumenti costituiscono il Data e Workload Management (DMWM)
della collaborazione.
Data Management
Il CMS Data Management ha il ruolo di mettere a disposizione l’infrastruttura e gli
strumenti necessari per gestire la gran quantità di dati prodotti, processati e analizzati in un ambiente computazionale distribuito. Per poter semplificare la gestione dei
dati, i singoli file vengono raggruppati in blocchi (file-block ) aventi una dimensione
conveniente per il loro trasferimento. I file-block sono le unità del dato che vengono
utilizzati per il posizionamento e la replica e sono a loro volta raccolti in dataset, la
cui dimensione e definizione dipendono dal significato fisico dei dati.
Dunque il Data Management mette a disposizione gli strumenti (basi di dati e relative interfacce) che tengono traccia dei dati distribuiti e delle loro locazioni. Oltre
a quest’ultima, vengono tracciate anche le informazioni logiche che sono poi risolte
attraverso dei cataloghi locali ai centri di elaborazione. Le dimensioni dei file sono
adeguatamente grandi (almeno 1GB), in modo da evitare problemi di scalabilitá con i
sistemi di memorizzazione (Storage Element o nastro magnetico che siano) nonché per
ottimizzare il trasferimento dei dati. Questo è reso possibile dalla possibilità di unire
piccoli file di output, prodotti da singoli job, in pochi file grandi (grazie all’operazione
di merge). Il CMS Data Management System è costituito da un insieme di componenti
interoperanti descritte nelle seguenti sezioni.
DBS.
Il Dataset Bookkeeping System (DBS)[34] è il mezzo per descrivere, sco-
prire e usare i dati-eventi di CMS. Questo cataloga le definizioni specifiche dei dati
di CMS quali il numero di run, gli algoritmi e le configurazioni usate per elaborare i
dati assieme alle informazioni relative alla parentela del processamento dei dati. DBS
memorizza le informazioni inerenti ai dati in un formato che ne rende possibile la
consultazione tramite interrogazioni: queste permettono di scoprire quali dati siano
disponibili e come questi siano organizzati logicamente, in termini di file, file-block e
dataset.
DBS viene usato per l’operazione di scoperta dei dati (data discovery) e la configurazione dei job da parte dei sistemi di produzione ed analisi attraverso un’apposita
53
3.2 CMS
interfaccia costituita dalle DBS API. Gli utenti possono scoprire quali dati sono disponibili attraverso il Web o interfaccia a linea di comando (CLI ). DBS o↵re varie
opportunità di utilizzo:
• un DBS globale come singola istanza che cataloga tutti i dati di CMS;
• molti DBS locali utilizzati per descrivere i dati prodotti dalle produzioni Mon-
teCarlo di gruppi di fisica e singoli individui; se necessario i dati catalogati nei
DBS locali possono essere migrati nel DBS globale, secondo opportune procedure
dipendenti dalle caratterstiche dei dati.
DBS è un’applicazione Web costituita da più livelli e con una struttura modulare.
Questo rende possibile e facile adattare il sistema a svariati tipi di database, consentendo una distribuzione (o meglio deployment) che va dalle generiche esigenze di
CMS fino alle installazione individuali. Attualmente i tipi di database supportati sono
ORACLE, MySQL e SQLite.
Il DBS globale è installato al CERN, ed ospita anche alcuni cataloghi di tipo locale,
appartenenti a specifici gruppi di fisica interni a CMS. Ovviamente esistono istanze
locali installate presso altri siti e per usi prettamente privati.
Local Data Catalog.
Come detto in precedenza, un’applicazione di CMS conosce
informazioni realtive solamente ai file logici e per aver accesso ai file fisici si basa su
un servizio locale al sito che funge da catalogo dei file. Ogni sito della collaborazione
mantiene un Trivial File Catalog costituito da un semplice insieme di regole necessarie
a costruire il percorso specifico dei file nel sito, a partire dal nome logico dei file e dal
protocollo d’accesso.
PhEDEx.
Il posizionamento e il sistema di trasferimento dei dati in CMS è im-
plementato da PhEDEx[35]. Questo sistema fornisce un’interfaccia web per definire,
eseguire e controllare le decisioni amministrative sul movimento dei dati: dove i dati
sperimentali devono trovarsi, quali copie devono essere custodite dal sito e quali dati
devono essere replicati su altri siti a seconda delle politiche definite all’interno della
collaborazione, anche per facilitare l’accesso a dati. Inoltre i dati vengono distribuiti
su svariati siti a seconda delle risorse disponibili, degli interessi dei vari gruppi di fisica
e in ultimo anche dalle scelte dei membri delle comunità locali di CMS a cui un sito
fornisce servizi.
Ogni sito ha la libertà di scelta dei sistemi di memorizzazione (Storage Element) da
utilizzare. Per PhEDEx ogni area di memorizzazione distinta è rappresentata da un
nodo. I collegamenti logici fra i nodi definisco la topologia di trasferimento. Il flusso di
lavoro dei trasferimenti inizia quando un utente e↵ettua una richiesta di trasferimento
54
3 LHC e CMS
di dati verso un qualche nodo attraverso un servizio Web dedicato; di conseguenza
la richiesta deve essere approvata dal Data Manager del nodo in questione. Nella
richiesta l’utente specifica quali dati vuole trasferire e dove li vuole trasferire: il nodo
sorgente viene selezionato in modo ottimale e automatico (attraverso una specifica implementazione dell’algoritmo di Dijkstra[36]) fra tutti i nodi che ospitano una replica
dei dati in questione. Questo consente a PhEDEx di bilanciare il trasferimento dei
dati fra sorgenti multiple quando gli stessi dati sono presenti in più nodi. Il sistema
in questione è in grado di tollerare trasferimenti non stabili: quando un trasferimento
fallisce in uno specifico collegamento è possibile utilizzare un’altra replica disponibile.
Da un punto di vista tecnico PhEDEx è basato su agenti software distinti a seconda
delle operazioni che svolgono. Ognuno di essi memorizza il proprio stato e comunica
attraverso un database centrale installato al CERN, basato su ORACLE, utilizzato
dunque come una black board. Alcuni agenti sono centrali al CERN, mentre ogni
sito ha degli agenti che interagiscono con lo Storage Element locale. Gli agenti dedicati al trasferimento dei dati utilizzano varie metodologie di trasferimento (anche a
seconda dei protocolli di trasferimento disponibili nel sito a cui fa riferimento il nodo), rendendo PhEDEx indipendente dalle tecnologie supportate. Un sito Web mette
a disposizione gli strumenti di gestione necessari ad eseguire le operazioni richieste,
quali la possibilità di creare richieste (ad esempio: di trasferimento o cancellazione dei
dati) ed approvarle o meno, permettendo inoltre agli utenti e agli amministratori di
controllare lo stato attuale e storico dei trasferimenti. Oltre a tutto questo PhEDEx
tiene traccia del posizionamento dei dati all’interno del sistema computazionale distribuito, fornendo un supporto indispensabile agli strumenti di analisi che necessitano di
conoscere dove sono localizzati i dati al momento della sottomissione dei job.
CMS ha trasferito oltre 87 PB di dati da quando il progetto PhEDEx è iniziato nel
2004 (figura 3.4).
Workload Management
Il ruolo del sistema di CMS Workload Management[37] è la gestione del flusso di
lavoro necessario al processamento dei dati inteso come: creazione e sottomissione,
monitoraggio dei job e recupero dei risultati. Il Production Agent (ProdAgent)[38]
è ottimizzato per eseguire queste operazioni in un ambiente controllato, come il Tier-0
e i centri computazionali appartenenti al livello Tier-1. Il CMS Remote Analysis
Builder (CRAB) è ottimizzato per sostenere l’analisi dei dati eseguita dagli utenti.
Software di CMS.
Il software per la simulazione, la ricostruzione e l’analisi dei dati
provenienti dal rivelatore è scritto usando la programmazione orientata agli oggetti.
Le applicazioni sviluppate possono essere divise in due categorie a seconda degli scopi.
55
3.2 CMS
Figura 3.4: Velocità dei trasferimenti di PhEDEx dal 2004 al 2008.
La prima categoria consiste del software che si occupa della simulazione delle particelle elementari e della risposta del rivelatore (ossia dell’output atteso). La seconda
categoria si occupa di collezionare e ricostruire i dati, per poi fornire gli strumenti
per l’analisi degli stessi. L’insieme degli strumenti sviluppati in questo ambiente per
la simulazione del rilevatore e la ricostruzione dei dati è chiamato CMSSW (CMS
SoftWare framework). Il software è strutturato nei seguenti elementi principali:
• un framework configurabile per ogni ambiente computazionale, in grado di consentire l’analisi e la ricostruzione degli eventi;
• moduli software per calcoli fisici che possono integrarsi con il framework al mo-
mento dell’esecuzione, operando attraverso i costrutti che sono già disponibili
per l’accesso ai dati;
• strumenti di servizio ed utilità che consistono di due categorie principali di ser-
vizi: fisici (es: routine di calcolo e stampa di istogrammi) e computazionali
(accesso ai dati, comunicazione fra i moduli, etc).
Tipicamente l’utente utilizza questo software sia in maniera interattiva che in modalità batch. Dato il modello computazionale di CMS l’utente, per procedere nell’analisi
dei dati, dovrà interagire con la Grid.
56
3 LHC e CMS
CRAB. L’analisi dei dati in un ambiente distribuito è molto complessa dal punto
di vista computazionale; infatti, nonostante la presenza degli strumenti messi a disposizione dal framework CMSSW, è necessario e↵ettuare molti passi per preparare e
gestire i propri job. I principali sono:
• configurazione dell’ambiente remoto riproducendo le stesse identiche condizioni
dell’ambiente locale
• sottomissione dei job su Grid
• controllo dell’esecuzione dei job
• ritiro dell’output contenente i risultati.
Tutto questo rappresenta un lavoro complesso per un fisico, che tipicamente è interessato principalmente al solo risultato dei suoi job. Per l’utente è quindi necessaria
un interfaccia che esegua degli automatismi che permettano di semplificare il flusso
di lavoro per l’analisi dei dati di CMS. Il CMS Remote Analysis Builder (CRAB)[39]
è stato sviluppato come un’interfaccia orientata all’utente in grado di permettere all’utente finale l’analisi dei dati in un ambiente locale o distribuito, nascondendo le
complessità dellle interazioni con la Grid e i servizi di CMS. Questo software permette
all’utente di lavorare su grandi insiemi di dati distribuiti usando lo stesso algoritmo
di analisi che egli ha sviluppato in locale lavorando su piccoli sottoinsiemi di dati. Le
funzionalità messe a disposizione da CRAB mostrate in figura 3.5 sono:
• Data-discovery e locazione: facilita l’interrogazione con i cataloghi dei dati di
CMS (DBS e PhEDEx) per trovare quali dati sono disponibili e dove possono
essere acceduti.
• Creazione job: raccoglie e comprime localmente il codice dell’utente, con le
relative librerie, e tutto l’ambiente di lavoro che deve essere inviato ai siti remoti
dove i dati sono localizzati.
• Job splitting: decide come configurare ogni singolo job, per quanto riguarda
l’accesso ad un sottoinsieme di file del dataset in modo da distribuire l’uso delle
risorse del Tier-2.
• Sottomissione job: sottomissione ai siti Grid dove sono localizzati i dati richiesti
dall’utente.
• Monitoraggio job: controlla lo stato dei job interagendo con i servizi Grid.
• Ritiro output: i risultati prodotti dai job o vengono copiati nello Storage Element
di un Tier-2 associato all’utente in questione o nel caso di file di dimensioni
57
3.2 CMS
ragionevolmente piccole (pochi MB) possono tornare direttamente all’utente.
è poi possibile pubblicare i dati prodotti, con la loro descrizione e provenienza
all’interno di un DBS locale, in modo che i dati prodotti possano essere utilizzati
per ulteriori analisi o semplicemente condivisi con altri utenti all’interno della
collaborazione.
Figura 3.5: CRAB workflow. WMS può essere inteso sia come gLite WMS che come
glidein WMS.
Strumenti di monitoraggio.
In uno scenario altamente distribuito gli strumenti di
monitoraggio sono dei servizi critici per il successo dell’analisi, come per CMS. Questi
permettono di controllare l’evoluzione degli altri strumenti sviluppati da CMS (CRAB,
ProdAgent, ...), dando una visione completa della struttura operativa. Gli obiettivi
principali che hanno guidato lo sviluppo degli strumenti di monitoraggio sono:
• nessuna fiducia sugli strumenti di monitoraggio locali ai siti;
• avere un visione unica dell’utilizzo degli strumenti di CMS, che sia di alto livello
e da cui sia possibile selezionare e visualizzare i dettagli delle operazioni fino al
livello di un singolo processo;
• mantenere il sistema snello e flessibile: anche a costo di avere qualche informazione non segnalata in modo del tutto adeguato;
• registrare sufficienti informazioni sugli errori in modo che i piani e le azioni
successive possano essere basate sui dati quantitativi e che sia possibile misurare
l’efficacia delle soluzioni;
58
3 LHC e CMS
• individuare le informazioni necessarie alle scelte dei responsabili, cosı̀ che sia
possibile capire come indirizzare le attività degli utenti e su come pianificare i
lavori futuri;
• cercare di non definire a priori tutti i parametri rilevanti.
Il lavoro di monitoraggio è costruito attorno all’idea di un’applicazione che aggrega
informazioni: i vari processi e strumenti inviano messaggi ad un collettore centrale.
Ovviamente ciò implica che in questo modo possono essere raccolte solo le informazioni inviate secondo precise specifiche. In CMS gli strumenti di monitoraggio sono
costituita dalla Dashboard. Quest’applicazione si basa su una base di dati gestita
tramite un server Oracle, una serie di strumenti che collezionano le informazioni provenienti da varie fonti di alimentazione, e da un paio di interfacce Web che attraverso
diverse viste danno l’accesso a livelli di dettaglio di↵erenti, aggregando questi in modo
flessibile e personalizzato.
Le viste principali che sono messe a disposizione sono quella contenente le informazioni
da un punto di vista storico, quella che contiene le informazioni a tempo di esecuzione
relative ai processi di analisi degli utenti e un’interfaccia interattiva che permette di
navigare da una vista ad un’altra fornendo sia estrema flessibilità che dettaglio nello
informazioni.
Capitolo 4
CRAB: evoluzione verso
un’architettura client-server
“Version 1 of any software is full of
bugs. Version 2 fixes all the bugs
and is great. Version 3 adds all the
things users ask for, but hides all the
great stu↵ in Version 2.”
Fred Blechman
La necessitá di ottimizzare l’utilizzo delle risorse di calcolo distribuito in ambiente
Grid ha portato la collaborazione CMS allo sviluppo di applicazioni basate sull’architettura client-server. In questo capitolo vengono illustrate le motivazioni, le problematiche e i dettagli implementativi della strategia adottata nel caso dell’analisi
distribuita.
4.1
Motivazioni dell’evoluzione
CRAB nasce nel 2004 con l’obiettivo di soddisfare le esigenze del modello di analisi di
CMS. In particolare CRAB si propone di consentire agli utenti un accesso efficiente
ai dati distribuiti nascondendo le complessità della Grid. Come è stato precedentemente illustrato (vedi sezione 3.2.2), la prima implementazione di CRAB è basata su
di un’architettura autoconsistente in un’unica entitá, totalmente in mano all’utente
(standalone model ) e capace di soddisfare le esigenze basilari del caso d’uso in questione.
In figura 4.1 è mostrato lo schema con le interazioni e il flusso di lavoro di CRAB.
Dunque i principali livelli d’interazione sono:
60
4 CRAB: evoluzione verso un’architettura client-server
• il middleware della Grid;
• i servizi di Data Management di CMS (ad esempio quelli necessari per la ricerca
dei dati);
• l’ambiente di sviluppo locale (come il software di CMS);
• l’area di lavoro dell’utente sulla User Interface.
Le fasi principali del flusso di lavoro sono:
• preparare l’ambiente di lavoro, che consiste nelle seguenti fasi:
– l’area di lavoro del software CMSSW, opportunamente installata e configurata;
– l’eseguibile e le relative librerie che si vogliono sottomettere alla Grid;
– le variabili d’ambiente necessarie all’interazione con CRAB e la Grid;
• utilizzare CRAB per eseguire i job sulla Grid in modo facile e trasparente:
– creare e sottomettere alla Grid il proprio lavoro;
– controllarne l’avanzamento;
– ritirare l’output del proprio lavoro una volta che questo è terminato;
– e↵ettuare altre operazioni a seconda dell’esito e dei risultati ottenuti.
CRAB standalone è stato usato con successo dagli utenti di CMS a partire dal 2004
fino ad oggi per eseguire l’analisi dei dati simulati (Monte Carlo). Il primo utilizzo
intenso di questo strumento c’è stato a partire dalla primavera del 2006 per la preparazione del Physics Technical Design Report (Physics TDR)[40]. Successivamente
CRAB è stato utilizzato durante le fasi dei test di scala di CMS (data challenges).
L’ultima è stata CSA07[41] durante la quale sono stati sottomessi jobs con CRAB ad
una frequenza di 20000 jobs al giorno distribuiti su circa 40 siti diversi. I primi test
con dati non simulati sono stati e↵ettuati durante il Cosmic Challenge del 2006[42].
Se da un lato le prestazioni e la semplicitá dell’interfaccia di CRAB standalone erano
soddisfacenti per le esigenze della collaborazione in quella fase, dall’altro è stato possibile mettere in evidenza i limiti di scala e soprattutto è stato possibile individuare i
margini di miglioramento, soprattutto dal punto di vista dell’automazione.
Per quanto riguarda i limiti osservati, i principali sono:
• utilizzo del sistema computazionale: l’integrazione con la Grid non è completamente adeguata per le funzionalità e potenzialità che questa mette a disposizione
non permettendo al sistema di scalare. Le maggiori conseguenze sono la lentezza
nell’interazione diretta con la Grid specialmente quando si gestiscono un gran
numero di job;
61
4.1 Motivazioni dell’evoluzione
CRAB
UI
DBS
C
R
A
B
DatasetPath
LFNs, #events, fileblocks
Dataset Discovery
Fileblocks
jdl, job,
SEs
PhEDEx
DLS
RB/WMS
(DLI interface)
Output
Dataset Location
jdl, job
trivial file catalog
CE
LFN !> PFN
File Location
WN ........
Data
SE
Output (also to remote SE)
Figura 4.1: CRAB: flusso di lavoro e interazioni.
• implementazione del modello computazionale: per definizione è possibile suppor-
tare un unico semplice flusso di lavoro. L’assenza di persistenza non consente il
supporto di flussi complessi e concatenati;
• gestione dello strumento software stesso: la distribuzione agli utenti di nuove versioni o di aggiornamenti che spesso includono dei cambiamenti cruciali è
complessa, macchinosa e lenta, in quanto non centralizzata;
• interazione con gli utenti e implementazione delle politiche della collaborazione:
il supporto degli utenti è difficile in quanto tutte le informazioni risiedono su
macchine remote dei servizi o dei vari siti della Grid; inoltre la gestione dei vincoli
della collaborazione è complessa perché non esiste una gestione centralizzata.
Queste costituiscono le principali motivazioni dell’evoluzione da uno strumento ad
un’architettura basata sul modello client-server.
L’introduzione di un server di analisi nell’architettura costituisce l’inserimento di un
livello aggiuntivo fra l’utente e il middleware della Grid, cosı̀ come mostrato in figura
4.2.
62
4 CRAB: evoluzione verso un’architettura client-server
Oltre a far fronte alle limitazioni sopra elencate i vantaggi che si vogliono ottenere
UTENTI
CRAB SERVER
CRAB
SERVER
MYSQL SERVER
STORAGE SERVER
GRID MIDDLEWARE
SITO GRID
SITO GRID
SITO GRID
RISORSE
Figura 4.2: L’aggiunta di un nuovo livello fra la Grid e l’utente.
con l’introduzione del modello client-server sono:
• rendere il più possibile automatico il flusso di lavoro dell’analisi in CMS;
• ridurre il lavoro umano non necessario spostando tutte le azioni automatizzabili
sul server, rendendo il client un’interfaccia semplice e leggera (thin client, vedi
2.1) che funziona come punto d’accesso a tutto il sistema;
• automatizzare il più possibile l’interazione con la Grid, e cioè la sottomissione, la
“risottomissione” intelligente, la gestione dei possibili errori, il ritiro dei risultati
e tutte le operazioni post-mortem dei job;
• raccogliere in un unico sistema centrale l’insieme delle informazioni dei job degli
utenti per poter rivelare eventuali errori e poterli risolvere. Tale aspetto risulta
cruciale nell’ottica di poter controllare i siti e la Grid in tempo reale, soprattutto
in previsione del massiccio incremento legato alla partenza di LHC;
• gestire centralmente gli aggiornamenti dell’applicazione ed eventuali problemi,
cioè avere la possiblità di un’ amministrazione centralizzata.
4.2 Client-server: fattorizzazione del flusso di lavoro
63
Il server dell’analisi distribuita si propone di migliorare la scalabilità dell’intero sistema di calcolo mettendo a disposizione dell’esperimento CMS le funzionalità specifiche
che non possono essere incluse nel middleware della Grid, per definizione generico e
multiuso. Questo nuovo strumento consente di introdurre un insieme di funzionalità
e automazioni mantenendo l’accesso trasparente alle risorse sottostanti, senza nessun impatto reale sugli utenti finali. L’interfaccia proposta, la sua installazione e la
procedura di configurazione rimangono le stesse dello standalone.
4.2
Client-server: fattorizzazione del flusso di lavoro
L’introduzione del paradigma client-server comporta di conseguenza una fattorizzazione delle funzionalitá fra le due entitá in gioco con la conseguente aggiunta di un
nuovo livello nel flusso d’interazione come mostrato in figura 4.3. Il client semplifica
lo strumento standalone senza modificarne l’architettura[43]. É scritto in Python ed
utilizza una base di dati SQLite per memorizzare in modo persistente le informazioni
della singola analisi. Il client viene eseguito dall’utente attraverso la linea di comando
occupandosi di:
• creare i job
• interazione con i servizi di Data Management per la ricerca dei dati e della loro
locazione;
• interazione con l’area di lavoro dell’utente, preparando l’input sandbox che
contiene l’eseguibile dell’utente più le librerie necessarie;
• preparazione dei job: suddivisione del task di analisi in piú job (job splitting),
creazione degli script necessari alla gestione dell’esecuzione del job;
• inviare la richiesta di sottomissione al server passandogli la richiesta XML, la
serializzazione su file XML dei job e l’input sandbox associata;
• una volta che la richiesta è stata presa in carico dal server è possibile:
– controllare lo stato di avanzamento dei job tramite il server;
– ritirari i risultati una volta che questi sono stati processati dal server;
– ri-sottomettere al server i job che sono falliti;
– eseguire altre operazioni sui job, quali: cancellarli o richiedere informazioni
post-mortem.
64
4 CRAB: evoluzione verso un’architettura client-server
UserBox CRAB Client
Proxy
datasetpath
CRAB server
LF
N
DBS
,#
ev
en
Jdl, Job
BOSS DB
ts
,
fil
e
bl
oc
ks
gsiftp server
direct submission available
jdl,
Dataset Discovery
SEs
fileblocks
PhEDEx
DLS (DLI enabled, LFC based)
fileblocks
RB
Job
SEs
Dataset Location
jdl
trivial file catalog
CE
Output
File Location
WN ........
Data
SE
Output
Figura 4.3: CRAB: flusso di lavoro e interazioni con l’introduzione del server.
Il server si occupa del resto del flusso di lavoro, e cioé di tutte quelle operazioni che
non richiedono strettamente l’intervento umano. Dunque esegue in modo automatico
le seguenti operazioni:
• ricevere le richieste dal client in formato XML, verificare i dati in input per poi
deserializzare la descrizione dei job memorizzandola in modo persistente sulla
base di dati;
• soddisfare le richieste di sottomissione del client, inviando i job verso la Grid a
nome dell’utente richiedente;
• controllare lo stato dei job e memorizzarlo nella base di dati locale;
• ritirare i risultati quando i job sono terminati e aggiornare la base di dati con i
relativi codici di uscita;
• ri-sottomettere i job che sono falliti secondo particolari condizioni predefinite;
4.3 Strategia implementativa
65
• eseguire altre operazioni su richiesta del client: fornire informazioni sull’avanzamento dei job, cancellare i job, etc.
4.3
Strategia implementativa
I vantaggi o↵erti da un’architettura client-server non sono certamente senza conseguenze; ad esempio l’introduzione di un nuovo servizio puó rappresentare un singolo
punto di fallimento e l’impossibilità di bilanciare il carico di lavoro. Per far fronte a
tali problematiche è stato deciso di mettere in produzione più istanze del server di
analisi distribuiti fra i vari siti della collaborazione, in modo che in caso di mancata
disponibilitá di un server sia sempre possibile per l’utente accedere trasparentemente
ad un altro.
Un altro aspetto è quello relativo alla progettazione e implementazione, che ovviamente nel caso di un’architettura complessa richiedono uno sforzo maggiore rispetto
ad una semplice applicazione non distribuita.
Per riuscire ad ottimizzare la forza lavoro disponibile e avere un ambiente di lavoro
comune la collaborazione CMS ha deciso di mettere a disposizione dei vari strumenti
del Workload Management una struttura comune detta WMCore[44]. Quest’ultima
è un framework software costituito da una serie di librerie di codice utilizzabili attraverso un insieme ben definito di API1 , spesso corredate da strumenti di supporto allo
sviluppo delle estensioni o altri strumenti ideati per aumentare la velocità di sviluppo
del prodotto finito.[45]
A seconda delle esigenze dettate dagli obiettivi di sviluppo, ogni singolo progetto del
Workolad Management estende il framework per poter aggiungere le funzionalità specifiche sfruttando il concetto di modularitá, che consente una facile separazione delle
attivitá rispetto ad una vasta gamma di funzionalitá.
La possibilità di avere un framework comune fra i vari progetti consente la sinergia
degli sviluppatori aumentando la produttività e riducendo i costi. Inoltre la struttura
per componenti modulari o↵re il vantaggio della sostituibilità e della riusabilitá del
codice, caratteristiche importanti di un software ad alta qualitá. La sostituibilitá del
codice è una proprietá importante che permette ad una componente di essere sostituita
da un’altra (sia durante la fase di progettazione che a tempo di esecuzione), se i requisiti delle componenti sono gli stessi. Di conseguenza, le componenti possono essere
1 Le
Application Programming Interface sono ogni insieme di procedure disponibili al programma-
tore, di solito raggruppate a formare un set di strumenti specifici per un determinato compito.È un
metodo per ottenere un’astrazione, di solito tra l’hardware e il programmatore, o tra software a basso
ed alto livello. Le API permettono di evitare ai programmatori di scrivere tutte le funzioni dal nulla.
Le API stesse sono un’astrazione: il software che fornisce una certa API è detto implementazione
dell’API.
66
4 CRAB: evoluzione verso un’architettura client-server
sostituite anche con una loro versione aggiornata o ad esempio con una componente
alternativa, senza interrompere il sistema nel quale la componente lavora, garantendo
una gestione centralizzata che semplifica le operazioni sopra descritte.
4.4
Architettura del server
Il server ha un’architettura modulare costituita da componenti indipendenti implementate come demoni, dette agenti. Le componenti sfruttano le funzionalità del framework
software messo a disposizione dal Workload Management di CMS. Oltre a queste sono
state sviluppate delle componenti esterne tra cui le principali sono:
• Storage Element API: librerie che forniscono un’interfaccia generica a diversi tipi
di Storage Element attraverso di↵erenti protocolli;
• BossLite: framework per l’interazione con la Grid che fornisce un’interfaccia generica a diversi tipi di middleware consentendo di mantenere in modo persistente
le informazioni sui job sottomessi;
• Message Service: servizio necessario a far comunicare in modo asincrono e persi-
stente le varie componenti secondo il modello publish/subscribe. Questo prevede
una comunicazione asincrona fra vari processi detti agenti in cui sia i mittenti che
destinatari di messaggi dialogano attraverso un tramite, detto dispatcher basato
su una base di dati. Il mittente di un messaggio (publisher ) non è consapevole
dell’identitá dei destinatari (detti subscriber ), ma esso si limita a pubblicare (publish) il proprio messaggio al dispatcher. I destinatari si rivolgono a loro volta al
dispatcher sottoscrivendosi (subscribe) alla ricezione di messaggi. Il dispatcher
quindi inoltra ogni messaggio inviato da un publisher a tutti i subscriber interessati a quel messaggio. Questo implica che ai publisher non sia noto quanti e
quali sono i subscriber e viceversa. In figura 4.4 è mostrato lo schema SQL su
cui il dispatcher gestisce il sistema di messaggistica.
• Credential API: librerie necessarie a gestire le credenziali delegate dagli utenti.
Quasi tutto il software all’interno del server è sviluppato utilizzando il linguaggio di
programmazione Python. Rispetto ad altri linguaggi orientati agli oggetti esso permette di ridurre le linee di codifica, grazie alla sua duttilità e all’esteso insieme di
librerie disponibili che facilitano la programmazione ad alto livello. Il fatto che non
necessita di essere compilato permette una manutenzione facile e veloce.
L’esigenza di memorizzare le informazioni in modo persistente implica l’utilizzo di una
base di dati relazionale (RDMS: Relational database management system). Attualmente quello in uso è MySql 5.0 [46], i cui vantaggi sono che:
67
4.4 Architettura del server
MS_MESSAGE
MSG_ID
TYPE
MS_TYPE
TYPE_ID
SOURCE
DEST
MSG
TIME
MS_SUBSCRIPTION
SUB_ID
NAME
DELAY
MS_PROCESS
PROC_ID
TYPE_ID PROC_ID
NAME
HOST
PID
MS_HISTORY
MSG_ID
TYPE
SOURCE
DEST
MSG
TIME
DELAY
Figura 4.4: Schema SQL del supporto per la gestione del Message Service.
• supporta la maggior parte delle sintassi SQL e rispetta quasi del tutto lo standard
ANSI,
• possiede delle interfacce per diversi linguaggi, fra cui Python,
• viene distribuito con lincenza GNU GPL2 ,
• ha un stabilità elevata data dall’esperienza accumulata e dall’ampio utilizzo in
tutti i settori.
La struttura modulare del server è tale da consentire il supporto a di↵erenti tipi di
basi di dati relazionali con la semplice implementazione di poche classi specifiche per
la definizione dei dettagli dei comandi di interazione con il nuovo sistema (il framework
comune mette già a disposizione le librerie necessarie per l’utilizzo di Oracle).
I parametri sopra specificati, le opzioni specifiche di ogni singola componente e tutte
le informazioni di cui il server necessita sono specificate in un file in formato XML
generato automaticamente durante la fase d’installazione. I parametri possono essere
specificati e modificati dall’amministratore del server a seconda della configurazione
specifica:
2 La
GNU General Public License è una licenza per software libero. È comunemente indicata con
l’acronimo GNU GPL o semplicemente GPL.
68
4 CRAB: evoluzione verso un’architettura client-server
• nome, porta, percorso e tipo di protocollo dell’host di Storage;
• variabili di accesso al server MySql fra cui le credenziali per l’accesso, il tipo di
accesso (locale via socket
3
o remoto) e altri parametri specifici;
• file di configurazione dei servizi del middleware, locazione delle credenziali dele-
gate dagli utenti al server e URL da cui ritirare eventuali file di configurazione
controllati centralmente.
Qua sotto è riportato come esempio il contenuto del file di configurazione di uno dei
server di CRAB attualmente in produzione:
<?xml version="1.0" ?>
<CrabServerConfig>
<CrabServerConfiguration>
<Component Name="TaskTracking"/>
<Component Name="JobTracking"/>
<Component Name="GetOutput"/>
<Component Name="ErrorHandler"/>
<Component Name="JobKiller"/>
<Component Name="HTTPFrontend"/>
<Component Name="CrabServerWorker"/>
<Component Name="AdminControl"/>
<Component Name="Notification"/>
<Component Name="TaskRegister"/>
<Component Name="TaskLifeManager"/>
<Component Name="CommandManager"/>
<ConfigBlock Name="HTTPFrontend">
<Parameter Name="InstallerModule" Value="Plugins.HTTPFrontend.CrabServerTools"/>
<Parameter Name="HWmonitorLogFile" Value="$WORKAREA/HTTPFrontend/HW.log"/>
<Parameter Name="FirstRun" Value="None"/>
<Parameter Name="ComponentDir" Value="$WORKAREA/HTTPFrontend"/>
</ConfigBlock>
<ConfigBlock Name="JobTracking">
<Parameter Name="PoolThreadsSize" Value="4"/>
<Parameter Name="ComponentDir" Value="$WORKAREA/JobTracking"/>
<Parameter Name="jobsToPoll" Value="3000"/>
<Parameter Name="RssFeed" Value="no"/>
<Parameter Name="QueryInterval" Value="3"/>
<Parameter Name="PollInterval" Value="10"/>
</ConfigBlock>
<ConfigBlock Name="CrabServerConfigurations">
<Parameter Name="Protocol" Value="uberftp"/>
<Parameter Name="storagePath" Value="/data/CSstoragePath"/>
<Parameter Name="credentialType" Value="Proxy"/>
<Parameter Name="storagePort" Value="XYZ"/>
<Parameter Name="CacheDir" Value="/data1/CSstoragePath/logs"/>
<Parameter Name="ProxiesDir" Value="/tmp/del_proxies/"/>
<Parameter Name="storageName" Value="crabas.lnl.infn.it"/>
<Parameter Name="WMSserviceList" Value=""/>
<Parameter Name="baseConfUrl" Value="http://cmsdoc.cern.ch/cms/LCG/crab/config/"/>
<Parameter Name="configFileName" Value="glite_wms_CERN.conf"/>
<Parameter Name="crabServerschemaLocation" Value="$CRAB_SERVER_ROOT/share/CrabServerDB.sql"/>
3 Gli
Unix domain socket (detti anche socket locali o socket in dominio Unix), usati nei sistemi
operativi POSIX per le comunicazioni tra processi residenti sullo stesso computer.
4.4 Architettura del server
69
<Parameter Name="resourceBroker" Value="CNAFStress"/>
</ConfigBlock>
<ConfigBlock Name="CrabServerWorker">
<Parameter Name="maxThreads" Value="5"/>
<Parameter Name="ComponentDir" Value="$WORKAREA/CrabServerWorker"/>
</ConfigBlock>
<ConfigBlock Name="JobKiller">
<Parameter Name="KillerName" Value="BossLiteKiller"/>
<Parameter Name="ComponentDir" Value="$WORKAREA/JobKiller"/>
<Parameter Name="RssFeed" Value="no"/>
</ConfigBlock>
<ConfigBlock Name="Notification">
<Parameter Name="Notification_SMTPServer" Value="smtp.lnl.infn.it"/>
<Parameter Name="ComponentDir" Value="$WORKAREA/Notification"/>
<Parameter Name="Notification_SMTPServerDBGLVL" Value="3"/>
<Parameter Name="Notification_per_task" Value="true"/>
<Parameter Name="NotificationDelay" Value="10"/>
<Parameter Name="Notification_SenderName" Value="[email protected]"/>
<Parameter Name="Notification_SenderPwd" Value="XXXXX"/>
<Parameter Name="debugLevel" Value="9"/>
<Parameter Name="Notification_per_job" Value="false"/>
</ConfigBlock>
<ConfigBlock Name="TaskLifeManager">
<Parameter Name="levelAvailable" Value="15"/>
<Parameter Name="checkProxy" Value="on"/>
<Parameter Name="ComponentDir" Value="$WORKAREA/TaskLifeManager"/>
<Parameter Name="taskLife" Value="168:00:00"/>
<Parameter Name="eMailAdmin" Value="None"/>
<Parameter Name="pollingTimeCheck" Value="600"/>
</ConfigBlock>
<ConfigBlock Name="ErrorHandler">
<Parameter Name="ReportAction" Value="noMove"/>
<Parameter Name="ComponentDir" Value="$WORKAREA/ErrorHandler"/>
<Parameter Name="DelayFactor" Value="100"/>
<Parameter Name="RssFeed" Value="no"/>
<Parameter Name="QueueFailures" Value="False"/>
<Parameter Name="MaxCacheDirSizeMB" Value="80"/>
<Parameter Name="ErrorMatrixFile" Value=""/>
<Parameter Name="RunHandlerName" Value="crabRunFailureHandler"/>
<Parameter Name="SubmitHandlerName" Value="submitFailureHandler"/>
</ConfigBlock>
<ConfigBlock Name="BOSS">
<Parameter Name="BossLiteschemaLocation" Value="$PRODCOMMON_ROOT/share/setupDatabase.sql"/>
<Parameter Name="configDir" Value="$WORKAREA/BOSS/config"/>
<Parameter Name="tmpDir" Value="$WORKAREA/BOSS/tmp"/>
</ConfigBlock>
<ConfigBlock Name="MessageService">
<Parameter Name="pollInterval" Value="5"/>
</ConfigBlock>
<ConfigBlock Name="GetOutput">
<Parameter Name="OutputLocation" Value="SE"/>
<Parameter Name="ComponentDir" Value="$WORKAREA/GetOutput"/>
<Parameter Name="GetOutputPoolThreadsSize" Value="7"/>
<Parameter Name="RssFeed" Value="no"/>
<Parameter Name="skipWMSAuth" Value="1"/>
<Parameter Name="maxGetOutputAttempts" Value="3"/>
<Parameter Name="jobsToPoll" Value="3000"/>
70
4 CRAB: evoluzione verso un’architettura client-server
<Parameter Name="PollInterval" Value="10"/>
</ConfigBlock>
<ConfigBlock Name="CrabServer">
<Parameter Name="CrabServerName" Value="[email protected]"/>
<Parameter Name="CrabServerRunOffset" Value="10"/>
<Parameter Name="CrabServerWorkDir" Value="/home/crab/work"/>
</ConfigBlock>
<ConfigBlock Name="AdminControl">
<Parameter Name="Bots" Value="RestartBot,MessageBot"/>
<Parameter Name="BotPeriod" Value="01:00:00"/>
<Parameter Name="ComponentDir" Value="$WORKAREA/AdminControl"/>
</ConfigBlock>
<ConfigBlock Name="CrabServerDB">
<Parameter Name="maxConnectionAttempts" Value="5"/>
<Parameter Name="dbType" Value="mysql"/>
<Parameter Name="refreshPeriod" Value="14400"/>
<Parameter Name="dbWaitingTime" Value="10"/>
<Parameter Name="passwd" Value="XXXXX"/>
<Parameter Name="host" Value="localhost"/>
<Parameter Name="user" Value="DatabaseUserName"/>
<Parameter Name="socketFileLocation" Value="$WORKAREA/mysqldata/mysql.sock"/>
<Parameter Name="portNr" Value=""/>
<Parameter Name="dbName" Value="CrabServerDB"/>
<Parameter Name="schemaLocation" Value="$PRODAGENT_ROOT/share/ProdAgentDB.sql"/>
</ConfigBlock>
<ConfigBlock Name="TaskTracking">
<Parameter Name="PollInterval" Value="13"/>
<Parameter Name="ComponentDir" Value="$WORKAREA/TaskTracking"/>
<Parameter Name="Thread" Value="5"/>
<Parameter Name="debugLevel" Value="9"/>
</ConfigBlock>
<ConfigBlock Name="TaskRegister">
<Parameter Name="maxThreads" Value="6"/>
<Parameter Name="ComponentDir" Value="$WORKAREA/TaskRegister"/>
</ConfigBlock>
<ConfigBlock Name="CommandManager">
<Parameter Name="acceptableClient" Value="2.7.0,2.7.1"/>
<Parameter Name="ComponentDir" Value="$WORKAREA/CommandManager"/>
<Parameter Name="acceptableThroughput" Value="-1"/>
<Parameter Name="uiConfigWMS" Value=""/>
<Parameter Name="uiConfigRB" Value=""/>
<Parameter Name="uiConfigRBVO" Value=""/>
<Parameter Name="Port" Value="20081"/>
</ConfigBlock>
<ConfigBlock Name="JobStates">
<Parameter Name="maxRetries" Value="3"/>
<Parameter Name="mergeMaxRetries" Value="10"/>
</ConfigBlock>
</CrabServerConfiguration>
</CrabServerConfig>
4.4.1
Classificazione logica delle componenti
L’architettura del server prevede l’utilizzo di uno Storage Element locale o remoto per
lo scambio dei files dei job degli utenti. In figura 4.5 è mostrata la struttura del server
4.4 Architettura del server
71
in termini di agenti e le componenti esterne necessarie al funzionamento del server e
con cui il server interagisce. Tutte le componenti (in viola) estendono il framework
(detto anche common core) e utilizzano quest’ultimo per interagire con la base di
dati, per comunicare, per accedere alle credenziali e per interagire con lo Storage
esterno. Ogni componente svolge una determinata funzione all’interno del server vero
e proprio; nelle componenti è implementata la logica dell’applicazione che permette di
ricevere le richieste degli utenti, processarle e ritornare ai risultati secondo diversi casi
d’uso supportati che possono essere facilmente aggiunti. Le componenti, a seconda
delle entità con cui interagiscono e delle funzioni svolte possono essere classificate nei
seguenti gruppi:
• Input/Output (in arancione nella figura 4.5): CommandManager, HTTPFrontend, Notification;
• Implementazione logica e gestione (viola): TaskTracking, AdminControl, ErrorHandler, TaskRegister;
• Interazione con la Grid (azzurre): CrabServerWorker, JobTracking, GetOutput,
JobKiller.
Molte di esse, specialmente quelle che interagiscono con la Grid, che ricevono gli
input dagli utenti e in generale tutte quelle che devono e↵ettuare operazioni su molti
job o task in un breve intervallo di tempo hanno la necessitá di avere delle prestazioni
ottime in modo da evitare colli di bottiglia, accorciando e spesso rimuovendo il ritardo
per quelle singole operazioni che devono essere svolte in molti task contemporaneamente.
Tale ragione spiega perché sia stata introdotta la tecnica del multithreading[47] che
consente di ottenere un sistema multi utente scalabile, soprattutto per le operazioni
piú frequenti e lente come la sottomissione, il tracciamento dello stato e il ritiro dei
risultati dei job. Quando si interagisce con il middleware della Grid infatti è molto
importante eseguire piú istanze in parallelo in quanto alcune operazioni richiedono
una quantitá di tempo considerevole. I thread permettono di suddividere un programma in piú filoni che vengono eseguiti concorrentemente. Nel caso specifico sono
stati adottati due tipi d’implementazioni:
• la prima in cui i thread sono parte di uno stesso processo e condividono risorse
come la memoria in modo d’accedere alle stesse variabili e comunicare facilmente;
• la seconda in cui i thread appartengono a processi diversi che non condividono risorse, cosı̀ che vengano eseguiti in un ambiente isolato e quasi totalmente
indipendente.
72
4 CRAB: evoluzione verso un’architettura client-server
RICHIESTE
CRAB CLIENT
Command
Manager
Task
Tracking
RICHIESTE
WEB
MAILBOXES
HTTP
Frontend
Notification
CrabJob
Creator
MESSAGE
SERVICE
COMMON
CORE
Admin
Control
MYPROXY
BOSSLITE
TASK/JOB
TaskLife
Manager
TASK
INSTANCE
MYSQL
Error
Handler
CACHE
CREDENZIALI
Job
Killer
Job
Tracking
Task
Register
CrabServer
Worker
STORAGE
Get
Output
MIDDLEWARE
Figura 4.5: Vista schematica dell’architettura del server di CRAB.
Nel caso di una macchina con un’architettura a processore singolo la CPU esegue
istruzioni di thread di↵erenti e si parla di multithreading a divisione di tempo, in
cui la commutazione fra i thread avviene di solito tanto frequentemente da dare l’impressione che tutte le operazioni siano eseguiti contemporaneamente. Ma il vantaggio
maggiore si presenta nel caso delle architetture multi-processore (o multi-core) che
negli ultimi mesi stanno prendendo sempre più piede tanto da diventare quelle più
comuni, in cui i thread vengono realmente eseguiti contemporaneamente, ciascuno su
un distinto processore.
Nel caso di un servizio come quello in questione avere delle componenti multithread
aumenta la velocitá di esecuzione sui sistemi con piú CPU o CPU con piú core. Ovviamente ci sono anche degli svantaggi in quanto tutte le componenti che utilizzano
piú thread concorrenti per una stessa porzione di codice devono essere implementate mantenendo la sicurezza dei thread (thread safety) nel caso di esecuzioni multiple
4.4 Architettura del server
73
contemporanee. In particolare è importante che i vari threads possano avere accesso
alle stesse informazioni condivise, ma che queste siano modificabili solo da un thread
alla volta.
Nel caso di un processo multithreaded con piú thread che accedono virtualmente agli
stessi dati, la struttura di controllo e l’ordine di accesso ai dati stessi non rispettano
completamente la sequenzialitá del testo del programma, rendendo possibili comportamenti inattesi dovuti alla manipolazione non corretta delle informazioni. Infatti,
l’utilizzo di tale tecnica ha portato all’introduzione di alcune e↵etti collaterali. In
primo luogo questi ultimi sono legati alla gestione della concorrenza fra i vari thread,
sia perché Python per quanto riguarda l’interazione con MySql non è thread safe sia
perché alcuni strumenti messi a disposizione dalla Grid necessitano di un ambiente dedicato per l’esecuzione delle chiamate al middleware (ad esempio creando dei thread
come fossero dei nuovi sottoprocessi che non condividono l’area di memoria fra loro).
Questo caso ha dilatato notevolmente il tempo necessario allo sviluppo. In secondo
luogo avere molte componenti che a loro volta eseguono molti thread concorrentemente incrementa notevolmente il carico di lavoro per la macchina su cui è installato il
server. Il raggiungimento di un carico di lavoro elevato influisce in modo negativo sulle
prestazioni del server, rallentando l’esecuzione delle operazioni eseguite dalle singole
componenti. Per questo motivo non è possibile aumentare senza criterio il numero di
thread necessari (generalmente un numero maggiore di thread permette un’esecuzione
più veloce delle richieste e delle operazioni), in quanto questo dipende strettamente
dalle prestazioni della macchina fisica, specialmente in termini di processori (o core)
disponibili. Infatti i sistemi multiprocessore sono dotati di più unità di calcolo indipendenti ognuna in grado di prendersi carico di un singolo thread.
Infatti un fattore di cui tenere conto consiste proprio nel fatto che un alto numero di
esecuzioni concorrenti, aumenta il carico di lavoro di tutto il server e dei servizi da
esso usati: lo Storage e la base di dati. Per quest’ultima è stata creata una libreria ad
hoc, la Safe Session. Tale libreria è in grado di gestire le connessioni al database in
modo efficiente, incapsulandole nel concetto più generico di sessione e ha le seguenti
proprietá:
• supporta piú tipi di DBMS,
• contiene un insieme di connessioni (pool ),
• preserva la sicurezza nella concorrenza dei thread,
• gestisce piú insiemi di connessioni contemporaneamente anche da parte dello
stesso programma (o componente);
• può essere modificata dall’utilizzatore tramite la tecnica dell’ereditarietà per
aggiungere o modificare il comportamento di base.
74
4 CRAB: evoluzione verso un’architettura client-server
Un pool mantiene un insieme di connessioni aperte al database, evitando di aprire e
chiudere una connessione troppe volte. Dunque un qualsiasi utilizzatore della base di
dati del server si connette utilizzando una sessione, senza occuparsi dei dettagli della
transazione o della connessione.
Vedremo il caso specifico dello Storage nel capitolo successivo tramite l’implementazione da me svolta delle Storage Element API.
4.4.2
Descrizione agenti di input/output
Le componenti di questo insieme consentono agli utenti di inviare richieste di ogni
tipo al server, agli amministratori di poter controllare il funzionamento del server e a
quest’ultimo di inviare eventuali segnalazioni agli utenti e agli amministratori.
CommandManager. La CommandManager è la componente che si prende carico delle richieste del client, le inoltra alle componenti interne del server attraverso il
sistema di messaggistica asincrono e preleva le informazioni necessarie per rispondere
alla richiesta. La comunicazione fra il client e il server avviene attraverso SOAP 4 .
Questo è stato scelto sia perché è uno standard de facto nello sviluppo di servizi nella
comunità Grid, sia perché è ideale nei servizi web che utilizzano la programmazione
orientata agli oggetti. Inoltre permette di lavorare con il protocollo HTTP (HyperText Transfer Protocol), fornendo l’interoperabilitá necessaria attraverso istituzioni e
linguaggi di programmazione diversi.
L’implementazione della parte di comunicazione è stata e↵ettuata grazie a gSOAP [48],
uno strumento open source per creare servizi web o↵rendo la possibilitá di sviluppare
facilmente in linguaggio C e C/C++ i Web services SOAP/XML (eXtensible Markup
Language). Quindi l’agente interagisce con il modulo della comunicazione attraverso
delle API che permettono d’integrare codice scritto in C/C++ con Python, grazie a
SWIG(Simplified Wrapper and Interface Generator)[49]. Il client non assume nulla sui
dettagli dell’implementazione del server e vice versa e il corpo dei messaggi è definito
con XML, che incapsula i comandi e i dettagli delle richieste degli utenti. Di seguito
c’è un esempio di comando inviato dal client al server che richiede la cancellazione del
job numero 1 del task cinquilli crab 0 091228 101315 41uyv0 :
<?xml version="1.0" ?>
<TaskCommand
ClientVersion="2.7.0"
4 Simple
Object Access Protocol è un protocollo leggero per lo scambio di messaggi tra componenti
software, tipicamente nella forma di componentistica software. La parola object manifesta che l’uso
del protocollo dovrebbe e↵ettuarsi secondo il paradigma della programmazione orientata agli oggetti.
4.4 Architettura del server
75
Command="kill"
Flavour="analysis"
Range="[1]"
Scheduler="glite"
Subject="/C=IT/O=INFN/OU=Personal Certificate/L=Perugia/CN=Mattia Cinquilli"
Task="cinquilli\_crab\_0\_091228\_101315\_41uyv0"
TotJob="-1"
Type="fullySpecified"
/>
HTTPFrontend. L’HTTPFrontend fornisce gli strumenti necessari per mostrare
sia agli utenti che agli amministratori informazioni sul server tramite HTTP:
• stato dell’hardware del server,
• stato del software del server relativo a MySql, server Python, Storage, etc.,
• vista dei job sul server, raggruppandoli per utente, dati analizzati, tempo, etc.
. Questa componente include CherryPy[50], un framework per lo sviluppo web con
Python che fornisce le fondamenta sopra le quali costruire applicazioni web in modo
molto simile a come si scriverebbe un altro programma Python a oggetti, risultando
in meno linee di codice sviluppate in meno tempo. Quindi ogni pagina Web che viene
visualizzata da questa componente corrisponde ad un modulo. L’insieme dei moduli
costituisce un plug-in di questo agente.
In figura 4.6 è mostrata una vista della distribuzione per sito Grid dei job sottomessi
tramite il server di Legnaro dal 20 Novembre 2009 al 28 Dicembre 2009.
Notification. La Notification invia messaggi di posta elettronica sia tramite un
server di posta locale alla macchina del server, sia autenticandosi ad un server di posta
remoto. Generalmente i messaggi di posta inviati notificano gli utenti dell’esito dei
loro job una volta che sono tutti terminati e gli amministratori per particolari situazioni di allarme che possono verificarsi.
4.4.3
Descrizione agenti di logica e di gestione
Queste componenti gestiscono il flusso di lavoro all’interno del server, implementando
la logica necessaria a fornire le funzionalitá specifiche e per gestire il server stesso.
TaskTracking. La TaskTracking è la componente informativa del server. Gli
obiettivi di questa componente sono:
76
4 CRAB: evoluzione verso un’architettura client-server
Figura 4.6: Job per sito sottomessi dal 20 Novembre 2009 al 28 Dicembre 2009. Grafico
prelevato dall’HTTPFrontend del server di analisi di Legnaro.
• mantenere informazioni generali dei task attivi e non sul server,
• notificare le altre componenti quando un task passa di stato,
• generare e mantenere i file xml sullo stato e i log di ogni task.
Questa componente è implementata con la tecnica del multithreading e sarà descritta
nel dettaglio nel cap. 5.
AdminControl. L’AdminControl è un semplice framework a plug-in per eseguire
periodicamente delle operazioni che possono essere di manutenzione per poter rendere
il server il piú possibile auto gestito, riducendo al minimo il carico di lavoro sull’amministratore. Ogni plug-in corrisponde ad un’operazione o serie di operazioni e due
esempi ne sono:
• RestartBot: puó capitare che per qualche motivo una componente non sia piú
in esecuzione e questo si occupa di controllare che tutte le componenti del server
siano in esecuzione facendo ripartire quelle che non lo sono.
4.4 Architettura del server
77
• MessageBot: pulisce la tabella del database che contiene lo storico dei messaggi
inviati dalle componenti attraverso il MessageService.
ErrorHandler. L’ErrorHandler si occupa della gestione degli errori sottoscrivendosi agli eventi (sotto forma di messaggi) generati dalle altre componenti. A seconda
del tipo di errore e del tipo di job questa componente esegue l’operazione associata, aggiornando le informazioni del job. Ha una struttura a plug-in 5 in modo che
possano essere definiti una vasta gamma di errori e che per ogni caso d’uso generico
venga definito un plug-in appropriato. I plug-in da utilizzare vengono specificati nella
configurazione del server. Quando la componente riceve l’evento a cui è registrata
essa attiva il plug-in associato all’evento passandogli le informazioni necessarie. Il
plug-in principalmente utilizzato è quello che si occupa di gestire i fallimenti dei job,
prendendo delle decisioni a seconda del codice di uscita del job e innescando le azioni necessarie (generando un nuovo evento per un’altra componente). Attualmente le
azioni disponibili sono:
• NoResubmission: non viene eseguita nessuna azione per il job, che viene archiviato; è l’azione eseguita di default;
• DelayedResubmission: viene richiesta la risottomissione del job, con un ritardo
configurabile;
• ResubmitElsewhere: viene richiesta la risottomissione, ma il sito in cui il job è
fallito viene rimosso da quelli disponibili.
TaskRegister. La TaskRegister prende in carico le richieste di nuovi task dalla
CommandManager, verifica la consistenza e la correttezza dei dati in ingresso (proxy,
input sandbox, definizione task, etc.) e, se questa va a buon fine, prepara le strutture
dati necessarie al server, deserializzando nel database del server le informazioni inviate
dal client in formato XML; infine invia un messaggio di corretta registrazione di un
nuovo task. Questa componente è multithreaded e permette di gestire ogni singolo
task per thread.
4.4.4
Descrizione agenti per l’interazione con la Grid
Le componenti di questo gruppo sono basate soprattutto su BossLite per interagire
con i vari middleware in modo trasparente. Come detto in precedenza sono implemen5 plug-in:
programma non autonomo che serve ad aumentare le funzioni di una applicazione. Ad
esempio, i plug-in dei browser web permettono di visualizzare oltre alle pagine html altri tipi di
file, come le animazioni in formato flash, etc. La capacitá di un software di supportare i plugin è
generalmente un’ottima caratteristica, perché rende possibile l’ampliamento e la personalizzazione
delle sue funzioni in maniera semplice e veloce.
78
4 CRAB: evoluzione verso un’architettura client-server
tate secondo il modello di multithread per velocizzare l’interazione con il middleware
che spesso è fra le operazioni meno veloci di tutto il flusso di lavoro, evitando di creare
dei rallentamenti e congestionamenti del servizio nel caso di richieste simultanee.
CrabServerWorker. É strutturata da un modulo principale che si occupa di ricevere le richieste di sottomissione di insiemi di job verso la Grid ritornandone l’esito e
da un insieme di thread che vengono attivati dal modulo principale solo quando vi sono
delle richieste da soddisfare. Un compito della componente è anche quello di e↵ettuare
un vero e proprio scheduling delle sottomissioni su delle code appropriate distribuendo
il carico di lavoro fra i vari thread. Per ogni singola richiesta di sottomissione, che
spesso comprende piú job, questo agente implementa i controlli sulle dimensioni delle
collezioni di job e se necessario le ridefinisce al fine di ottimizzare l’interazione con
la Grid. L’esito dell’operazione di sottomissione non è sempre positivo e per questo
sono state implementate delle soluzioni di fall back. Questo agente si occupa anche di
e↵ettuare eventuali ri-sottomissioni.
JobTracking. La JobTracking controlla regolarmente lo stato dei job sottomessi
sulla Grid e richiede il ritiro dell’output per quei job che sono finiti. La componente è
strutturata in due moduli: il primo modulo principale (main module) esegue l’inizializzazione e gestisce i messaggi ricevuti; il secondo (status monitor ) aggiorna lo stato
dei job nella base di dati interna interrogando la Grid e segnala i job terminati alla
GetOutput.
Quest’ultimo è stato implementato utilizzando un pool scheduler, un pool di thread
e due code per la comunicazione. Il pool scheduler assegna il carico di lavoro per le
interrogazioni, che in parallelo eseguono il controllo dello stato. Un modello basato
sulla comunicazione di token che identificano i sottoinsiemi di job garantisce la sincronizzazione tra i thread e il pool scheduler, consentendo l’assegnazione dinamica dei
job.
Il modello di funzionamento è mostrato in figura 4.7. Il pool scheduler partiziona
l’insieme dei job in una serie di sottoinsiemi, assegnando un identificatore (token) a
ciascuno di essi. Dopo di che, il pool scheduler inserisce gli identificatori nella coda
di input, che è persistente (sulla base di dati del server). La prima azione che viene
e↵ettuata dal thread è quella di mettersi in attesa di un token da leggere dalla coda di
input. Dopo avere ottenuto il token, il thread esegue l’operazione per il controllo dello
stato di tutti i job connessi a tale token, inserendo quest’ultimo nella coda di output e
andando nuovamente a leggere dalla coda di input per ottenere un nuovo incarico. Il
token inserito nella coda di output viene prelevato dal pool scheduler, che dunque può
e↵ettuare nuovamente l’assegnazione dei job connessi a tale token, insieme ai nuovi
4.4 Architettura del server
79
job che nel frattempo possono essere stati sottomessi su Grid.
Figura 4.7: Implementazione con un pool di thread della componente JobTracking.
GetOutput. La GetOutput esegue l’operazione di ritiro dei risultati dei job degli
utenti quando viene richiesto dalla JobTracking. La componente interroga regolarmente la base di dati interna per verificare se ci sono o meno job per cui è stato
richiesto il ritiro degli output, mettendo in coda tali richieste. Un gruppo di thread
(pool thread ) prende le richieste dalla coda, e↵ettua l’operazione e mette in coda l’output. Regolarmente la componente interroga la coda per verificare se ci sono job per
cui sono stati ritirati i risultati, generando il corrispondente messaggio di job terminato con successo oppure fallito. La struttura per classi è mostrata in figura 4.8. La
classe GetOutputComponent è la classe principale e il metodo checkJobs() esegue l’interrogazione per job di cui è stato richiesto l’output, mettendo la richiesta nella coda
dei thread. Successivamente esegue un’interrogazione dei job di cui è stato ritirato
l’output, per ognuno di essi chiama il metodo processOutput() processando l’output
ritirato dai thread. La classe JobHandling implementa i metodi necessari a dialogare
con il MessageService, la gestione delle operazioni con il file system e con le operazioni
necessarie ad archiviare i job processati. La classe JobOutput implementa tutte le operazioni specifiche per il ritiro dell’output, includendo i metodi come requestOutput()
usato anche dalla componente JobTracking per richiedere l’operazione, doWork() che
implementa il corpo del thread che esegue realmente l’operazione interagendo con BossLite e la Grid, e setDoneStatus() usato per indicare la fine di un’operazione.
JobKiller. La JobKiller mette a disposizione i servizi necessari a cancellare i job
sottomessi verso la Grid. Anche questa componente funziona a plug-in, è costituita da
un’unica classe che gestisce sequenzialmente tutte le richieste smistandole al plug-in
desiderato. I diversi plug-in eseguono l’operazione di cancellazione in modo diverso a
80
4 CRAB: evoluzione verso un’architettura client-server
Figura 4.8: Schema UML della componente GetOutput.
seconda del tipo di richiesta ricevuta.
4.5
Interfaccia al middleware ed ai sistemi di batch:
BossLite
BossLite è la libreria sviluppata con Python per interfacciarsi con i vari middleware della Grid e con i sistemi batch locali. Questo strumento mette a disposizione
un’interfaccia generica e astratta, rendendo possibili operazioni standard come la sottomissione, il tracciamento, la cancellazione e il ritiro dei risultati dei job. Le interfacce
ai sistemi specifici vengono istanziate al momento dell’esecuzione grazie ad una struttura a plug-in, dove ogni plug-in contiene le definizioni per interagire con il sistema
specifico. Attualmente è supportata l’interazione con i seguenti middleware:
• gLite di EGEE
4.5 Interfaccia al middleware ed ai sistemi di batch: BossLite
81
• CondorG di OSG
• ARC di NorduGrid
e con i seguenti sistemi locali:
• LSF
• Condor
• SGE
• PBS
BossLite usa una base di dati per tracciare e registrare in uno schema entitá-relazioni
le informazioni dei task e job da esso gestiti. Le informazioni presenti nella base
di dati vengono rimappate logicamente e velocemente attraverso oggetti di Python
che permettono agli strumenti di livelli logici più alti di utilizzare tali informazioni
in modo trasparente. Un sessione per la connessione alla base di dati permette di
eseguire operazioni (aprire e chiudere connessioni, e↵ettuare interrogazioni, inserimenti
o aggiornamenti di tuple, etc.) attraverso un’interfaccia astratta e supportando diversi
tipi di DBMS. Attualmente quelli supportati sono MySql e SQLite[51]. L’architettura
di BossLite è mostrata in figura 4.9.
82
4 CRAB: evoluzione verso un’architettura client-server
Figura 4.9: Vista schematica dell’architettura di BossLite.
Capitolo 5
Implementazione dei
componenti di gestione dei
task
“I mean, if 10 years from now, when
you are doing something quick and
dirty, you suddenly visualize that I
am looking over your shoulders and
say to yourself “Dijkstra would not
have liked this”, well, that would be
enough immortality for me.”
Edsger Dijkstra
5.1
Richieste degli utenti: task
Gli obiettivi principali di un’applicazione per la gestione dei flussi di lavoro tipici
dell’analisi dati in ambiente distribuito Grid sono:
• semplificare l’interazione dell’utente con l’analisi su ambiente distribuito;
• ottimizzare i processi sequenziali che tipicamente richiedono molto tempo;
• soddisfare le ingenti richieste di potenza computazionale sfruttando tutte le
risorse distribuite;
• accedere contemporaneamente ai dati distribuiti su di↵erenti posizioni geografiche.
84
5 Implementazione dei componenti di gestione dei task
Per raggiungere tali obiettivi la singola richiesta dell’utente viene identificata univocamente con un flusso di lavoro detto task, costituito dall’insieme delle specifiche
necessarie ad eseguire la richiesta stessa. Il task è quindi l’entità logica avente corrispondenza 1 a 1 con la richiesta dell’utente. A sua volta l’applicazione fattorizza
la richiesta e quindi il task, in un insieme di sotto unità logiche dette job. Ognuno
di questi è eseguito sequenzialmente venendo distribuito su più siti computazionali.
La fattorizzazione in job della richiesta iniziale viene detta job splitting, e crea una
relazione uno a molti fra il task e i job. Da un punto di vista Grid ognuno di questi
job è a sé stante e indipendente dagli altri, il middleware non tiene traccia del fatto
che appartengano ad uno stesso task.
Il task definisce dunque una entità monolitica di cui l’applicazione deve servirisi per
poter rappresentare in maniera univoca la richiesta dell’utente e gestire efficacemente
la mole di flussi di lavoro attivi nel servizio.
5.1.1
Task e job
L’introduzione del concetto di task nelle applicazioni distribuite è un’aspetto tanto
importante quanto critico in quanto permette raccogliere un insieme di job in un’unica
entità, specialmente in uno strumento come il server di CRAB, disegnato per essere
interposto tra il consumatore ed i servizi della Grid. Tutte le operazioni eseguite dagli
agenti del server si possono distinguere in base alla granularità degli ogetti con cui
operano. Essi possono essere task e job:
• job: viene utilizzato come elemento indivisibile per quanto riguarda le opera-
zioni da un punto di vista Grid (tracciamento, sottomissione e risottomissione,
cancellazione, ritiro dei risultati);
• task: è l’insieme dei job che viene usato per rappresentare e raccogliere in un’un-
cia entità un singolo flusso di lavoro dell’utente; tramite questo oggetto è possibile accedere all’insieme dei job per poter e↵ettuare singole operazioni su di
essi.
Fin dalle fasi iniziali della progettazione del server di CRAB sono stati disegnati i
demoni necessari ad operare e gestire l’entità task. Sono stati quindi definiti gli agenti
per:
• tracciare lo stato di avanzamento dei task e per aggregare gli eventi (operazioni
o decisioni) ad esso inerenti;
• gestire il ciclo di vita del task all’interno del server, dall’arrivo fino al termine.
Il secondo agente include la gestione dei file di input e di output dei job del task,
nonché l’interazione con l’area di Storage associata al server. Come visto nel cap. 4
85
5.2 Componente per l’aggregazione delle informazioni sui task
RICHIESTE
CRAB CLIENT
Command
Manager
Task
Tracking
RICHIESTE
WEB
MAILBOXES
HTTP
Frontend
Notification
CrabJob
Creator
MESSAGE
SERVICE
COMMON
CORE
Admin
Control
MYPROXY
BOSSLITE
TASK/JOB
TaskLife
Manager
TASK
INSTANCE
MYSQL
Error
Handler
CACHE
CREDENZIALI
Job
Killer
Job
Tracking
Task
Register
CrabServer
Worker
STORAGE
Get
Output
MIDDLEWARE
Figura 5.1: Architettura e componenti del server di CRAB; in rosso sono evidenziati
gli agenti dedicati alla gestione dei task e le frecce relative all’interazione con lo Storage
Element attraverso le SEAPI.
il tipo di area e le modalità d’interazione (i protocolli utilizzati) possono cambiare a
seconda della specifica installazione e configurazione. Per far fronte a questa esigenza
è stato sviluppato un insieme di API che permette di lavorare su quest’area in modo
trasparente e semplice.
In figura 5.1 è mostrata l’architettura del server, dove in rosso sono evidenziate le
parti sopra descritte.
5.2
Componente per l’aggregazione delle informazioni sui task
Come è già stato detto un aspetto fondamentale all’interno del server è la capacità di
poter tracciare l’avanzamento dei task in quanto unità logica. Questo implica saper
controllare lo stato di tutti i job di un task, raccogliendo le informazioni sull’avan-
86
5 Implementazione dei componenti di gestione dei task
zamento dei singoli job (controllato dall’agente JobTracking, cap. 4) e aggiornando i
file contenenti le informazioni utili per l’utente. A tal fine è stato scelto di sviluppare
un’agente dedicato che prende il nome di TaskTracking.
Come mostrato in figura 5.2 questo agente aggrega le informazioni che riceve tramite
messaggi dagli altri agenti del server. Tali informazioni sono costituite dagli eventi
che occorrono ai task e ai relativi job. Gli eventi includono tutte le operazioni richieste (come un nuovo flusso di lavoro da eseguire, o la cancellazione di un job, . . . ),
l’esito di tali operazioni ed eventuali cambiamenti di stato dei task. Queste vengono
dunque elaborate dalla componente in questione che registra lo stato d’avanzamento
complessivo dei task stessi attraverso una coda persistente. Quest’ultima è definita
nello schema SQL della base di dati associata al server e contiene informazioni di alto
livello relative al task e all’utente associato ad esso. La presenza di una coda persistente permette di accedere in un qualsiasi momento alle informazioni memorizzate,
di registare gli avanzamenti dei vari flussi di lavoro in modo d’avere un’istantanea
sullo stato del flusso di lavoro e soprattuto gestendo al meglio la concorrenza dei vari
thread.
Un altro strumento cruciale è BossLite (cap. 4), che mette a disposizione le strutture
dati e le API necessarie a garantire l’accesso alle informazioni statiche e dinamiche
dei task e dei job. Un esempio d’interazione della TaskTracking con gli altri agenti è
quello in cui il client invia al server un nuovo task da processare:
• la CommandManager riceve un nuovo task dal client, allora propaga le informazioni necessarie alla TaskTracking e alla TaskRegister;
• la TaskTracking riceve il suddetto messaggio, registra il nuovo task nella coda
persistente e il task inizia cosı̀ ad essere tracciato;
• contemporaneamente la TaskRegister riceve lo stesso messaggio: deserializza il
task, verifica gli input, prepara il task alla sottomissione e invia un messaggio di
corretta registrazione alla TaskTracking e alla CrabServerWorker;
• la TaskTracking riceve il messaggio di corretta registrazione: aggiorna le informazioni del task e quindi lo stato d’avanzamento;
• contemporaneamente la CrabServerWorker riceve il messaggio dalla TaskRegi-
ster: carica il task in questione, lo mette nella coda dei task da sottomettere,
lo sottomette e invia alla TaskTracking un messaggio che contiene l’esito della
sottomissione;
• la TaskTracking riceve il messaggio dalla CrabServerWorker: registra il nuovo
evento e aggiorna lo stato d’avanzamento del task; nel caso in cui la sottomis-
sione sia fallita dopo tutti i possibili tentativi il task viene archiviato e non più
87
5.2 Componente per l’aggregazione delle informazioni sui task
CRABSERVER
WORKER
TASK
REGISTER
JOB
KILLER
COMMAND
MANAGER
NOTIFICATION
TASK
TRACKING
BOSSLITE
BOSSLITE
TABLES
REPORT/LOG
AREA
TASK
QUEUE
DATABASE
Figura 5.2: Schema delle interazioni della TaskTracking con le altre componenti del
server.
tracciato fino a che un nuovo evento non ne causi la de-archiviazione; nel caso in
cui la sottomissione sia andata a buon fine la Task Tracking continua a tracciare
l’avanzamento dei job del task;
• quando tutti i job sono in uno stato terminale di conseguenza la TaskTracking
archivia il task, che viene dunque considerato completo cosı̀ che questo non venga
più preso in considerazione, alleggerendo il processamento dell’agente dai task
non più necessari.
Un task archiviato può essere comunque recuperato nel caso in cui debbano essere
e↵ettuate altre operazioni su di esso. Alcune di queste operazioni sono la risottomissione di job che erano falliti, l’estensione del task che comporta l’aggiunta di ulteriori
job da eseguire oppure il semplice fatto che il tipo di flusso di lavoro in esecuzione
prevede l’esecuzione del task in più iterazioni.
Le informazioni sullo stato dei task e dei relativi job vengono propagate verso il client
nel momento in cui questo contatta il server, dunque la propagazione di informazio-
88
5 Implementazione dei componenti di gestione dei task
ni avviene su richiesta diretta. Onde rendere questo tipo di operazione più veloce,
alleggerendo il carico di lavoro sul server, la TaskTracking e↵ettua un’operazione di
caching delle informazioni necessarie all’utente. Tali informazioni vengono registrate
in un file che l’agente stesso provvede ad aggiornare periodicamente e usate dal client
su richiesta. Ovviamente tanto frequentemente questo viene aggiornato, tanto più
attuali saranno le informazioni che l’utente ha del proprio task. L’agente descritto si
occupa di:
• creare e aggiornare un file in formato XML per ogni task dove mantenere le
informazioni sugli eventi che accadono ad un task; le informazioni vengono registrate quando l’agente lo ritiene necessario o quando gli altri agenti notificano un
evento tramite il MessageService (cap. 4) messo a disposizione dal framework
comune;
• creare e aggiornare il più frequentemente possibile un file in formato XML
per ogni task che contenga lo stato di avanzamento del task e lo stato e le
informazioni di tutti i job che esso contiene.
Ecco un esempio del file che contiene le informazioni sullo stato di un particolare task:
<?xml version=’1.0’ encoding=’UTF-8’?>
<TaskTracking>
<TaskReport thresholdRequested=’0’ ended=’50’ owner=’Mattia Cinquilli’
taskName=’LM0’ TaskStatus=’Processed’ totJob=’4’
email=’mattia.c***@cern.ch’/>
<Job status=’Cleared’ sched_id=’https://lb008.cnaf.infn.it:9000/****’
site=’ce3.itep.ru’ ended=’Y’ resubmit=’0’ job_exit=’0’
sched_status=’E’ exe_exit=’0’ action=’Cleared’ cleared=’1’ id=’1’/>
<Job status=’Cleared’ sched_id=’https://lb008.cnaf.infn.it:9000/****’
site=’ce3.itep.ru’ ended=’Y’ resubmit=’0’ job_exit=’0’
sched_status=’E’ exe_exit=’0’ action=’Cleared’ cleared=’1’ id=’2’/>
<Job status=’Submitted’ sched_id=’https://lb008.cnaf.infn.it:9000/****’
site=’’ ended=’N’ resubmit=’0’ job_exit=’None’ sched_status=’SU’
exe_exit=’None’ action=’SubSuccess’ cleared=’0’ id=’3’/>
<Job status=’Submitted’ sched_id=’https://lb008.cnaf.infn.it:9000/****’
site=’’ ended=’N’ resubmit=’0’ job_exit=’None’ sched_status=’SU’
exe_exit=’None’ action=’SubSuccess’ cleared=’0’ id=’4’/>
</TaskTracking>
Ecco invece un esempio del file che contiene le informazioni sugli eventi registrati per
un task:
5.2 Componente per l’aggregazione delle informazioni sui task
89
<?xml version=’1.0’ encoding=’UTF-8’?>
<TaskTracking>
<TaskReport thresholdRequested=’0’ ended=’50’ owner=’Mattia Cinquilli’
taskName=’LM0’ TaskStatus=’Processed’ totJob=’4’
email=’mattia.c***@cern.ch’/>
<Job status=’Cleared’ sched_id=’https://lb008.cnaf.infn.it:9000/****’
site=’ce3.itep.ru’ ended=’Y’ resubmit=’0’ job_exit=’0’
sched_status=’E’ exe_exit=’0’ action=’Cleared’ cleared=’1’ id=’1’/>
<Job status=’Cleared’ sched_id=’https://lb008.cnaf.infn.it:9000/****’
site=’ce3.itep.ru’ ended=’Y’ resubmit=’0’ job_exit=’0’
sched_status=’E’ exe_exit=’0’ action=’Cleared’ cleared=’1’ id=’2’/>
<Job status=’Submitted’ sched_id=’https://lb008.cnaf.infn.it:9000/****’
site=’’ ended=’N’ resubmit=’0’ job_exit=’None’ sched_status=’SU’
exe_exit=’None’ action=’SubSuccess’ cleared=’0’ id=’3’/>
<Job status=’Submitted’ sched_id=’https://lb008.cnaf.infn.it:9000/****’
site=’’ ended=’N’ resubmit=’0’ job_exit=’None’ sched_status=’SU’
exe_exit=’None’ action=’SubSuccess’ cleared=’0’ id=’4’/>
</TaskTracking>
5.2.1
TaskTracking: architettura
La TaskTracking è sviluppata secondo la programmazione orientata agli oggetti, implementa il multithreading per poter eseguire contemporaneamente più task e utilizza
in modo esclusivo una tabella memorizzata sulla base di dati, necessaria per tenere
traccia dei task e delle informazioni ad essi associate. L’utilizzo del multithreading
è dovuto al fatto che i file creati dalla componente devono essere aggiornati il più
frequentemente possibile e che eventuali task costituiti da molti job (più di 1000) richiedono un tempo di processamento non indi↵erente. Parallelizzando tale processo
si riduce di molto la probabilità che un task di grandi dimensioni vada a rallentare
l’elaborazione degli altri, garantendo l’efficienza dal punto di vista dello user.
In particolare questo agente è costituito dalle classi mostrate nel diagramma di classi
in figura 5.3 costruito secondo lo standard UML1 . Tali classi sono:
• TaskTrackingComponent: è la classe più importante che contiene tutta la
logica dell’agente necessaria a gestire le operazioni principali, utilizzando le altre
1
L’Unified Modelling Language è il linguaggio per la modellazione di programmi e dati. È lo
standard utilizzato nell’ingegneria del software per descrivere un sistema informatico (e non solo),
consente ai vari ruoli (sviluppatore, tester, analista, etc.) di comunicare tramite lo stesso linguaggio.
Si avvale di diversi tipi di diagrammi, statici e dinamici, per fornire diverse viste di uno stesso sistema.
90
5 Implementazione dei componenti di gestione dei task
TaskTracking
CreateXml
JobReport
Thread
JobXml
TaskTracking
Component
TaskState
API
TaskTracking
Util
1
2..N
PollThread
Internal
LoggingInfo
TaskTracking
Util
Figura 5.3: Diagramma delle classi degli oggetti della TaskTracking costruito con la
specifica UML.
classi come utilità per avere un’accesso trasparente alle varie funzionalità; infatti
questo modulo implementa i metodi necessari a:
– inizializzare la componente,
– interagire con il MessageService per inviare/ricevere messaggi,
– gestire i thread,
– implementare la funzione che include la logica per tracciare l’avanzamento
dei task (poll method )
– interagire con BossLite,
– creare dei rapporti sia sui file che sulla base di dati;
• PollThread: eredita dalla classe Thread della libreria di Python le primitive
necessarie per definire ed implementare il comportamento dei thread;
• TaskTrackingUtil: contiene un insieme di funzionalità che servono semplicemente ad automatizzare alcune operazioni sui dati;
• UtilSubject: formata dall’insieme dei metodi necessari a trattare correttamente
5.2 Componente per l’aggregazione delle informazioni sui task
91
il contenuto del certificato dell’utente, in particolare del Subject che contiene la
maggior parte dei dettagli personali dell’utente;
• TaskStateAPI: contiene un insieme di API che la classe TaskTrackingComponent usa per interagire con la propria tabella che si trova sulla base di dati;
• InternalLoggingInfo: mette a disposizione un’insieme di semplici ma efficaci
metodi per gestire le informazioni di log che vengono scritte su file in formato
XML;
• JobXml: classe che rappresenta un singolo job e che contiene le informazioni
che è necessario scrivere per ogni job su un file in formato XML;
• CreateXmlJobReport: classe che mantiene tutti gli oggetti di tipo JobXml,
occupadosi di fornire un insieme di API semplici e trasparenti per scrivere il
rapporto del task su un file in formato XML.
Tracciamento e gestione dei thread
La classe TaskTrackingComponent contiene tutta la logica e le funzioni principali dell’agente. Infatti l’avvio dell’agente corrisponde alla chiamata della funzione
di inizializzazione (init) e di inizio del lavoro (startComponent) di questa classe. La
funzione di inizializzazione si occupa di leggere i parametri di esecuzione che sono
specificati nella configurazione del server (fra cui i principali sono: numero di thread,
numero di file di log dell’agente stesso, area di lavoro della componente, area di memorizzazione dei log dei task) e di inizializzare gli oggetti necessari a mantenere un
insieme di connessioni alla base di dati (cap. 4). La funzione startComponent registra
l’agente nel sistema di messaggistica del server, avvia e gestisce tanti thread quanti
ne sono stati specificati nel file di configurazione. La definizione e l’avvio dei thread
consistono nel creare oggetti di tipo PoolThread, passando alla relativa funzione di inizializzazione
init
2
) sia il nome del thread sia il riferimento al metodo della classe
TaskTrackingComponent che si occupa di tracciare l’avanzamento di un task, cioè il
poll method. Ecco la porzione di codice che chiama i thread:
for i in xrange(1, nMaxThreads):
pollingThread = PollThread(self.pollTasks, "pollingThread_" + str(i))
pollingThread.start()
2 In
Python non esistono costruttori di classe: il metodo
init
è chiamato immediatamente dopo
la creazione dell’istanza di una classe. Questo può sembrare proprio il costruttore della classe (in
Python per convenzione questo è il primo metodo definito nella classe), agisce come un costruttore (è
il primo pezzo di codice eseguito in una nuova istanza di una classe). Erroneamente, perché l’oggetto
viene costruito prima che
init
venga chiamato.
92
5 Implementazione dei componenti di gestione dei task
Il metodo passato in fase di inizializzazione è quello che il PoolThread chiama quando il thread parte. La chiamata avviene nel modo più sicuro possibile, andando ad
intercettare ogni tipo di errore che può sorgere (spesso possono esservi errori legati
alla base di dati, al sistema operativo e comunque non inerenti alla componente in sé)
e permettendo al massimo tre fallimenti prima di uscire. A seguire (vedi inserto) il
codice che implementa la classe PollThread:
class PollThread(Thread):
def __init__(self, poll, name):
Thread.__init__(self)
self.poll = poll
self.name = name
def run(self):
failedAttempts = 0
while True:
try:
self.poll(self.name)
except Exception, ex:
logging.error("ERROR in thread " + self.name + "\n" + str(ex))
if failedAttempts == 3:
logging.error("Cannot restart polling. Aborting")
logging.error("\nWarning: Polling thread is not running!")
sys.exit(1)
failedAttempts += 1
logging.error("Trying to restart polling... " + \
"(attempt %s)" % failedAttempts)
else:
failedAttempts = 0
I thread vengono dunque eseguiti all’interno dello stesso processo condividendo le
risorse come quelle di memoria. Questo comporta che la concorrenza dei thread è
stata gestita in modo accurato, andando ad implementare tutti i metodi in modo che
ogni conflitto potesse essere evitato.
Il flusso di lavoro del poll method è il seguente:
• istanzia la sessione di lavoro con il framework BossLite;
• preleva in modo esclusivo un task dalla coda dei task che sta sulla base di dati;
• carica le informazioni del task prelevato dalla coda e quelle dei job cosı̀ come
sono messe a disposizione da BossLite;
5.2 Componente per l’aggregazione delle informazioni sui task
93
• controlla lo stato di avanzamento di tutti i job del task preparando un sommario
fra quelli in avanzamento, quelli che non sono ancora iniziati, quelli finiti bene
o male;
• prepara un file XML che contiene le informazioni di avanzamento del task
(ad esempio la percentuale di job finiti) e di ogni singolo job serializzando le
informazioni prelevate da BossLite;
• aggiorna il task sulla base di dati e lo rilascia nella coda;
• va in pausa rilasciando le risorse occupate, per poi ripartire dal secondo punto.
TASK
TASK
TASK
THREAD 1
THREAD 2
THREAD N
TASK
TASK
TASK
Figura 5.4: Schema del funzionamento dei thread e della coda dei task.
Da un punto di vista della concorrenza accade quanto viene mostrato in figura 5.4.
Ogni thread seleziona un task della coda, esegue le operazioni sopra riportate per il
task scelto e quando ha finito lo rilascia. Successivamente ogni thread riposa per un
tempo predefinito all’interno del file di configurazione e sceglie nuovamente un task
e↵ettuando cosı̀ un lavoro ciclico sulla coda.
La concorrenza fra i thread sulla coda dei task è garantita in modo persistente all’interno della base di dati attraverso una tabella dedicata:
CREATE TABLE tt_taskInstance (
id int NOT NULL AUTO_INCREMENT,
task_name varchar(255) NOT NULL DEFAULT ’’,
e_mail varchar(255) NOT NULL DEFAULT ’’,
treshold_level int(3) UNSIGNED NOT NULL DEFAULT ’100’,
notification_sent int(1) UNSIGNED NOT NULL DEFAULT ’0’
ended_level int(3) UNSIGNED NOT NULL DEFAULT ’0’,
94
5 Implementazione dei componenti di gestione dei task
proxy varchar(255) NOT NULL DEFAULT ’’,
uuid varchar(255) NOT NULL DEFAULT ’’,
status varchar(255) NOT NULL DEFAULT ’not submitted’,
work_status TINYINT UNSIGNED NOT NULL DEFAULT 0
user_name varchar(255) NOT NULL DEFAULT ’’,
lastupdate_time TIMESTAMP DEFAULT 0
ended_time TIMESTAMP DEFAULT 0
land_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
cleaned_time TIMESTAMP DEFAULT 0
primary key(id),
unique(task_name),
key(task_name)
) TYPE = InnoDB DEFAULT CHARSET=latin1;
Questa tabelle mantiene le informazioni principali fra cui il nome e lo stato d’avanzamento del task, le informazioni dell’utente e i vari timestamp necessari alla gestione
del ciclo di vita del task. Di particolare interesse è il campo work status che viene
utilizzato per descrivere lo stato del task da un punto di vista della concorrenza fra i
thread. I valori che questo campo della tabella può assumere sono:
• 0 - il task è libero, non è stato ancora processato nel ciclo corrente e può venire
scelto per essere processato;
• 1 - il task è occupato e sta venendo processato da un thread;
• 2 - il task è già stato processato e bisogna aspettare il ciclo successivo per
sceglierlo di nuovo.
Il flusso di lavoro prevede che alla partenza dell’agente venga impostato a 0 il valore di quel campo per tutti i task ancora attivi (non archiviati) nella tabella, cosı̀
da garantire il consumo dei task in ordine cronologico d’arrivo. Successivamente ogni
thread seleziona il primo task (andando secondo l’ordine dell’indice id della tabella)
non ancora processato (cioè con il campo work status uguale a 0 ), occupandosi anche
di e↵ettuare un lock sulla tupla della tabella. Il lock non viene e↵ettuato usando la
corrispondente funzione LOCK messa a disposizione da SQL, ma aggiornando il campo work status della tabella a 1. Tale scelta è giustificata dal fatto che utilizzando le
primitive di SQL per il lock si potrebbero avere problemi di deadlock 3 e che se l’agente
venisse riavviato per qualche motivo le informazioni sulla base di dati continuerebbero
ad essere bloccate richiedendo un intervento manuale per la risoluzione. Quando un
3 Il
deadlock è una situazione in cui due (o più) processi (o azioni) si bloccano a vicenda aspettando
che uno esegua una certa azione (es. rilasciare il controllo su una risorsa come un file, una porta
input/output, etc.) che serve all’altro e viceversa.
5.3 Componente per la gestione del ciclo di vita dei task
95
thread finisce di elaborare un task rimuove il lock aggiornando il campo di lavoro a
2. Una volta che tutti i task non archiviati della tabella sono stati processati, cioè
quando tutti hanno work status a 2, allora il primo thread che viene eseguito che trova
questa condizione aggiorna il campo a 0 per tutti i task da elaborare. Cosı̀ facendo
i thread possono cosı̀ continuare la propria attività di tracciamento in modo ciclico
rispetto alla tabella dei task che funziona dunque come una coda.
Per garantire la concorrenza sulla selezione del task dalla tabella è stato necessario
introdurre un semaforo binario4 sfruttando il modulo BoundedSemaphore messo a
disposizione da Python per la gestione dei thread.
La TaskTracking, cosı̀ come altre componenti del server fra cui la GetOutput e la
JobTracking, fanno un uso sostenuto della base di dati. Per questo motivo è stato
necessario porre particolare attenzione all’ottimizzazione del numero di connessioni
aperte e attive. A tal fine sono state usate le Safe Session (cap. 4), lo standard messo
a disposizione del framework. Questo modulo ha permesso di gestire in modo trasparente ed efficace le connessioni necessarie incapsulandole nel concetto più generico di
sessione. Questa gestisce in modo automatico ogni connessione, aprendola solo quando
e↵etticamente necessario e chiudendola non appena è terminata l’interrogazione alla
base di dati.
5.3
Componente per la gestione del ciclo di vita dei
task
Ogni richiesta dell’utente ha per definizione una durata temporale variabile ma finita.
Un task, in quanto insieme di tuple sulla base di dati (ognuna contenente informazioni relative ai job), files di log, nonché files di input e output specifici dell’utente,
richedono un’attenta gestione in modo tale da non appesantire il carico di lavoro dei
vari agenti. Per un servizio in produzione tale attività non può essere affidato né ad
un amministratore né all’utente. Tale funzionalità deve essere necessariamente automatizzata, tramite l’implementazione di un insieme di sistemi di controllo e pulizia di
cache più avanzati possibili.
Nel caso specifico del server di CRAB gli aspetti che vanno tenuti sotto controllo e
quindi sui quali devono basarsi i sistemi di controllo e gestione del task sono:
• le credenziali degli utenti;
• il tempo di vita del tas/job sul server;
4 Un
semaforo è una struttura dati gestita da un sistema operativo multitasking per sincronizzare
l’accesso a risorse condivise tra task (cioè processi o thread). È composta da una variabile intera e
da una coda di processi. Nel caso di un semaforo binario la variabile intera può assumere 0 o 1.
96
5 Implementazione dei componenti di gestione dei task
• la completezza del task in funzione dei singoli job.
L’obiettivo principale è quello di archiviare i task vecchi dalla base di dati e rimuovere
files dallo Storage. Quest’ultimo è di particolare importanza in quanto vi possono
risiedere sia i file di input che di output di ogni singolo task. Proprio per il fatto che
quest’area contiene informazioni che dipendono dagli utenti non è di facile gestione
per via dell’uso non predicibile che ne viene fatto. La sua occupazione dipende dalle
dimensioni delle sandbox dei job (che possono variare da pochi MegaByte a qualche
GigaByte), dalla quantità di task attivi e quindi dalla quantità di utenti che utilizzano
il server. È importante notare che al momento della sottomissione di un job è impossibile per il server prevedere quale sarà la dimensione delle sandbox di output dei job,
e quindi non è possibile adottare nessuna azione preventiva se non quella di attuare
dei limiti a priori (ad esempio bloccando tutti i job degli utenti direttamente sui nodi
dei siti dove vengono prodotti file di output superiori ad una certa dimensione).
In virtù di questo è stato sviluppato un agente dedicato, che ha il ruolo di archiviare
i task una volta che il loro ciclo di vita è terminato (anche forzandone l’archiviazione
se ne è il caso) e cancellare i relativi file su Storage.
La TaskLifeManager è l’agente che svolge i compiti sopra citati. In generale le
operazioni che svolge sono le seguenti:
• ciclicamente controlla tutti i task verificando da quanto tempo si trovano sul
server: nel caso in cui un task è attivo sul server per più di una certa soglia
(specificata nel file di configurazione del server e che di default è di un mese)
allora questo viene archiviato e tutti i relativi file rimossi (tranne quelli di log)
indipendentemente dal fatto che sia attivo o meno; nel caso in cui il task è
archiviato ma i file siano ancora presenti dopo una certa soglia limite (anche
questa specificata nel file di configurazione e di default di una settimana) questi
vengono rimossi;
• ciclicamente controlla le credenziali degli utenti: se individua delle credenziali
che sono scadute archivia il task e prepara un file con la lista dei file da rimuovere
(i file sullo Storage non possono essere rimossi in assenza di credenziali valide);
nel caso in cui le credenziali non sono ancora scadute ma la loro durata residua
è al di sotto di una certa soglia allora, onde evitare che queste scadano prima
del completamento del task, viene inviata un’e-mail all’utente dove gli viene
chiesto di rinnovarle (il client mette a disposizione un semplice comando per
poterle rinnovare); nel caso in cui è possibile il server rinnova automaticamente le
credenziali contattando il servizio MyProxy, evitando cosı̀ di contattare l’utente;
• raccogliere tutti i file che non sono stati rimossi durante i due cicli sopra elencati:
prepara uno script per la loro rimozione che deve essere eseguito da un utente
5.3 Componente per la gestione del ciclo di vita dei task
97
amministratore, invia un’e-mail proprio a quest’ultimo indicandogli il motivo
dell’e-mail e il comando da eseguire;
• rimuovere i singoli file dei risultati dei job (output sandbox) mano a mano che
questi vengono ritirati dagli utenti.
5.3.1
TaskLifeManager: architettura
Anche questa componente è sviluppata secondo la teoria della programmazione ad
oggetti. I cicli da essa e↵ettuati non sono eseguiti attraverso un costrutto iterativo
della programmazione, ma sono costruiti sul sistema di messaggistica del framework:
l’agente si inizializza ed esegue una prima volta tutte le operazioni necessarie; al
termine di queste invia un messaggio a cui l’agente stesso è registrato. Il messaggio
inviato attraverso il MessageService specifica un tempo di ritardo con il quale il
messaggio deve essere recapitato. Una volta trascorso questo intervallo temporale
(specificato nel file di configurazione del server), durante il quale la componente è
rimasta in attesa passiva, il servizio di messaggistica mette a disposizione il messaggio
agli agenti che si sono registrati ad esso. La TaskLifeManager riceve il messaggio che
essa stessa si era inviato andando ad eseguire le operazioni associate.
In figura 5.5 è mostrato il diagramma per classi di questo agente, che sono:
TaskLifeManager
ProxyLife
TaskLife
Manager
TaskLifeAPI
Figura 5.5: Diagramma delle classi degli oggetti della TaskLifeManager costruito con
la specifica UML.
• TaskLifeManager: questa classe è quella principale che si occupa di inizializzare la componente prelevando le informazioni dalla configurazione e di preparare
le strutture dati necessarie, d’interfacciarsi con il MessageService, di e↵ettuare
il controllo sul ciclo di vita dei task dal punto di vista del tempo massimo di
98
5 Implementazione dei componenti di gestione dei task
permanenza attiva sul server, di cancellare i file non più necessari utilizzando
le funzionalità messe a disposizione dalle Storage Element API (descritte nel
paragrafo successivo);
• ProxyLife: questa classe mette a disposizione le funzionalità per controllare il
tempo di residuo della durata delle credenziali degli utenti, prendendo le decisioni
adeguate a seconda dei parametri specificati; per gestire con le credenziali utilizza
le Credential API messe a disposizione dal framework del server che permette
un’interazione trasparente indipendentemente dal tipo di credenziali usate;
• TaskLifeAPI: insieme di metodi che corrispondo alle operazioni necessarie per
interagire con la base di dati, sia in modo diretto con interrogazioni specifiche, sia
attraverso le TaskStateAPI descritte nel paragrafo precedente, sia attraverso
BossLite.
Di particolare interesse sono i flussi di lavoro che si occupano della gestione della
vita del task dal punto di vista del tempo di permanenza e della validità delle credenziali. In questo ultimo caso il flusso di lavoro è implementato nel metodo pollProxies
della classe ProxyLife e prevede i seguenti passi:
• seleziona dalla base di dati attraverso la TaskLifeAPI tutti le credenziali distinte;
• per ogni credenziale verifica la durata rimasta attraverso le CredentialAPI;
• nel caso in cui la durata del proxy delegato al server di CRAB tramite servizio
MyProxy (cap. 1) sia terminata, dunque che le credenziali dell’utente siano già
scadute:
– archivia sia i task che i job di quel task che non sono stati ancora archiviati utilizzando i metodi archiveBliteTask e archiveServerTask della classe
TaskLifeAPI ;
– memorizza in un campo di classe i file associati ai job del task archiviato
che devono ancora essere rimossi;
– crea uno script in grado di rimuovere i file ancora presenti e notificare via
e-mail l’amministratore che deve occuparsi di eseguire tale script;
• se le credenziali non sono ancora scadute, ma hanno una durata corta sotto una
soglia specificata:
– se è possibile queste vengono rinnovate attraverso la delega abilitata dal
server MyProxy;
5.4 Supporto per l’interazione trasparente con Storage Element
99
– nel caso in cui non sia possibile, il metodo invia un’e-mail all’utente che
cosı̀ può rinnovare e ri-delegare il proxy attraverso il client di CRAB;
• se il proxy ha un tempo di vita ancora accettabile si prosegue senza e↵ettuare
alcuna operazione.
Il flusso di lavoro e↵ettuato direttamente dalla classe principale TaskLifeManager
prevede di:
• selezionare tutti i task ancora non archiviati che sono sul server da oltre una
certa soglia temporale; la selezione viene e↵ettuata dalla classe TaskStateA-
PI sfruttando i campi TIMESTAMP della tabella dei task associata all’agente
TaskTracking;
• per ogni task archiviare tutti i task e i job ad esso associati cosı̀ come viene fatto
nel caso delle credenziali scadute;
• per ogni task verificare quali sono i file all’interno dell’area di Storage, cancellare
tutti i file presenti che sono ad esso associati;
• nel caso in cui alcuni file non possono essere cancellati per qualche motivo, viene
preparato uno script e viene notificato l’amministratore del server, cosı̀ come al
punto precedente.
5.4
Supporto per l’interazione trasparente con Storage Element
Uno Storage Element (cap. 1) è un servizio autonomo che implementa le funzioni
principali per la gestione dei dati senza l’intervento degli utenti, nascondendo a questi
ultimi le complessità strutturali del sistema di memorizzazione. Esso mette a disposizione le interfacce per accedere tramite Grid ai sistemi di memorizzazione di un sito,
rendendo possibile l’accesso remoto ai dati attraverso il supporto di diversi protocolli
e operazioni. Potenzialmente ognuno dei di↵erenti protocolli può essere utilizzato per
eseguire un’operazione. La scelta dipende da molti fattori che variano dal tipo di
Storage Element e dalle sue interfacce, dal caso d’uso specifico (alcune operazioni in
particolare sono possibili solo con un protocollo ben definito) e infine dalla decisione e
dall’affidablità del sito a supportare l’uno o l’altro protocollo. Le possibili operazioni
sono costituite principalmente da:
• trasferimento, come la copia dei dati fra due SE remoti, o fra uno remoto e l’area
locale;
100
5 Implementazione dei componenti di gestione dei task
• operazioni come la verifica dell’esistenza di un file o directory, controllo dei
permessi, cancellazioni o semplicemente la crezione di una directory; queste
interazioni coinvolgono un solo SE.
Le Storage Element API (SEAPI) sono lo strumento che è stato sviluppato per gestire
un insieme completo di operazioni su molti tipi di Storage Element utilizzando protocolli diversi. Questo framework è disegnato per raccogliere le richieste specifiche ed
eseguire le operazioni necessarie per soddisfarle, traducendo ogni singola richiesta in un
comando da eseguire. L’obiettivo chiave dello sviluppo è stato garantire l’interazione
trasparente indipendentemente dal tipo di SE utilizzato, nascondendo completamente
l’eterogeneità data dalle loro interfacce e le funzionalità fornite dai diversi protocolli.
Quindi le principali motivazioni per lo sviluppo di queste API sono:
• fornire un’interfaccia comune per accedere alle funzionalità specifiche che possa
garantire una trasparenza d’uso completa, indipendentemente dal protocollo;
questo permette di avere uno strumento che apparentemente funziona allo stesso
modo con tutti i protocolli, dando l’idea di interagire con i file remoti come se
fossero file locali;
• ottimizzare l’interazione fra protocolli di diverso tipo quando si eseguono ope-
razioni che prevedono l’interazione fra due SE di↵erenti (ad esempio: copiare i
dati da un sistema di memorizzazione all’altro);
• gestire con precisione i diversi tipi di errori e fallimenti, che dipendono dallo
specifico sistema, dal protocollo e dall’operazione e↵ettuata;
5.4.1
SEAPI: architettura
Le SEAPI sono state implementate con una struttura modulare basata sullo sviluppo
dinamico e separabile, una manutenzione del codice semplice e soprattutto con un
approccio che garantisca l’estendibilità. La programmazione orientata agli oggetti
assieme alla programmazione modulare e all’uso dei plug-in ha permesso di soddisfare
tali requisiti. I plug-in in particolare hanno permesso di costruire uno strumento che
garantisce l’uso corretto di sistemi di memorizzazione, dei protocolli eterogenei inclusa
la gestione degli errori specifici.
Come viene mostrato in figura 5.6 i principali moduli logici sono:
• Interface: è un’entità generica che a seconda della richiesta ricevuta e del tipo
di protocollo associato allo Storage Element carica il plug-in associato che traduce la richiesta nel comando specifico; questo modulo può essere considerato
come intermedio: l’utilizzatore (l’entità che usa le SEAPI) e↵ettua una chiama-
5.4 Supporto per l’interazione trasparente con Storage Element
101
ta uniforme attraverso l’interfaccia che nasconde le specifiche del protocollo in
particolare.
• Storage: è un modulo rappresentato da una classe che viene istanziata dal-
l’utilizzatore al momento di e↵ettuare una richiesta alle SEAPI; l’oggetto viene
passato al momento della richiesta di esecuzione di un’operazione come parametro all’interfaccia; quando devono essere eseguite operazioni di trasferimento che
coinvolgono due entità, l’interfaccia è in grado di gestire contemporaneamente
due istanze di questi oggetti.
• Plug-in: ogni plug-in contiene l’insieme delle istruzioni di uno specifico protocol-
lo; quando l’interfaccia e lo Storage devono inizializzare un’operazione i plug-in
vengono caricati dinamicamente a tempo di esecuzione grazie al dynamic loading.
• ErrorManager: la gestione degli errori è e↵ettuata attraverso un insieme di
metodi che verificano i risultati delle operazioni (ad esempio l’output che viene
stampato dall’esecuzione dei comandi e i relativi codici di uscita) che sono in
grado di riconoscere se vi è stato un fallimento o meno; nel caso in cui viene
rilevato un errore un metodo specifico al protocollo prepara un rapporto con il
messaggio specifico dell’errore, una breve spiegazione di esso e l’intero output
dell’operazione non riuscita;
• Exception: la gestione degli errori è basata sulle eccezioni che vengono sollevate quando un errore viene rilevato; le sottoclassi di eccezioni raggruppano e
associano tutte le classi di errore che è necessario gestire.
In figura 5.7 viene illustrato il diagramma delle classi delle SEAPI secondo il linguaggio
di modellazione e specifica UML. La classe SBinterface rappresenta l’interfaccia delle
SEAPI ed interagisce direttamente con la classe SElement che rappresenta il concetto
di Storage Element. La classe Protocol è una classe concettualmente astratta, i cui
metodi vengono implementati dai vari plug-in dedicati ai protocolli supportati. La
classe che si occupa di gestire le eccezioni è Exceptions, che allo stato attuale contiene
la definizione di 13 gruppi di errori.
5.4.2
SEAPI: funzionamento
In figura 5.8 è mostrato un esempio dell’interazione fra i moduli SEAPI nel caso dell’esecuzione di una richiesta.
L’utilizzatore e↵ettua la richiesta di un’operazione tramite l’interfaccia comune delle
SEAPI. Quest’ultima è generica e funziona come un’entità intermedia che raccoglie e
traduce la richiesta e a seconda delle specifiche sceglie a tempo di esecuzione quale
102
5 Implementazione dei componenti di gestione dei task
Figura 5.6: Principali componenti logiche delle SEAPI.
plug-in deve essere utilizzato. Quindi sempre l’interfaccia inizializza e carica dinamicamente il plug-in giusto che implementa l’insieme di istruzioni del protocollo necessario.
Dunque il plug-in selezionato esegue l’operazione richiesta traducendola nel comando
specifico. Eventuali opzioni (organizzazione virtuale, timeout dell’operazione, i parametri specifici del protocollo) sono passate dall’utilizzatore all’interfaccia che a sua
volta le traduce in parametri aggiuntivi per il plug-in.
Inoltre le SEAPI controllano anche la validità delle credenziali, almeno quando queste
sono necessarie per l’esecuzione del comando. Il loro uso è dunque specificato all’interno dell’insieme di istruzioni di ogni protocollo, che quindi può gestirle a sua necessità.
I tipi di credenziali che attualmente i plug-in stanno utilizzando sono:
• proxy generati tramite certificato
• token di kerberos
5.4 Supporto per l’interazione trasparente con Storage Element
103
SEAPI
1
SBinterface
interface
1..2
1
SElement
1..N
Ogni plugin
corrisponde ad
un protocollo
Protocol
Tipo di protocollo
Plugin 1
1
Plugin 2
Plugin N
1
1
1..N
1..N
Exceptions
1..N
Figura 5.7: Diagramma delle classi degli oggetti delle SEAPI costruito con la specifica
UML.
Operation
Request
Return
Value
Operation
Perform
Figura 5.8: Schema di un caso d’uso delle SEAPI nel caso di un tasferimento da uno
Storage Element ad un altro.
104
5 Implementazione dei componenti di gestione dei task
Capitolo 6
Risultati
“Don’t tell people how to do things.
Tell them what to do and let them
surprise you with their results.”
George S. Patton
6.1
Dalla fase di test alle operazioni in produzione
Nel waterfall model del ciclo di vita dello sviluppo di un software (cap. 2) successivamente alla fase di sviluppo c’è quella d’integrazione e test. Dunque, anche nel caso di
CRAB, prima della messa in produzione sono state e↵ettuate varie fasi di test cosı̀ da
validarne sia le funzionalità che la scalabilità. L’obiettivo è sia di verificare il livello
di maturità del servizio prima delle operazioni, che di fornire indicazioni agli sviluppatori relativamente a comportamenti anomali e possibili colli di bottiglia visibili in
condizioni di carico elevato.
I test di scala del server sono stati curati in modo particolare al fine di assicurare
efficienza di funzionamento sia nella fase iniziale dell’esperimento che a condizioni di
regime. Il numero medio di job da gestire ogni giorno nella fase iniziale è di circa
60000, corrispondenti al numero di core attualmente a disposizione per le attività caotiche e impredicibili. Il numero stimato corrisponde a circa il 50% delle risorse dei T2
è destinato ad aumentare nel tempo. [52]
6.2
Test di scala del server
L’esigenza di scalabilità e affidabilità a numeri molto alti ha chiaramente segnato le
linee guida dello sviluppo, ma soprattutto ha reso necessaria, nel corso del tempo, la
106
6 Risultati
programmazione e l’esecuzione di attente e complesse fasi di test. Fin dal principio
sono state identificate le aree più critiche da controllare attentamente prima della
messa in produzione del servizio:
• l’interazione con il middleware della Grid: per garantire la scalabilità di tutto
il sistema è importante garantire che l’uso dell’infrastruttura sottostante alle
applicazioni sia ottimizzato; proprio a tal fine il server ha un’architettura che
sfrutta le potenzialità della Grid implementando inoltre il concetto di multithreading che permette di suddividere il carico di lavoro su più thread eseguiti in
parallelo (cap. 5);
• la gestione della multi utenza e della relativa concorrenza nell’esecuzione delle
richieste: questo è un aspetto critico in quanto ogni operazione va eseguita
utilizzando le opportune credenziali dell’utente e, ovviamente, la concorrenza di
richieste non deve introdurre ritardi nelle esecuzione delle stesse; anche in questo
caso il concetto del multithreading è stato introdotto per evitare un approccio
del tipo: primo arrivato primo servito.
Entrambe gli aspetti sopra elencati hanno richiesto quindi attente fasi di test e successive iterazioni finalizzate ad ottimizzazioni. Il multithreading infatti se da un lato
risolve aspetti di concorrenza dall’altro introduce problematiche relative al carico di
lavoro della macchina fisica che ospita il server. Questa raggiungendo valori eccessivamente elevati potrebbe inficiare le prestazioni del server.
Per la fase di test è stato creato un ambiente dedicato in cui e↵ettuare le prove necessarie alla verifica della scalabilità e dell’affidabilità del server, fino ai tassi previsti dalla
collaborazione. A tal fine è stato scelto uno Storage Element basato su GridFTP[53]
installato in una macchina separata da quella in cui vengono eseguiti sia il server di
CRAB e che MySQL. Tale configurazione permette di distribuire il carico di lavoro
generato dai trasferimenti delle sandbox degli utenti e della gestione del flusso di lavoro da parte del server. Entrambe le macchine che ospitano i servizi sono costituite da
CPU 2000 MHz Dual Core AMD Opteron con 4 GB di RAM. La Grid utilizzata per
e↵ettuare questi test è stata WLCG (cap. 1). Per quanto riguarda il middleware le
sottomissioni sono state e↵ettuate attraverso due Resource Broker di tipo gLite (cap.
1) dedicati.
Tutti i job sottomessi sono stati configurati in maniera identica, in modo tale da avere
una durata approssimativa di due minuti (questa varia a seconda delle prestazioni dei
Worker Node) senza nessuna lettura di dati o altre operazioni di interazione con gli
Storage Element locali al sito, in modo da non incorrere in eventuali problemi dei siti.
Tale scelta è stata dettata dalla necessità di avere un ambiente di test rigoroso in cui
possono essere messi in evidenza eventuali errori legati al server e anche per limitare
6.2 Test di scala del server
107
l’utilizzo delle risorse dei siti. [39]
I test sono stati divisi in due fasi:
• sottomissione controllata con un solo utente;
• sottomissione multiutente.
6.2.1
Fase con un solo utente
Durante questa fase sono stati inviati al server dei task/job da un unico utente. Per
la sottomissione di jobs sono state usate due diverse configurazioni in modo tale da
avere:
• task composti da 1000 e 2000 job ogni 5 ore;
• task con 500 e 600 job ogni 20 minuti.
In tutto sono stati sottomessi circa 50000 job al giorno per 4 giorni consecutivi, per
un totale di 200000 job, come mostrato nella figura 6.1. I job sono stati distribuiti su
oltre 50 siti.
Durante questa fase di test il server non ha mostrato anomalie di funzionamento. La
gestione del carico indotto non ha mostrato colli di bottiglia e il processamento dei
task non ha accumulato ritardi significativi.
Per quanto riguarda l’e↵etto del test sul carico della macchina è stato controllato in
dettaglio l’utilizzo dei processori. In particolare MySQL ha utilizzato circa 2 core della
CPU (figura 6.2), GridFTP circa 1.5 core, mentre le componenti del server 1 solo core.
[54]
6.2.2
Fase multiutente
La necessità di ulteriori test multiutente, basati sullo stesso ambiente della fase con un
solo utente, è dettata dalla maggiore complessità dovuta dalla gestione di certificati.
Un singolo thread infatti potrebbe trovarsi a gestire richieste di utenti diversi e quindi
credenziali diverse. Questo punto è molto delicato sia per il fatto che la gestione delle
credenziali deve essere sicura, senza confusioni di sorta, sia perché ogni interazione
fra i vari certificati e i relativi ambienti di lavoro potrebbe bloccare la componente
causando dei ritardi non indi↵erenti e la conseguente crescita della coda contenente
le richieste dei vari client. Quindi durante questa seconda fase sono state e↵ettuate
sottomissioni utilizzando più certificati utente, simulando cosı̀ l’utilizzo del server di
CRAB da parte di più utenti.
In modo tale da riprodurre un uso del server il più simile possibile a quello reale sono
stati coinvolti 12 utenti che e↵ettuavano sottomissioni di job con una frequenza ben
108
6 Risultati
Figura 6.1: Distribuzione per stato dei job sottomessi attraverso il server di CRAB sul
middleware gLite durante la fase di test di sottomissioni controllate con singolo utente. Informazioni prelavate dai dati contenuti nella base di dati del server, attraverso
l’HTTPFrontend (cap. 4).
definita. Tale frequenza prevedeva che un utente inviasse 100 job ogni 15 minuti, un
altro 500 ogni 20 minuti, un altro 2000 ogni 6 ore, . . . . Inoltre per avere uno scenario
ancor più realistico due utenti sottomettevano jobs in maniera casuale, a seconda della
loro volontà. Il tipo dei job inviati era lo stesso di quelli sottomessi nella fase di test
con un unico utente.
Analizzando i risultati dei test si è potuto verificare che anche in questa fase il server
di CRAB non ha presentato anomalie nel suo funzionamento, riuscendo cosı̀ a trattare
circa 120000 job in 48 ore. Infatti, come mostrato nella figura 6.3 che mostra il numero
progeressivo di job sottomessi al server durante tale fase e distribuiti per stato, si vede
che dopo 48 ore di attività il server ha processato circa il 99.9% di job terminati che
sono in stato Cleared. Questo dimostra che la gestione del carico e l’utenza diversa non
ha costituito un problema per l’architetuttura del server. Il fatto che il 99.9% dei job è
stato processato dimostra che il carico a cui è stato sottoposto il server non corrisponde
ancora a quello limite, quindi il server potrebbbe gestire ancora più carico. Nonostante
sia ancora possibile aumentare ulteriormente il carico di lavoro di un solo server, questo
non è di immediato interesse dato che l’obiettivo è mettere in produzione il servizio
ora. Infatti, considerando solo la variabile numero di job, un unico server è in grado
6.3 Utilizzo del server di CRAB in produzione
109
Figura 6.2: Utilizzo percentuale della CPU (scala verticale) distribuito nel tempo
(scala orizzontale) da parte del server MySQL (sorgente: HTTPFrontend ).
di soddisfare le esigenze attuali (60000 jobs) e con una frequenza di sottomissione
a regime, quattro server potrebbero garantire senza problemi un ipotetico carico di
200000 jobs.
6.3
Utilizzo del server di CRAB in produzione
Durante il 2009 sono stati messi in produzione un totale di 5 server gestiti dai principali
siti della collaborazione, cioè presso: il CERN di Ginevra, i siti dell’Istituto Nazionale
di Fisica Nucleare di Bari e Legnaro, negli Stati Uniti d’America all’University of California of San Diego e infine presso il Centre de Calcul de l’IN2P3. La possibilità per
gli utenti di accedere ai servizi messi a disposizione del server di CRAB, combinata
con l’arrivo dei dati reali e le relative fasi preparatorie è stato registrato un incremento
significativo delle attività di analisi su Grid. In figura 6.4 sono mostrati il numero di
utenti per giorno che hanno utilizzato i server di CRAB messi in produzione, e come
si può ben vedere c’è un picco in prossimità della presa dei primi dati che è avvenuta
negli ultimi 2 mesi del 2009.
Dunque l’evoluzione di uno strumento come il server di CRAB combinata con l’incremento delle attività degli utenti ha portato ad un utilizzo maggiore delle risorse messe
a disposizione da parte dei siti della collaborazione, in particolare di quelle dei Tier-2
che, come detto nel captolo 3, sono quelle che il modello computazionale di CMS ha
110
6 Risultati
Figura 6.3: Distribuzione per stato dei job sottomessi al server durante la fase di test
multiutente (sorgente: HTTPFrontend ).
previsto di utilizzare per e↵ettuare l’analisi dei dati (simulati o reali che siano). L’utilizzo e↵ettuato è visibile dalle grafico in figura 6.5.
Tali informazioni provano che
il server è in grado di gestire le necessità dell’analisi della collaborazione mettendo a
disposizione un servizio scalabile, cosı̀ come attentamente valutato durante la fase di
test.
6.3.1
Valutazione dell’efficienza dei job
Utilizzando le informazioni accessibili nelle istanze in produzione è stato possibile effettuare delle valutazioni sull’efficienza dei jobs di analisi. Tale parametro permette di
avere un’indice sulla capacità di ottimizzare l’utilizzo delle risorse distribute, consentedo di verificare l’efficienza dell’utilizzo delle risorse. Tale parametro permette di capire
la quantità di potenza computazionale dei siti che viene sprecata per computazioni
che sono fallite, nonché di capire se ed eventualmente come l’applicazione sviluppata
in questo lavoro di tesi può aiutare.
A tal scopo sono stati analizzati i dati accumulati durante tutte le attività del 2009.
Sono stati messi a confronto i risultati relativi alle attività di test e lo scenario reale.
In entrambi i casi è stata utlilizzata la stessa identica infrastruttura. Nel caso dei
job di test sottomessi con CRAB la sottomissione viene controllata centralmente e
6.3 Utilizzo del server di CRAB in produzione
111
Figura 6.4: Distribuzione giornaliera del numeri di utenti diversi che hanno utilizzato
i server di CRAB a partire da Gennaio 2009 fino a metà Gennatio 2010. Grafico
generato tramite le informazioni messe a disposizione dalla Dashboard (cap. 3).
l’efficienza è circa del 90% (figura 6.6(a)). Nel caso di attività svolte dall’utente l’efficienza è di circa il 60% (figura 6.6(b)). Questa sensibile di↵erenza di efficienza nei due
casi, nonostate l’utilizzo della stessa infrastruttura, è dovuta principlamente al codice
che viene esguito, che in un caso è tenuto strettamente sotto controllo in modo da
non avere mal funzionamenti per definizione, mentre nell’altro è fortemente soggetto a
problematiche introdotte dall’utente finale, quali ad esempio memory leak nel codice
dell’eseguibile o problemi di configurazione. Tutto questo è dimostrato anche dalla
distribuzione dei job in stato Aborted, ossia falliti per ragioni esclusivamente dovute
alla Grid. Le distribuzioni in figura 6.6(a) e 6.6(b) mostrano infatti che nei due casi
(test e vita reale) le percentuali di job abortiti sono assolutamente confrontabili. Ulteriori controlli mostrano anche che nel caso degli utenti finali le tre principali cause
di fallimento, esclusi il 10% dei job abortiti, sono:
112
6 Risultati
Figura 6.5: Distribuzione dei job sottomessi tramite i server di CRAB fra i siti della
collaborazione CMS (sorgente: Dashboard ).
• nello stage in, con problemi di accesso ai dati da analizzare localizzati sullo
Storage Element locale;
• nello stage out, che è frequentemente soggetto a problemi di memorizzazione dei
risultati su Storage Element remoto;
• nel codice dell’utente che può contenere errori di programmazione.
Dal punto di vista dell’applicazione (CRAB), al fine di migliorare l’efficienza dei
job di analisi risulteranno di particolare importanza gli sviluppi futuri del server,
in particolare per quanto riguarda:
• la capacità di isolare l’utente in un ambiente controllato garantendogli un accesso
comunque quanto più trasparente possibile;
• la risottomissione intelligente dei job falliti tramite appositi plug-in della componente ErrorHandler;
• ottimizzazione del flusso di lavoro e dell’interazione con gli strumenti della Grid.
113
6.3 Utilizzo del server di CRAB in produzione
1.00
0.80
0.80
0.60
0.60
0.40
0.40
0.20
0.20
0.00
0.00
(a) Job di test.
(b) Job di utenti.
Figura 6.6: Distribuzione della frazione giornaliera di jobs terminati con successo
durante tutto l’anno 2009 (sorgente: Dashboard ).
0.45
0.30
0.40
0.25
0.35
0.20
0.30
0.25
0.15
0.20
0.15
0.10
0.10
0.05
0.05
0.00
0.00
(a) Job di test.
(b) Job di utenti.
Figura 6.7: Distribuzione giornaliera della percentuale di jobs terminati con stato
Abort durante tutto l’anno 2009 (sorgente: Dashboard ).
114
6 Risultati
Conclusioni
In questo lavoro di tesi è stata progettata e sviluppata un’applicazione basata sull’architettura client-server per il calcolo distribuito in ambiente Grid. Il client è stato
disegnato per proporre all’utente un’interfaccia più semplice e intuitiva possibile. Il
server è costituito da agenti indipendenti sviluppati secondo i paradigmi di programmazione modulare e multithreading, che comunicano in modo asincrono tramite un
sistema di messaggistica persistente, gestita attraverso una base di dati. Per garantire
un approccio sistematico alla realizzazione del server sono state seguite le strategie
dell’ingegneria del software sia in fase di progettazione che in fase di codifica, basandosi sul modello waterfall del ciclo di vita del software.
L’aspetto che è stato curato in particolare è quello relativo alla gestione e al tracciamento delle informazioni al livello del task, entità che identifica univocamente la
richiesta e↵ettuata dall’utente e che successivamente viene fattorizzato dall’applicazione in entità minori. Data la crucialità della gestione dei task, è stato necessario
sviluppare un agente dedicato per l’aggregazione di tutte le informazioni relative alle
entità di cui è composto. L’altro aspetto di rilevante importanza è legato alla gestione automatica del ciclo di vita del task e all’automazione di quelle operazioni che
altrimenti richiederebbero l’intevento di un amministratore del server, approccio non
scalabile per un servizio in produzione. Questo riguarda sia la gestione delle credenziali
che gli utenti delegano al server, che la gestione dello spazio disco sull’area di memorizzazione associata al server. Proprio per quest’ultimo è stato necessario implementare
un sistema di API capace di garantire trasparenza e genericità delle interazioni con
gli Storage Element della griglia computazionale, consentendo di e↵ettuare operazioni
su diverse tipologie di sistemi di archiviazione, indipendentemente dal protocollo e
dall’operazione e↵ettuata.
L’introduzione di questi strumenti ha consentito di ottimizzare fortemente la gestione
di tutti i flussi di lavoro (task) controllati dal server. In particolare si possono mettere
in evidenza i tre vantaggi principali sintetizzabili in: possibilità di creare resoconti per
tutti i task, facilitandone quindi il controllo da parte dell’utente; capacità di aggregazione di informazioni per l’amministratore per il controllo dello stato del servizio;
possibilità d’implementazione di sistemi di allarme per l’autogestione dei cicli di vita
dei task e i relativi file memorizzati. È a quest’ultimo livello che le librerie per l’interfacciamento con i servizi di memorizzazione risultano uno strumento essenziale al fine
di garantire l’interoperabilità.
L’applicazione client-server sviluppata è attualmente in uso da tutta la collaborazione
CMS per l’accesso ai dati reali, recentemente prodotti dall’esperimento, nonchè per
piccole produzioni di dati simulati. Precedentemente, inoltre, esso è stato lo strumento utilizzato per i vari test di scala preparatori e↵ettuati dalla collaborazione.
Questo lavoro di tesi si inquadra nel contesto dello sviluppo del sistema di Workload
Management di CMS e costituisce il risultato di 14 mesi di collaborazione con il
Dipartimento di Fisica dell’Università degli Studi di Perugia, la sezione di Perugia
dell’Istituto Nazionale di Fisica Nucleare, il CERN di Ginevra e il progetto europeo
EGEE.
Il progetto del server di CRAB prevede l’estensione del sistema con interfacce per
il supporto dell’interazione con i vari strumenti di calcolo dell’eseperimento CMS al
fine di garantire la gestione automatizzata di flussi di lavoro complessi e concatenati,
caratteristici di un esperimento di fisica delle alte energie. Alcuni prototipi sono già
stati sviluppati e altri sono in fase d’implementazione.
Ringraziamenti
Il primo grazie sincero e dovuto va a Leonello e a Daniele che mi hanno seguito,
spronato e incitato durante tutto questo intenso percorso formativo. Lo stesso vale
per tutti i colleghi, amici e fisici del dipartimento di Fisica, della sezione INFN e del
CERN.
Grazie ad Igor per avermi supportato (o sopportato. . . in ogni caso sappi che è stato
e sarà reciproco in entrambi i casi) da collega di studio e non solo. Grazie anche ad
Hassen che mi ha sopportato nel vero senso della parola, cosı̀ come hanno dovuto fare
tutto il “sesto piano” e gli “informatici” emigrati a fisica.
Ringrazio anche i coinquilini di “Casa dei matti” che nonostante vivano con me hanno
di rado la fortuna di vedermi, eppure si sentono come se io ci fossi sempre (. . . ahimé
direte!): Francesco il vecchietto di casa, Giulia l’unica svizzera che sa cucinare bene
e Martina, lei sı̀ che non sapeva a cosa stesse andando incontro quel giorno in cui mi
disse: “Sı̀, tu vai bene”.
Un grazie ad Enrico che anche oggi starà facendo la parte del più giovane e inserito
della situazione, a Jacopo che mi ha sempre supportato, a Ivan che si è dimostrato un
vero amico, a Valeria che ha perso la sfida di chi finisse per primo e a Silvia che da
quando è diventata Professoressa è un po’, comprensibilmente, scomparsa. . . ma che
comunque si ricorda sempre. Ringrazio anche tutti gli amici con cui ho perso un po’ i
contatti per motivi logistici, ma su cui so di poter sempre contare (ora che l’ho scritto
non potete fare diversamente), fra cui: Andrea C., Andrea G., Andrea T., Christian,
Gianluca, Leonardo e Luca. E per tutti i Dott. Ing. Civili: è un piacere avervi conosciuto, dal primo all’ultimo. Non posso certo dimenticare gli amici con cui ho iniziato
a frequentare gli ambienti universitari, Antó, Fabrizio, Francè, Lauretta, Paolino e gli
altri “studenti”: oggi per me finisce una fase importante e ne inizia un’altra (speriamo) che per me non significherà certo iniziare a dimenticarvi!
Ma i ringraziamenti più importanti vanno alla mia famiglia, senza la quale nulla sarebbe mai stato possibile: non potrò far altro che esservi grato per tutta la vita per quello
che siete e che avete fatto per me. E mi dispiace se non sono stato presente come certe
volte avreste desiderato. Ho semplicemente cercato di raggiungere quegli obiettivi che
Bibliografia
[1] G. E. Moore “Cramming more components onto integrated circuits” Electronics
Magazine Vol. 38, No. 8 (April 19, 1965).
[2] Al Geist et al. “PVM : parallel virtual machine : a users’ guide and tutorial for
networked parallel computing”, 3rd edition, MIT Press, 1996.
[3] Jack Dongarra, Peter Kacsuk, Norbert Podhorszki “Recent advances
in parallel virtual machine and message passing interface”, proceeding of 7th European PVM/MPI users’ group meeting, Balatonfüred (Hungary) 2000, Lecture
notes in computer science, Springer (2000).
[4] I. Foster et al. “Overview of the I-WAY: Wide-Area Visual Supercomputing”,
The International Journal of Supercomputer Applications and High Performance
Computing, Volume 10, Number 2/3, Summer Fall (1996).
[5] I. Foster, C. Kesselman “The Grid:
Blueprint for a New Computing
Infrastructure”, Morgan-Kaufmann (1999).
[6] The Condor Project
http://www.cs.wisc.edu/condor
[7] Streit “UNICORE: Getting to the heart of Grid technologies”, eStrategies,
Projects, 9th edition, British Publishers Ltd (2009).
[8] O. Smirnova et al. “The NorduGrid Architecture And Middleware for Scientific
Applications”, ICCS 2003, LNCS 2657, p. 264., Springer-Verlag (2003).
[9] M. Ellert et al. “Advanced Resource Connector middleware for lightweight
computational Grids”, Future Generation Computer Systems (2006).
[10] LCG - LHC Computing Grid
http://lcg.web.cern.ch/LCG
[11] EGEE - Enabling Grid for E-sciencE
http://www.eu-egee.org
[12] M. Cecchi et al. “The gLite Workload Management System” JPCS Proceedings
of International Conference on Computing in High Energy and Nuclear Physics
(CHEP’07).
[13] OSG - Open Science Grid
http://www.opensciencegrid.org
[14] “European Grid Initiative Blueprint” (2008)
http://eu-egi.eu/,www.eu-egi.eu/blueprint.pdf.
[15] Venugopal S. et al. “Market-Oriented Cloud Computing: Vision, Hype, and
Reality for Delivering IT Services as Computing Utilities”, Proceedings of the
10th IEEE International Conference on High Performance Computing and Communications (HPCC-08, IEEE CS Press, Los Alamitos, CA, USA), Sept. 25-27,
2008, Dalian, China.
[16] I. Foster, C. Kesselman, S. Tuecke “The Anatomy of the Grid: Enable Scalable Virtual Organizations”, proceeding of the Internet and Multimedia Systems,
and Applications (2005).
[17] S. Tuecke “Grid security infrastructure (GSI) roadmap”, Grid Forum Draft,
GSI Working Group (2000).
[18] A. Kertész “Brokering solutions for Grid middlewares”, 1st doctoral workshop
on mathematical and engineering methods in computer science., MEMICS 2005,
Brno (2005).
[19] A. Cooke et al. “R-GMA: An Information Integration System for Grid Monitoring”, On The Move to Meaningful Internet Systems 2003: CoopIS, DOA, and
ODBASE, Lecture Notes in Computer Science, Springer Berlin (2003).
[20] The MAGIC-5 Project - Medical Application on a Grid Infrastructure Connection
http://www.magic5.unile.it/
[21] J. D. McCabe “Network Analysis, Architecture, and Design, Third Edition”,
The Morgan Kaufmann Series in Networking (2007).
[22] RFC
3530
“NFS
Version
4
Protocol
Specification”,
http://tools.ietf.org/html/rfc3530 (2003).
[23] Gerald Carter, Jay Ts, Robert Eckstein “Using Samba, Third Edition”,
O’Reilly Media (2007).
[24] “Oracle, Oracle9i Real Application Clusters, Oracle white paper”, February 2002.
[25] S. C. Yadav, S. K. Singh “An Introduction to Client/Server Computing” New
Age International Publishers (2009).
[26] RFC 959 “File Transfer Protocol (FTP)”, http://tools.ietf.org/html/rfc959
(1985).
[27] J. Gutérrez “Business Data Communications and Networking: A Research
Perspective” Ided Group Publishing (2007).
[28] K. Jayaswal “Administering Data Centers: Servers, Storage, And Voice Over
Ip”, Wiley India Pvt. Ltd. (2005).
[29] W. Jia, W. Zhou “Distributed Network and Systems, From Concepts to
Implementations” Springer Science and Business Media, Network Theory and
Applications, Volume 15 (2005).
[30] LHC Homepage, http://cern.ch/lhc
[31] R. Bailey “The LEP collider”, C. R. Physique 3 (2002) 1107–1120.
[32] S. Chartrchyan et al., “The CMS Experiment at CERN LHC”, Jornal of
Instrumentation, vol 3, pp.s08004 (2008).
[33] C.Grandi, D.Stickland, L.Taylor et al., “The CMS Computing Model”,
CERN-LHCC-2004-035/G-083 (2004).
[34] A. Afaq et al., “The CMS dataset bookkeeping service”, J.Phys.Conf.Ser, 119,
072001 (2008).
[35] R. Egeland et al., “Data transfer infrastructure for CMS data taking”,
Proceedings of Science, PoS(ACAT08)033 (2008).
[36] E. W. Dijkstra “A note on two problems in connexion with graphs” Numerische
Mathematik 1: 269–271 (1959).
[37] D. Spiga for the CMS Collaboration, “CMS Workload Management”,
Nucl.Phys.Proc.Suppl. 172:141-144 (2007).
[38] D. Evans et al., “The CMS Monte Carlo Production System: Development
and Design”, 18th Hadron Collider Physics Symposium 2007 (HCP 2007) 2026 May 2007, La Biodola, Isola d’Elba, Italy. Published in Nuclear Physics B Proceedings Supplements, Volumes 177-178 (2008) 285-286.
[39] G. Codispoti, M. Cinquilli, D. Spiga et al., “Distributed analysis with CRAB: the client-server architecture evolution and commissioning”, ACAT
2008 - XII Advanced Computing and Analysis Techniques in Physics Research,
November 3-7 2008 Erice, Italy, proceedings at POS (ACAT) 029.
[40] The CMS Collaboration “CMS Physics Technical Design Report, Volume II:
Physics Performance”, J. Phys. G: Nucl. Part. Phys. 34 995-1579 (2007).
[41] K. Bloom “US CMS Tier-2 Computing”, International Conference on Computing in High Energy and Nuclear Physics (CHEP’07), Journal of Physics:
Conference Series 119 (2008).
[42] I. Fisk “Early Experience with the CMS Computing Model”, Proceedings of XII
Advanced Computing and Analysis Techniques in Physics Research, Nov. 3-7,
2008, PoS(ACAT08)038.
[43] D. Spiga, M. Cinquilli et al., “The CMS Remote Analysis Builder (CRAB)”
High Performance Computing (HiPC 2007), Lecture Notes in Computer Science,
Springer, Volume 4873/2007 (2008).
[44] F. van Lingen, M. Cinquilli, D. Spiga et al. “Job Life Cycle Management
libraries for CMS Workflow Management Projects” 17th International Conference
on Computing in High Energy and Nuclear Physics, Prague, Czech Republic, 21
- 27, Mar 2009.
[45] D. Riehle “Framework Design: A Role Modeling Approach” Swiss Federal
Institute of Technology (2000).
[46] MySQL, http://www.mysql.com
[47] T. W. Doeppner “Parallel program correctness through refinement” Proceedings of the ACM Symposium on the Principles of Programming Languages,
155–169, (1977).
[48] R. A. Van Engelen and K. A. Gallivan “The gSOAP Toolkit for Web Services and Peer-to-Peer Computing Networks” Cluster Computing and the Grid,
IEEE International Symposium on, Los Alamitos, CA, USA, IEEE Computer
Society p. 128, 0-7695-1582-7, (2002).
[49] D. Beazley, P. Lomdahl “Feeding a large-scale physics application to python”
Proceedings of the 6th International Python Conference, (1997).
[50] S. Hellegouarch “CherryPy Essentials:
Rapid Python Web Application
Development”, Packt Publishing, (2007).
[51] SQLite Home Page, http://www.sqlite.org
[52] The CMS Collaboration “The CMS Computing Project - Technical Design
Report” CERN-LHCC-2005-023, CMS TDR 7, 20 June 2005.
[53] W. Allcock et al. “GridFTP: Protocol Extension to FTP for the Grid”, Grid
Forum Internet-Draft, March 2001.
[54] A. Fanfani, D. Spiga, M. Cinquilli et al. “Distributed Analysis in CMS”,
CERN CMS Note (2009).
Scarica

Sviluppo di procedure per l`automatizzazione del flusso di lavoro per