Università degli Studi di Perugia Facoltà di Scienze Matematiche, Fisiche e Naturali Corso di Laurea in Informatica Tesi di Laurea Sviluppo di un sistema di management di ambienti di esecuzione virtualizzati per sistemi batch Candidato Riccardo Sbirrazzuoli Relatore Prof. Leonello Servoli Correlatore Riccardo M. Cefalà Anno Accademico 2007-2008 2 Indice Indice 5 Introduzione Sinossi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Struttura della Tesi . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 7 1 Cluster Computing 1.1 Introduzione . . . . . . . . . . 1.2 Tassonomia di Flynn . . . . . 1.2.1 SISD . . . . . . . . . . 1.2.2 SIMD . . . . . . . . . 1.2.3 MISD . . . . . . . . . 1.2.4 MIMD . . . . . . . . . 1.3 Cluster Computing . . . . . . 1.3.1 Nodi . . . . . . . . . . 1.3.2 Rete . . . . . . . . . . 1.3.3 Middleware . . . . . . 1.3.4 Batch System . . . . . 1.3.5 Il sistema operativo . . 1.3.6 Ambienti d’esecuzione 1.4 Grid Computing . . . . . . . . 1.4.1 LCG . . . . . . . . . . 1.5 Il cluster INFN di Perugia . . 1.5.1 Architettura . . . . . . 1.5.2 Problemi emergenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Virtualizzazione 2.1 Introduzione . . . . . . . . . . . . . . . 2.2 Tipologie di virtualizzazione . . . . . . 2.2.1 Virtualizzazione di applicazioni 2.2.2 Virtualizzazione di rete . . . . . 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 10 10 10 11 11 13 14 14 15 17 19 19 20 22 22 23 25 . . . . 29 29 29 30 30 4 INDICE 2.3 2.4 2.5 2.6 2.2.3 Virtualizzazione dei dispositivi di storage 2.2.4 Virtualizzazione di sistemi . . . . . . . . Macchine virtuali . . . . . . . . . . . . . . . . . 2.3.1 Caratteristiche e architettura VMM . . . 2.3.2 Requisiti di Popek-Goldberg . . . . . . . 2.3.3 Problemi delle architetture x86 . . . . . Tipologie di virtualizzazione dei sistemi . . . . . 2.4.1 Virtualizzazione a livello del kernel . . . 2.4.2 Virtualizzazione completa . . . . . . . . 2.4.3 Para-virtualizzazione . . . . . . . . . . . 2.4.4 Virtualizzazione hardware . . . . . . . . 2.4.5 Emulazione . . . . . . . . . . . . . . . . Xen . . . . . . . . . . . . . . . . . . . . . . . . 2.5.1 Hypervisor . . . . . . . . . . . . . . . . . 2.5.2 Domain 0 . . . . . . . . . . . . . . . . . 2.5.3 Domain U . . . . . . . . . . . . . . . . . 2.5.4 Demoni e strumenti di gestione . . . . . 2.5.5 Performance . . . . . . . . . . . . . . . . Applicazione della virtualizzazione . . . . . . . . 2.6.1 Vantaggi della virtualizzazione . . . . . . 2.6.2 Ambienti virtuali . . . . . . . . . . . . . 2.6.3 Applicazione locale . . . . . . . . . . . . 2.6.4 Ruolo del prototipo . . . . . . . . . . . . 3 Il prototipo: Virtdom 3.1 Introduzione . . . . . . . . . . . . . . . 3.2 Architettura del prototipo . . . . . . . 3.3 Scelte implementative . . . . . . . . . . 3.3.1 Linguaggio di programmazione 3.3.2 Sistema di comunicazione . . . 3.4 Protocollo di comunicazione . . . . . . 3.4.1 Messaggi del manager . . . . . 3.4.2 Messaggi del client . . . . . . . 3.5 Struttura del client . . . . . . . . . . . 3.5.1 Gestione file eseguibili . . . . . 3.5.2 Gestione proprietà . . . . . . . 3.5.3 Comunicazione con il manager . 3.5.4 Configurazione . . . . . . . . . 3.6 Struttura del manager . . . . . . . . . 3.6.1 Collezione delle informazioni . . 3.6.2 Comunicazione con i client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 31 31 32 33 34 35 35 35 35 36 36 37 37 38 38 39 40 41 42 43 44 45 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 47 48 51 51 53 54 55 55 56 56 57 58 58 59 59 60 INDICE 3.7 3.8 5 3.6.3 Decisione: i trigger . Configurazione del manager Test e considerazioni . . . . 3.8.1 Test . . . . . . . . . 3.8.2 Considerazioni . . . . . . . . . . . . . . . . . . . 4 Estensione del prototipo 4.1 Introduzione . . . . . . . . . . . . 4.2 Ambiente di test . . . . . . . . . 4.2.1 Code, tipi di VM e Dom0 4.3 Client: proprietà e azioni . . . . . 4.4 Manager: trigger . . . . . . . . . 4.5 Configurazione del batch system . 4.6 Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 63 64 64 66 . . . . . . . 69 69 69 69 69 69 69 69 5 Conclusioni 71 Ringraziamenti 74 Bibliografia 77 6 INDICE Introduzione Questo elaborato presenta il lavoro di tesi e stage svolto presso la sede INFN di Perugia e il Dipartimento di Fisica dell’Università degli Studi di Perugia nei mesi di marzo-aprile 2009. Sinossi TODO Struttura della Tesi La tesi è strutturata in cinque capitoli: Capitolo Primo: Sono esposti i sistemi di calcolo distribuito, con particolare attenzione ai cluster di computer e a uno dei loro componenti principali, il batch system. Sono introdotte l’architettura e le problematiche del Cluster INFN della sede di Perugia. Capitolo Secondo: Si introducono i concetti chiave dei sistemi di virtualizzazione con riferimento alle basi teoriche, descrivendone le caratteristiche e i vantaggi. Vengono mostrate in particolare le caratteristiche del sistema di para-virtualizzazione Xen. Si mostra come la virtualizzazione è attualmente impiegata nel cluster locale e come può essere utilizzata più vantaggiosamente. Capitolo Terzo: Capitolo Quarto: Capitolo Quinto: Nell’Appendice A è contenuto il codice sorgente del prototipo. 7 8 INDICE Capitolo 1 Cluster Computing 1.1 Introduzione Il progresso della ricerca in quasi tutti i settori della scienza è strettamente legato alla capacità di elaborare grandi quantità di dati. Simulazioni climatiche, esperimenti su particelle subatomiche, studi genetici, producono enormi moli di dati che necessitano di rilevante potenza di calcolo per essere analizzati e ricavarne informazioni utili. Lo sviluppo di processori sempre più performanti ha parzialmente sopperito a questo bisogno nel corso degli anni, ma non è sufficiente: un singolo processore impiegherebbe letteralmente secoli per analizzare i dati prodotti degli odierni esperimenti. Inoltre si sta raggiungendo il limite fisico di integrazione nei processori di silicio comunemente utilizzati; questo significa che la potenza di calcolo fornita da un solo processore è probabilmente destinata ad aumentare sempre più lentamente fino a raggiungere un limite invalicabile. La soluzione logica per aggirare questo problema è ripartire il carico computazionale su più processori o unità di elaborazione: il calcolo distribuito o parallelo. Questo capitolo prende in esame le diverse realizzazioni di calcolo distribuito che sono state proposte nel corso degli anni, fino ad arrivare a quelle che possono essere considerate la soluzioni al momento più avanzate, il cluster computing e il grid computing. Inoltre viene descritta nel dettaglio l’implementazione locale di questa soluzione, il cluster della sezione INFN di Perugia ospitato presso il Dipartimento di Fisica. 9 10 CAPITOLO 1. CLUSTER COMPUTING 1.2 Tassonomia di Flynn L’idea di distribuire il carico computazionale non è recente: già nel 1966 Michael J. Flynn propose una classificazione delle architetture dei sistemi di calcolo secondo la loro capacità di elaborare parallelamente flussi di istruzioni o dati. Tale ripartizione, nota come tassonomia di Flynn, è in linea di massima valida ancora oggi. Le categorie proposte furono le seguenti: • SISD (Single Instruction Single Data) • SIMD (Single Instruction Multiple Data) • MISD (Multiple Instruction Single Data) • MIMD (Multiple Instruction Multiple Data) 1.2.1 SISD (Single Instruction Single Data) Le istruzioni vengono eseguite sequenzialmente su un dato alla volta. Fanno parte di questa categoria tutte le macchine con la classica architettura di Von Neumann, che sono la maggior parte degli elaboratori per uso personale disponibili sul mercato. Su queste architetture è comunque possibile dare vita a una certa forma di parallelismo, sia reale che percepito. Reale in quanto tramite tecniche di pipelining si possono elaborare più istruzioni contemporaneamente in diversi stadi di avanzamento; percepito perché ripartendo in modo appropriato l’utilizzo dell’unità di elaborazione tra vari processi (scheduling) si dà l’illusione all’utente di eseguire più attività nello stesso momento. 1.2.2 SIMD (Single Instruction Multiple Data) Le istruzioni vengono eseguite sequenzialmente su più dati alla volta. I processori delle macchine appartenenti a questa categoria sono anche detti “processori vettoriali” in quanto ogni singola istruzione di tali sistemi agisce su array di dati. Il parallelismo di questi sistemi è detto “parallelismo sui dati” proprio perché operano su più dati contemporanemente. Mentre in precedenza il calcolo vettoriale era prerogativa esclusiva dei super computer (il primo di essi a sfruttare il calcolo vettoriale fu il Cray X-MP del 1982), al giorno d’oggi la maggior parte dei microprocessori multipurpose commerciali contiene sottoinsiemi di istruzioni che operano su più dati contemporaneamente (ad esempio le istruzioni SSEx dei processori x86 Intel), 1.2. TASSONOMIA DI FLYNN 11 cosı̀ come tutte le moderne schede grafiche sono equipaggiate con GPU (Graphical Processing Unit) capaci di calcoli vettoriali e matriciali per l’utilizzo in applicazioni grafiche. A dispetto della loro efficienza nell’esecuzione di algoritmi che operano su vettori di dati, le architetture di tipo SIMD sono spesso molto complesse e necessitano di software scritto ad-hoc. È per questo ed altri motivi come l’alto costo di realizzazione, che nel panorama del calcolo ad alte prestazioni i sistemi di questo tipo sono andati via via diminuendo, lasciando il posto a sistemi con architettura di tipo MIMD. 1.2.3 MISD (Multiple Instruction Single Data) Rientrano in questa tipologia tutti quei sistemi che sono in grado di eseguire contemporaneamente più istruzioni sullo stesso dato. Tipicamente nella maggior parte dei problemi si ha a che fare con grandi quantità di dati. Perciò le architetture di tipo SIMD e MIMD sono state impiegate in misura di gran lunga maggiore rispetto a quelle MISD. Non esistono dunque sistemi commerciali di questa tipologia che hanno conosciuto una rilevante diffusione. 1.2.4 MIMD (Multiple Instruction Multiple Data) Appartengono a questa tipologia gli elaboratori che sono in grado di eseguire contemporaneamente operazioni diverse su dati diversi, essendo dotati di più unità di elaborazione. Il calcolo parallelo è l’impiego naturale di queste macchine. I sistemi MIMD possono essere a loro volta suddivisi in base a come le unità di elaborazione accedono alla memoria. Memoria condivisa Tutti i processori condividono la memoria per mezzo di hardware dedicato. Le macchine di questa categoria, note anche come elaboratori SMP (Simmetric Multi Processing), possono essere ulteriormente suddivise in architetture UMA e NUMA. Le architetture UMA (Uniform Memory Access) condividono tra i processori tutta la memoria a disposizione. In caso di molti accessi concorrenti questo può rivelarsi un “collo di bottiglia” di difficile soluzione. Nelle architetture NUMA invece ogni processore, pur potendo accedere alla memoria condivisa, ha a disposizione un’area di memoria locale, detta cache, a cui accede esclusivamente e rapidamente. Questo migliora le prestazioni ma rende più complesso il meccanismo di condivisione della memoria, 12 CAPITOLO 1. CLUSTER COMPUTING che deve mantenere la cache di ogni processore coerente con la memoria globale. Per questo tali architetture sono anche note come ccNUMA (cache coerent NUMA). Memoria distribuita In questa categoria vanno inseriti tutti i sistemi che possiedono un’area di memoria separata per ogni unita di calcolo (detta anche nodo) ed ogni area di memoria non è direttamente accessibile da parte di altri nodi; ci si può riferire ad essi anche con l’acronimo MPP (Massively Parallel Processing). Negli MPP ogni nodo contiene una o più unità di elaborazione e aree di memoria ad essi associate. Ogni nodo è connesso agli altri con topologie spesso complesse, volte ad ottimizzare costi, ampiezza di banda e latenza. L’efficienza dell’interconnessione tra i nodi è cruciale per le performance dell’intero sistema poichè non essendoci porzioni di memoria condivisa, il passaggio di dati tra le unità di elaborazione può avvenire solo attraverso lo scambio di messaggi. Tutti in nodi di elaborazione affiancati da altri nodi specializzati per le operazioni di input/output contribuiscono a formare un unico grande calcolatore. La figura 1.1 mostra un tipico calcolatore MPP. É evidente la struttura unitaria del sistema, che richiede un’architettura dedicata per collegare e racchiudere i nodi di cui dispone. Figura 1.1: Il supercomuter Cray T932, costruito nella seconda metà degli anni ’90 1.3. CLUSTER COMPUTING 13 Oltre ai sistemi MPP, la tipologia di sistemi MIMD a memoria distribuita che negli ultimi anni ha ricevuto maggiori attenzioni da parte delle comunità scientifiche e dai produttori di hardware è rappresentata dai cluster di computer (letteralmente“grappoli di computer”). Similmente agli MPP anche i cluster di computer sono costituiti da più nodi, ma a differenza dei primi, ogni nodo è costituito a sua volta da un sistema indipendente che comprende unità di elaborazione, memoria e periferiche di input-output. I cluster si sono ampiamente diffusi a partire dai primi anni del XXI secolo e rappresentano l’attuale frontiera del calcolo distribuito su scala locale. Un gradino sopra ai cluster si pone il grid computing, il cui scopo è organizzare e mettere a disposizione in modo centralizzato risorse appartenenti a più gruppi anche molto distanti geograficamente. Il paragrafo che segue mostra le caratteristiche rilevanti di un cluster e accenna al concetto di griglia computazionale. 1.3 Cluster Computing Un cluster di computer può essere definito nel modo seguente: un sistema di calcolo distribuito, costituito da una collezione di computer indipendenti interconnessi che lavorano insieme come un’unica risorsa di calcolo integrata. I computer che costituiscono il cluster vengono detti nodi e ognuno di essi è capace di eseguire applicazioni individualmente; la connessione tra i nodi è realizzata tramite LAN ad alta velocità. Un cluster tipicamente è soggetto all’amministrazione di un unico ente ed è collocato fisicamente in un solo ambiente appositamente preparato. Dal punto di vista logico il cluster deve essere visto come un’unica entità, a cui gli utenti possono sottomettere i calcoli da eseguire senza essere a conoscenza dell’architettura del sistema; ogni nodo però, poiché è in realtà un sistema autonomo, con propri sistema operativo e componenti software, non è a diretta conoscenza del contesto in cui è inserito. Per realizzare l’astrazione del cluster come un’unica risorsa si rende perciò necessario uno strato aggiuntivo tra le applicazioni degli utenti e il software dei nodi: il middleware. Questo strato deve essere in grado di monitorare lo stato dei nodi e del lavoro che stanno svolgendo, di distribuire il carico computazionale in modo intelligente e trasparente e di offrire all’esterno un’interfaccia user-friendly per sottomettere compiti al cluster. 14 CAPITOLO 1. CLUSTER COMPUTING 1.3.1 Nodi I nodi di un cluster possono essere computer mono o multi processore di ogni tipo: PC, Workstation, Server, stazioni SMP. Ecco una delle chiavi principali del successo dei cluster: i nodi solitamente sono elaboratori di grande diffusione commerciale, di prezzo relativamente contenuto ma dalle buone prestazioni. Questo permette di dare vita a un piccolo cluster anche con un ridotto investimento iniziale, e di espanderlo man mano che se ne ha la possibilità. Per contro un elaboratore MPP avrebbe richiesto un budget elevato e sarebbe stato assai meno espandibile e scalabile. Ogni nodo contiene quindi l’hardware solitamente disponibile nei computer in commercio: • una o più unità di elaborazione • memoria centrale (RAM) • una o più interfacce di rete • memoria secondaria (hard disk o altri dispositivi di storage) I nodi possono essere configurati secondo le necessità e dotati di hardware aggiuntivo in base al compito a cui sono destinati. Attualmente sono in commercio elaboratori appositamente costruiti per far parte di un cluster, specie dal punto di vista fisico: anziché essere nel tipico formato “a torre” dei PC desktop sono nel formato standard 1U, basso e allungato, che permette di impilarli in appositi armadi detti rack. Soprattutto hanno caratteristiche hardware più performanti rispetto ai normali PC, ma il rapporto potenza/prezzo li rende ancora preferibili rispetto alle soluzioni MPP dedicate. La figura 1.2 mostra un esempio di cluster: si notano chiaramente i rack, i nodi in essi contenuti e il cablaggio. É evidente la differenza architetturale rispetto agli elaboratori MPP. 1.3.2 Rete Spesso la tipologia di rete utilizzata per l’infrastruttura di connessione tra i nodi è basata sullo standard Ethernet, che rappresenta un efficace compromesso tra compatibilità, efficienza e costi. La versione più recente, Ethernet GigaBit, offre fino a 1Gbps di ampiezza di banda con costi relativamente ridotti e tempi di latenza minimi. Esistono tecnologie più costose che permettono di ottenere migliori prestazioni, come ad esempio Ethernet 10GigaBit. Nulla vieta di utilizzare tali soluzioni per le porzioni della rete di maggior traffico e mantenere i prodotti più economici nelle aree periferiche. 1.3. CLUSTER COMPUTING 15 Figura 1.2: Parte della sala calcolo del CERN di Ginevra 1.3.3 Middleware Il middleware è un insieme di componenti software che si occupa di gestire e mettere a disposizione la potenza di calcolo del cluster in modo trasparente, nascondendo i dettagli architetturali dovuti alla sua natura distribuita. Ogni componente tipicamente è diviso in due sottocomponenti: una parte (client) si trova presso ogni nodo e si occupa di raccogliere informazioni ed eseguire comandi in locale; l’altra parte (server o manager) risiede presso un nodo dedicato, comunica con i client tramite protocolli definiti e prende decisioni e ordina l’esecuzione di comandi in base allo stato delle varie risorse. Uno dei componenti fondamentali del middleware, il batch-system, e anche il prototipo oggetto di questa tesi lavorano in base a questo modello. Un middleware efficiente e ben progettato deve garantire le seguenti condizioni: • Efficiente gestione delle risorse di calcolo • Proprietà di Single System Image. • Alta disponibilità e tolleranza ai guasti Gestione delle risorse di calcolo La gestione ordinata delle risorse, o RMS (Resource Management e Scheduling) è un concetto chiave per un utilizzo efficiente di un cluster. Se ben rea- 16 CAPITOLO 1. CLUSTER COMPUTING lizzata permette infatti di utilizzare senza sprechi l’hardware a disposizione e di soddisfare le necessità di tutti gli utenti. Per raggiungere questo obiettivo sono necessarie due componenti. La componente di “resource management” raccoglie informazioni relative alla presenza e allo stato delle risorse, si preoccupa di mantenere un’immagine dello stato delle risorse disponibili nel cluster e provvede ad aggiornare la sua conoscenza del sistema in base ai cambiamenti dovuti ad allocazioni, deallocazioni o indisponibilità dipendenti da altre ragioni quali il malfunzionamento dell’hardware. è suo compito inoltre raccogliere e autenticare le richieste di allocazione delle risorse, insieme a creare le strutture dati necessarie all’identificazione dei processi delle applicazioni che ne richiedono l’utilizzo. La componente di resource scheduling invece gestisce in modo equo le richieste concorrenti per l’utilizzo delle risorse e le organizza in modo da minimizzare i tempi di attesa. Per prendere le sue decisioni si basa su politiche configurabili a seconda delle necessità locali e sullo stato delle risorse messo a disposizione dal resource manager. Single System Image Il middleware deve nascondere la natura eterogenea del cluster dando l’illusione di avere a disposizione un’unica grande risorsa di calcolo. L’utente deve poter accedere al cluster tramite un’interfaccia quanto più semplice possibile e sottomettere i suoi lavori senza la necessità di sapere su quali nodi saranno effettivamente ospitati. Questo compito è svolto principalmente dalla componente di scheduling e management sopra descritta. Contribuiscono a realizzare la proprietà di SSI anche le componenti che gestiscono lo storage dei dati che, tramite filesystem distribuiti, permettono di accedervi in modo indipendente dalla loro posizione. Alla proprietà di SSI è legato anche l’aspetto del virtual networking, ovvero la capacità di utilizzare tutte le risorse del cluster indipendentemente dalla topologia dell’infrastuttura di collegamento. Alta disponibilità e alta affidabilità Il middleware deve essere in grado di rendere il sistema tollerante ai malfunzionamenti hardware o software, permettendo agli utenti di continuare a fruire dei servizi del cluster. Ad esempio nel caso che un nodo abbia un guasto mentre sta svolgendo un compito il middleware deve migrare il processo presso un nodo funzionante senza perdere quanto fatto fino a quel momento. Se invece il nodo offriva un certo servizio all’interno del cluster, tale servizio dovrebbe essere ripristinato quanto prima su un altra delle macchine a 1.3. CLUSTER COMPUTING 17 disposizione. Quando il guasto riguarda la perdita di informazioni contenute nei dispositivi di storage, il middleware deve poter ricostruire e rimettere a disposizione i dati mancanti. 1.3.4 Batch System Il batch system è uno dei componenti più importanti e complessi del middleware ed ha un ruolo nel realizzare praticamente, per intero o in parte, tutte e tre le proprietà descritte nel paragrafo precedente. Il termine “batch” significa letteralmente “infornata” ed è stato utilizzato in origine per quei processi industriali in cui le fasi operative della produzione sono svolte su gruppi di oggetti anziché pezzo per pezzo. L’applicazione di questo concetto nel campo dell’informatica è detta “batch processing” e la sua realizzazione ha subito diverse evoluzioni nel corso dei decenni. Attualmente un sistema che supporta il batch processing, detto “batch system” deve essere in grado di ricevere in ingresso una serie di programmi utente, detti “job”, e i relativi dati, eseguirli quanto più possibile senza l’interazione dell’utente e restituire i risultati al termine dell’elaborazione. Un batch system funzionante nell’ambito di un cluster deve anche saper utilizzare tutte le risorse a sua disposizione (i nodi del cluster) in modo trasparente: gli utenti che sottomettono i job non si devono interessare di quale nodo li eseguirà, ma devono percepire il cluster come un’unica entità; è il batch system che si occupa di organizzare i job e dislocarli sui nodi appropriati. Dal punto di vista fisico i nodi gestiti dal batch system possono essere suddivisi in quattro categorie: • central manager node • execution node • user interface node • checkpoint server node Il central manager node è il cardine del batch system. Su questo nodo sono in esecuzione i programmi che ricevono i job, li ripartiscono sulle risorse disponibili e monitorano l’andamento dell’intero sistema. Gli execution node sono quelli che eseguono i job e sono, ovviamente, i più numerosi. Gli user interface node sono i punti di accesso al batch system: gli utenti sottomettono i propri job attraverso questi nodi, che si occupano di trasmetterli al central manager node e di restituire i risultati al termine dell’operazione. Un’ altra funzione importante dei nodi user interface è l’autenticazione degli utenti: solo chi è accreditato può utilizzare le risorse del sistema. I checkpoint server 18 CAPITOLO 1. CLUSTER COMPUTING node sono opzionali e ospitano i file di checkpoint prodotti dai job: in caso di guasto di un nodo i job che vi erano in esecuzione possono essere ricostruiti a partire da questi file e migrati presso un altro nodo. Dal punto di vista logico il batch system è solitamente diviso in due componenti: • Scheduler • Resource manager Tipicamente sono in entrambi in esecuzione sul nodo centrale, anche se il resource manager può essere replicato nei cluster di grandi dimensioni. Lo scheduler ha lo scopo di decidere l’ordine di esecuzione dei job. I job infatti sono di natura eterogenea per quanto riguarda durata e risorse richieste e spesso il loro ordine di arrivo non coincide con l’ordine di esecuzione ottimale per il pieno utilizzo della potenza di calcolo a disposizione. Può anche essere necessario differenziare i job per classi di importanza, ognuna delle quali avrà una diversa priorità. Lo scheduler, tenendo conto di tutte queste variabili, programma l’attività futura del batch system cercando di mantenere l’equilibrio tra richieste degli utenti ed efficienza del sistema. Questo è un compito molto complesso, oggetto di numerosi studi, e analizzarlo nel dettaglio esula dagli scopi di questa tesi. Il concetto importante è che il batch system stabilisce autonomamente i job che di volta in volta devono essere eseguiti e nessun altro componente del middleware dovrebbe interferire nelle sue decisioni. Se lo scheduler è la “mente” del batch system, il resource manager può esserne considerato il “braccio”. Lo scheduler infatti solitamente non ha gli strumenti per monitorare lo stato delle risorse ed impartire comandi ai nodi: sono questi i compiti basilari del resource manager. Esso si occupa infatti di prelevare i job sottomessi dagli utenti dai nodi user interface e di organizzarli in strutture logiche dette “code” in base alle caratteristiche dei job stessi. Il resource manager inoltre ha piena conoscenza dello stato di tutte le risorse e dei job in esecuzione e mette ogni dato in suo possesso a disposizione dello scheduler. Lo scheduler utilizza queste informazioni combinandole con le sue politiche decisionali e comanda al resource manager di compiere certe operazioni sui job, come ad esempio mandare in esecuzione quelli che ne hanno maturato il diritto. Il resource manager può essere considerato un componente distribuito, funzionante secondo il modello client-manager di cui si è parlato all’inizio del paragrafo precedente: per raccogliere informazioni ed eseguire fisicamente i comandi, infatti, è presente su ogni nodo un demone, che comunica con il programma principale tramite protocolli propri del batch system. 1.3. CLUSTER COMPUTING 19 Da questa breve descrizione è chiaro come il batch system realizzi la maggior parte delle funzioni richieste al middleware descritte nel paragrafo precedente. La gestione ordinata delle risorse, suddivisa in resource management e resource scheduling, è svolta appunto dal resource manager e dallo scheduler; anche la proprietà di Single System Image è basata in gran parte sul lavoro di gestione trasparente delle risorse fatto dal batch system; la proprietà di altà affidabilità, infine, è in parte garantita dai checkpoint server, se esistenti, il cui contenuto può essere utilizzato dal batch system per non perdere la computazione svolta da job ospitati in macchine che hanno subito malfunzionamenti. 1.3.5 Il sistema operativo Ogni nodo deve disporre del proprio sistema operativo, per accedere alle risorse hardware locali che mette a disposizione nel cluster. Nel dettaglio il sistema operativo deve gestire l’utilizzo delle unità di elaborazione, della memoria, delle periferiche di rete, di I/O e qualunque altra periferica del nodo. La componente di base del sistema operativo è il nucleo, o kernel, che fornisce l’interfaccia alle applicazioni di livello superiore. Di queste applicazioni fanno parte anche quelle proprie del sistema operativo, i processi di sistema, che mettono a disposizione delle altre applicazioni diverse funzioni basilari. Il middleware ha una grande rilevanza nella dotazione software di ogni nodo: infatti non solo spesso la parte client delle varie componenti è in esecuzione su ogni nodo, ma anche il kernel deve essere opportunamente esteso per consentire al middleware una piena operatività. Un normale kernel infatti organizza le risorse basandosi esclusivamente sulla visione locale di cui dispone; le estensioni middleware permettono alle componenti di management e scheduling, che hanno una visione globale del sistema, di affiancare il kernel nelle sue decisioni. Lo schema basilare dei sistemi operativi utilizzati in ambienti cluster è mostrato in figura 1.3 In quest’ottica il sistema operativo scelto deve essere facilmente estendibile; per il funzionamento nell’ambiente del cluster è anche molto importante che supporti i comuni standard di comunicazione e programmazione per garantire una piena interoperabilità. A motivo di ciò spesso la scelta ricade sui sistemi operativi open source basati sullo standard POSIX, come Linux, opportunamente modificati come appena descritto. 1.3.6 Ambienti d’esecuzione Il livello che permette l’esecuzione delle applicazioni degli utenti è detto ambiente d’esecuzione ed è formato da tutte le librerie e i pacchetti software 20 CAPITOLO 1. CLUSTER COMPUTING Figura 1.3: Schema del sistema operativo di un nodo nei cluster di computer necessari per il corretto funzionamento dell’applicazione. In particolare le applicazioni parallele che lavorano nell’ambiente del cluster suddividono il carico computazionale tra i vari nodi tramite apposite librerie per parallelizzare il flusso d’esecuzione del programma secondo vari paradigmi, il più usato dei quali è il message passing. Queste librerie permettono la creazione di canali e lo scambio di messaggi tra i vari thread dell’applicazione parallela. Le librerie di message passing più diffuse e standardizzate sono le librerie MPI (Message Passing Interface); altre librerie che sfruttano lo stesso modello sono le PVM (Parallel Virtual Machine). Un altro paradigma di parallelizzazione invece prevede la creazione di un’area di memoria virtuale condivisa tra i vari processi, ed è utilizzato dalle librerie DSM (Distributed Shared Memory). Qualunque siano le librerie utilizzate è necessario che siano disponibili in tutti i nodi: questo può rappresentare un problema man mano che l’utenza del cluster si allarga, le librerie richieste dalle applicazioni aumentano e cominciano a presentarsi problemi di incompatibilità tra librerie di diverso tipo. 1.4 Grid Computing Il cluster computing, benché ampiamente utilizzato e apprezzato, presenta a sua volta dei limiti nei tentativi di raggiungere potenze di calcolo sempre più elevate. Un cluster infatti comporta difficoltà di gestione sempre maggiori all’aumentare della sua complessità. Aggiungere nodi a un cluster significa aumentarne l’eterogeneità hardware, accrescere la probabilità di guasti, incrementare il consumo energetico sia a causa delle necessità dei nodi stessi 1.4. GRID COMPUTING 21 che per gli impianti di condizionamento, indispensabili per mitigare gli effetti dell’alta dissipazione termica dei processori. Il grid computing introduce un ulteriore entità nel tentativo di superare questi limiti: la grid, o griglia computazionale. La grid in molti aspetti è simile a un cluster, in quanto è formata da componenti eterogenei interconnessi tra loro e necessità di uno strato middleware per gli aspetti gestionali. La novità è che i nodi di una grid non sono soggetti al controllo di una stessa organizzazione, possono essere dislocati su un ampia area geografica e possono non essere singoli elaboratori: anche un intero cluster può essere un nodo della grid. La grid può essere vista come un enorme cluster di cluster, espandibile potenzialmente all’infinito. La figura 1.4 mostra una rappresentazione di fantasia del concetto di grid: si vuole mettere in evidenza l’estensione globale e l’eterogeneità di una grid, che può includere dispositivi di ogni tipo, dai cluster ai comuni laptop, dislocati su un’ampia area geografica. Figura 1.4: Rappresentazione astratta dell’architettura e delle potenzialità di una grid Una definizione più rigorosa è stata data da Ian Foster, uno dei pionieri del grid computing. Una grid è un sistema che: • coordina l’utilizzo di risorse non soggette ad un controllo centralizzato; • utilizza protocolli e interfacce standard, aperte e generalpurpose; • fornisce diverse tipologie di servizi rilevanti 22 CAPITOLO 1. CLUSTER COMPUTING Gli enti che partecipano alla costituzione della Grid vengono dette Virtual Organizations (VO), e sottostanno a politiche di autorizzazione e autenticazione concordate insieme agli organi di coordinamento della Grid. L’organo principale è la Globus Alliance, che sviluppa attivamente il pacchetto software Globus Toolkit sul quale sono basate molte delle implementazioni di grid. L’interconnessione tra i nodi della grid spesso avviene tramite Internet, o reti WAN dedicate. La distanza tra i nodi è causa di alta latenza nella comunicazione, che è l’unica limitazione reale nel grid computing; può comunque essere mitigata parallelizzando appropriatamente le applicazioni in task semi-indipendenti che non necessitano di un elevato scambio di messaggi. 1.4.1 LHC Computing Grid (LCG) L’implementazione più importante e di dimensioni maggiori a livello mondiale è la grid LCG del CERN. Essa sta permettendo a più di 500 istituti e centri di ricerca in tutto il mondo di accedere e di analizzare i dati prodotti dagli esperimenti afferenti all’LHC (Large Hadron Collider ), il più grande acceleratore di particelle che sia mai stato costruito, entrato in funzione nell’ottobre del 2008. Si stima che la quantità di dati prodotta sarà dell’ordine di decine di petabyte all’anno, a partire dalla fine del 2008 e per i successivi 15 di attività previsti. LCG ha una struttura gerarchica a più tier e si affida a realtà regionali o nazionali già esistenti per creare un unica infrastruttura di gestione e analisi dei dati su scala mondiale. La porzione italiana di LCG è affidata all’INFN-Grid, ovvero la griglia computazionale compartecipata dagli istituti che ospitano le sedi dell’istituto nazionale di fisica nucleare, connessi attraverso la rete GARR. La sezione INFN di Perugia partecipa all’INFN-Grid mettendo a disposizione il cluster ospitato presso il Dipartimento di fisica, per un totale di oltre 100 CPU. Al momento il cluster fornisce pieno supporto a tutti gli esperimenti in corso nella LCG. Il paragrafo seguente analizza la struttura del cluster locale e alcune delle problematiche che si trova attualmente ad affrontare. 1.5 Il cluster INFN di Perugia Prima dell’entrata in funzione del cluster i vari gruppi di ricerca all’interno della struttura provvedevano autonomamente alla necessità di strumenti di calcolo. Questo portava, oltre al moltiplicarsi dei costi gestionali, a un utilizzo inefficiente delle risorse: in momenti di intensa attività potevano rivelarsi 1.5. IL CLUSTER INFN DI PERUGIA 23 insufficienti per il fabbisogno del gruppo, negli altri periodi erano solitamente sottoutilizzate. Si è deciso quindi di aggregare le risorse in un cluster dotato di un batch system basato sul pacchetto software open source Torque (resource manager) + Maui (scheduler). In questo modo i costi e le difficoltà di gestione sono stati sensibilmente abbattuti e la potenza di calcolo complessiva poteva essere usata in modo più razionale: ogni gruppo infatti beneficiava nei momenti di necessità di tutte le risorse che gli altri gruppi non stavano utilizzando. Nel 2004 il cluster è entrato a far parte della grid INFN: benché ciò sia stato un evento desiderabile e prestigioso, ha portato a tutta una serie di conseguenze che saranno meglio descritte tra breve. Il concetto chiave è che da quel punto le risorse dovevano essere condivise non solo tra i gruppi locali ma anche con l’utenza della grid: è stata introdotta eterogeneità in un sistema che era già piuttosto complesso. 1.5.1 Architettura Dal punto di vista fisico il cluster è costituito dai nodi e da una rete di interconnessione tra di essi. In questo paragrafo saranno esposte le caratteristiche hardware e software del cluster INFN di Perugia. Uno schema dell’architettura è mostrato in figura 1.5. Figura 1.5: Topologia della rete del cluster INFN di Perugia 24 CAPITOLO 1. CLUSTER COMPUTING Nodi I nodi del cluster possono essere suddivisi tra nodi interni e nodi di frontiera. I nodi di frontiera sono quelli che realizzano le funzioni di interfacciamento verso l’esterno e sono accessibili direttamente dagli utenti. Possiamo distinguere le seguenti tipologie di nodi di frontiera: • CE (Computing Element): c’è un solo nodo di questo tipo; è il più importante in quanto è quello che ospita il batch system. • UI (User Interface): tramite questi nodi l’utenza sottomette i job al sistema; sono gli unici accessibili direttamente dall’esterno del cluster. Nel caso in esame ogni gruppo dispone di una propria UI e tramite essa può anche ottenere informazioni sullo stato dei job o accedere ai dati ospitati nei nodi di storage. • SE (Storage Element): la capacità di storage del cluster supera i 30 TB. L’utente che voglia utilizzare parte di tale disponibilità può farlo tramite questi nodi, con la mediazione delle UI. Gli SE gestiscono la memoria a disposizione come se fosse un unica risorsa e tramite meccanismi automatici per la gestione distribuita di file e directory permettono l’accesso ai dati indipendentemente dalla loro locazione fisica. • IS (Install Server ): questi nodi sono adibiti a repository di software, in particolare delle immagini del sistema operativo in uso sui nodi, e semplificano notevolmente l’installazione el’aggiornamento di tali sistemi I nodi interni, come suggerisce il nome, non sono raggiungibili dall’esterno. Benchè siano raggruppati in due sole tipologie rappresentano la maggior parte dei nodi del cluster. Abbiamo: • WN (Worker Node): sono i nodi che eseguono fisicamente i job sulle proprie risorse locali. Le caratteristiche dei WN sono variegate, sia in termini di potenza di calcolo che di hardware a disposizione, e riflettono l’andamento evolutivo del cluster. Sono presenti computer biprocessori Intel Pentium III, nodi più recenti equipaggiati con processori Intel Xeon Quad Core e sono in fase di inserimento 10 nuovi nodi con ben 8 core e 16 GB di RAM: questi ultimi, una volta in funzione, rappresenteranno quasi un terzo della potenza di calcolo dell’intero cluster. • FS (File Server ): sono i nodi di storage, equipaggiati con sistemi RAID per la gestione di array di dischi che permettono l’archiviazione di grandi quantità di dati. 1.5. IL CLUSTER INFN DI PERUGIA 25 Rete I nodi sono interconnessi da una LAN di tipo Ethernet con topologia a stella a due livelli. Il primo livello è costituito da uno switch principale, da cui si diramano le connessioni verso gli swtich del secondo livello. I criteri di organizzazione della rete dipendono dall’intensità del traffico, dalle capacità delle interfacce dei nodi e dalla loro disposizione fisica. La connettività a Internet è garantita dai nodi di frontiera, che solitamente dispongono di due interfacce di rete, una verso l’interno del cluster e l’altra verso la rete dipartimentale, che è collegata direttamente all’esterno. Le politiche di accesso sono gestite tramite il firewall dipartimentale. Una notevole caratteristica del cluster è l’utilizzo di reti nascoste e della tecnologia VLAN. Per sopperire alla carenza di IP pubblici, infatti, si è deciso di porre i nodi interni in una rete nascosta; questo ha richiesto delle modifiche al middleware che, dopo essere state testate con successo in ambito locale, sono state incluse nel middleware ufficiale INFN ed utilizzate in molti altri siti INFN-grid. Lo standard 802.11Q, conosciuto come Virtual LAN (VLAN), è stato impiegato nella ristrutturazione dell’intera rete dipartimentale. Esso permette di collegare macchine appartenenti a sottoreti diverse come se fossero sulla stessa rete locale, o di dividere un singolo segmento di rete in più sottoreti. Il cluster potrà beneficiare di questa caratteristica in quanto potenzialmente ogni computer raggiunto dalla rete dipartimentale è associabile alla rete nascosta del cluster ed utilizzabile nei momenti di inattività per incrementare la potenza di calcolo. 1.5.2 Problemi emergenti Nel corso degli anni il cluster si è espanso sia in termini di risorse che di utilizzatori. Come detto in precedenza, si sono aggiunti man mano diversi nodi e all’utenza locale già variegata si è aggiunta l’utenza della grid. Oltre a creare problemi dal punto di vista della disposizione fisica delle macchine, questo ha portato inevitabilmente al sorgere di complicazioni organizzative dovute all’eterogeneità dell’hardware e alle diverse necessità degli utenti. In particolare si possono evidenziare difficoltà dovute a: • Diritti d’utilizzo • Caratteristiche ibride Diritti d’utilizzo È logico pensare che i gruppi locali che hanno dato vita al cluster condividendo i propri strumenti di calcolo si aspettino se non di trarne vantaggio 26 CAPITOLO 1. CLUSTER COMPUTING almeno di non esserne penalizzati. È necessario garantire loro la possibilità di disporre delle proprie risorse quando ne abbiano la necessità; questo non è facilmente conciliabile con la natura condivisa del cluster, che al momento di una richiesta potrebbe già essere occupato per intero da altri job. Riservare un certo numero di macchine per l’uso esclusivo di un gruppo non può essere considerata una soluzione: nei periodi di scarsa attività questi nodi sottoutilizzati rappresenterebbero uno spreco di risorse non tollerabile. Una parte importante nell’affrontare il problema spetta al batch system, che è stato oggetto di numerosi studi, anche locali, per ottimizzare l’utilizzo dei nodi tenendo conto delle necessità degli utenti. Il prototipo oggetto di questa tesi mira a raffinare ulteriormente questo equilibrio. Caratteristiche ibride Gli utenti della grid possono avere necessità diverse in termini di dotazione software dei diversi nodi, per quanto riguarda sistema operativo, librerie, applicativi, ecc. Questo è vero particolarmente per le macchine che si desidera mettere a disposizione della grid-INFN: è infatti richiesto che siano equipaggiate esclusivamente con il sistema operativo Scientific Linux CERN. I job dei gruppi locali potrebbero però avere necessità diverse: per gestire questo problema si è stabilito che i gruppi decidano autonomamente la percentuale di nodi da destinare all’impiego in grid e quelli da riservare per l’uso locale. Questa separazione ha dato vita alla cosiddetta “ibridazione” del cluster, i cui nodi non hanno caratteristiche omogenee ma variabili a seconda della destinazione d’uso. Ciò ha portato a dover dotare il cluster di più punti d’ingresso, i nodi User Interface prima descritti, uno per ogni tipologia d’utenza, e a complicare la logica del batch system, che deve accettare job da più sorgenti. Soprattutto è stato inevitabile suddividere le macchine in classi di utenza e dotare ogni macchina di un diverso ambiente d’esecuzione in base alla classe di appartenenza. Anche questa suddivisione delle risorse può portare a un uso non ottimale delle stesse. I nodi riservati per un certo utilizzo, con un ambiente operativo specifico per i job di una determinata utenza, non sempre possono essere impiegati per eseguire job di altri utenti nei periodi di inattività, in quanto questi job potrebbero essere incompatibili con l’ambiente d’esecuzione installato sui nodi in oggetto. La figura 1.6 mostra un esempio semplificato delle situazioni indesiderabili che potrebbero venirsi a creare. Si potrebbe pensare di cambiare dinamicamente la classe di appartenza dei nodi in base ai bisogni contingenti, ma questo compito non è banale e comporta come minimo il riavvio della macchina, se su di essa sono installati più sistemi operativi ognuno dei quali offre un diverso ambiente d’esecuzione. 1.5. IL CLUSTER INFN DI PERUGIA 27 Figura 1.6: Esempio di uso sub-ottimale a causa del partizionamento delle risorse del cluster. I nodi sono suddivisi in due classi per accogliere altrettante tipologie di job tra loro incompatibili. La componente di RMS raccoglie le richieste tramite due code separate e distribuisce il carico in accordo alla distinzione in classi. In periodi di scarso tasso di sottomissione di job di classe 2 i nodi adibiti all’esecuzione di quest’ultimi non possono essere impiegati per l’altra classe di job restando di fatto inattivi, mentre potrebbero essere sfruttati per i job di classe 1 in coda. Il prototipo in discussione tenta di risolvere le difficoltà sopra esposte mediante il ricorso alla virtualizzazione. Il paragrafo seguente espone i concetti basilari di questa tecnologia e spiega come può essere d’aiuto nella pratica. 28 CAPITOLO 1. CLUSTER COMPUTING Capitolo 2 Virtualizzazione 2.1 Introduzione In ambito informatico per virtualizzazione si intende genericamente l’astrazione di una risorsa fisica attraverso un’interfaccia logica che ne nasconde i dettagli implementativi. Un esempio noto è la memoria virtuale: questa tecnica permette di estendere la memoria centrale del computer (RAM), che solitamente viene vista come un unico spazio di memoria contigua, utilizzando parte della memoria di massa (hard disk o altri dispositivi di storage, come memorie flash), organizzata in blocchi non contigui e funzionante secondo principi del tutto diversi. In questo caso la risorsa fisica, la memoria di massa, è virtualizzata in quanto il sistema la utilizza come se fosse memoria centrale benché le due cose abbiano ben poco in comune in termini di organizzazione e di modalità di accesso. Il capitolo elenca alcune delle più note tipologie di virtualizzazione esistenti, focalizzando poi l’attenzione sulla virtualizzazione nota come “machine virtualization” e sull’implementazione impiegata localmente, XEN. Soprattutto viene mostrato come può essere usata per risolvere con successo i problemi elencati al termine del capitolo precedente. 2.2 Tipologie di virtualizzazione Il termine “virtualizzazione” è attualmente molto in voga e a volte se ne abusa, specie per dare maggiore attrattiva a un certo prodotto commerciale. Questa sezione descrive in breve cosa può realmente essere inteso come “virtualizzazione”; il concetto basilare è che una risorsa si può definire virtualizzata se si fornisce ad essa un accesso logico indipendente dalla struttura fisica. 29 30 2.2.1 CAPITOLO 2. VIRTUALIZZAZIONE Virtualizzazione di applicazioni Questo tipo di virtualizzazione consiste nel compilare un’applicazione in un linguaggio indipendente, detto genericamente byte-code. Il computer in cui verrà eseguita l’applicazione dovrà fornire un ambiente d’ in grado di tradurre il byte-code in istruzioni eseguibili direttamente dal processore locale, il cosiddetto linguaggio macchina. Questo ambiente d’esecuzione è noto a volte come “macchina virtuale”, da non confondere con le macchine virtuali di cui si parlerà tra breve. La virtualizzazione di applicazioni astrae quindi l’ambiente operativo di una macchina, permettendo a una stessa applicazione di essere eseguita da diversi sistemi operativi e perfino da processori con un diverso set di istruzioni, se si ha a disposizione la macchina virtuale appropriata. L’esempio più conosciuto di questo tipo di virtualizzazione è il byte-code prodotto dai compilatori per il linguaggio di programmazione Java. Anche Microsoft ha adottato questo approccio: la famiglia di linuaggi .NET, infatti, viene compilata in un linguaggio intermedio detto CIL (Common Intermediate Language) che viene eseguito da un ambiente noto come CLR (Common Language Runtime). 2.2.2 Virtualizzazione di rete La virtualizzazione di rete consiste nella possibilità di riferirsi a risorse di rete senza utilizzare la loro reale locazione fisica. Un esempio possono essere le reti VPN (Virtual Private Network ), che permettono di collegare tramite Internet computer molto distanti tra loro e farli comunicare come se facessero parte di una rete locale; un altro esempio è la tecnologia VLAN, a cui si è accennato prima, che permette di creare sottoreti virtuali su uno stesso segmento di rete fisico. 2.2.3 Virtualizzazione dei dispositivi di storage Questa tipo di virtualizzazione è in grado di fornire uno spazio di storage virtuale combinando le capacità di più dispositivi fisici; questo spazio è poi suddividibile in sezioni logiche, dette volumi, su cui è possibile creare un file system normalmente utilizzabile. Le più note implementazioni sono probabilmente la tecnologia RAID (Redundant Array of Independent Disks) o i file system AFS (Andrew File System) e GFS (Global File System). 2.3. MACCHINE VIRTUALI 2.2.4 31 Virtualizzazione di sistemi Meglio definibile con il termine inglese “machine virtualization” o “server virtualization”, questo tipo di virtualizzazione consiste nell’eseguire intere macchine virtuali, con differenti sistema operativo e applicazioni, su uno stesso sistema hardware. Per permettere ciò deve esistere uno strato intermedio che regoli l’accesso alle risorse fisiche da parte delle diverse macchine logiche, o virtuali, detto Virtual Machine Monitor (VMM). È questa la categoria di virtualizzazione su cui si focalizza questo capitolo ed è forse ciò a cui immediatamente si pensa quando si sente il termine “virtualizzazione”. Nei paragrafi seguenti verrano esaminati nel dettaglio i concetti di macchina virtuale e VMM. 2.3 Macchine virtuali L’idea di virtualizzare interi sistemi operativi tramite un’interfaccia software al livello fisico risale agli anni 70’. Fu nel 1974, infatti, che Gerald J. Popek e Robert P. Goldberg scrissero un articolo in cui diedero la prima definizione di macchina virtuale e VMM e gettarono le basi teoriche della virtualizzazione. I due ricercatori analizzarono i requisiti che l’architettura di un sistema di calcolo deve avere per poter essere virtualizzato; benché si riferissero a sistemi di terza generazione, costruiti con i primi circuiti integrati, l’analisi che fecero può essere considerata valida anche per i moderni sistemi di quarta generazione, dotati di microprocessori ad alto grado di integrazione. Il VMM viene definito come un software in esecuzione sulla macchina reale che ne ha il completo controllo delle risorse hardware. Esso crea degli ambienti d’esecuzione, detti macchine virtuali (VM), che forniscono agli utenti l’illusione di un accesso diretto alle risorse della macchina fisica. La definizione che fu data di macchina virtuale è la seguente: Un duplicato software di un computer reale nel quale un sottoinsieme statisticamente dominante di istruzioni del processore virtuale viene eseguito nativamente sul processore fisico. Questo significa in pratica che la maggior parte dell’interazione tra macchina virtuale e processore dovrebbe essere permessa senza nessuna mediazione del VMM; esso interviene, come si vedrà tra breve, solo per quelle istruzioni che modificherebbero lo stato della macchina e l’assegnazione delle risorse hardware. 32 CAPITOLO 2. VIRTUALIZZAZIONE 2.3.1 Caratteristiche e architettura VMM Il VMM gestisce le risorse hardware e le esporta presso le macchine virtuali facendo sembrare loro di averne l’uso esclusivo. Esso deve possedere tre caratteristiche principali: • Equivalenza: Gli effetti dell’esecuzione di un programma attraverso il VMM devono essere identici a quelli dello stesso programma eseguito direttamente sulla macchina originale, ad eccezione al più del tempo d’esecuzione dovuto all’overhead del VMM e alla ridotta disponibilità di risorse. • Efficienza: L’ambiente virtuale deve essere efficiente. La maggior parte delle istruzioni eseguite all’interno di tali ambienti deve essere eseguita direttamente dal processore reale senza che il VMM intervenga; questo si traduce in un degrado minimo delle prestazioni. • Controllo delle Risorse: Il controllo delle risorse hardware deve essere di esclusiva competenza del VMM, senza interferenze da parte delle VM. Il VMM tipicamente è composto di diversi moduli: • Il dispatcher, il cui compito è quello di intercettare le istruzioni sensibili eseguite dalle VM e lasciare il controllo ai moduli preposti a gestire la situazione. • L’allocator, che si preoccupa di fornire alle macchine virtuali le risorse necessarie evitando i conflitti, allo stesso modo di come farebbero le componenti di un sistema operativo nell’amministrazione dei processi. • L’interpreter, che si rende necessario in quanto le macchine virtuali non possono avere accesso diretto alle risorse fisiche e non conoscono lo stato dell’hardware reale, ma solo quello del loro ambiente virtuale. Le istruzioni che fanno riferimento alle risorse sono simulate dall’interpreter in modo da riflettere la loro esecuzione nell’ambiente delle macchine virtuali. Si possono individuare due tipologie di VMM, in base alla collocazione nell’ambiente della macchina fisica: • Il VMM di tipo 1 è posto immediatamente sopra l’hardware ed dispone di tutti i meccanismi di un normale kernel o sistema operativo in quanto a gestione delle memoria, delle periferiche e del processore; in 2.3. MACCHINE VIRTUALI 33 più implementa i meccanismi di gestione delle macchine virtuali. Le macchine virtuali eseguite al di sopra del VMM dispongono di un proprio sistema operativo e sono dette macchine “guest”. Lo schema di un VMM di tipo 1 è mostrato in figura 2.1 (a). • Il VMM di tipo 2 è un normale processo in esecuzione nell’ambito di un sistema operativo detto “host”. Gestisce direttamente le macchine virtuali, che sono suoi sottoprocessi, mentre la gestione dell’hardware è demandata al sistema ospitante. La figura 2.1 (b) mostra un sistema con un VMM di tipo 2. (a) VMM di Tipo 1, posto immediatamente sopra l’hardware. (b) VMM di Tipo 2, ospitato nel sistema operativo host. Figura 2.1: Sistemi di virtualizzazione con VMM di tipo 1 e 2. 2.3.2 Requisiti di Popek-Goldberg Per comprendere appieno la definizione di macchina virtuale occorre essere a conoscenza di altri concetti, come gli stati di utilizzo di un processore e i gruppi in cui possono essere suddivise le istruzioni, che verrano esposti in questo paragrafo. La gran parte dei processori moderni prevedono il funzionamento in almeno due modalità operative: user-mode e supervisor-mode. Il set di istruzioni del processore (ISA) in user-mode è limitato a quelle che non presentano problemi di sicurezza, ad esempio che non modificano lo stato dei registri, mentre in supervisor-mode può essere eseguita qualunque istruzione del set. Il processore si trova in uno stato piuttosto che nell’altro in base al processo che lo sta utilizzando: tipicamente solo il kernel può utilizzarlo in supervisor-mode. Se il processore è in stato di user-mode ma tenta di eseguire un’istruzione che può essere eseguita solo in stato di supervisor-mode, viene generato un interrupt che deve essere gestito dal sistema operativo. Ai fini della virtualizzazione il set di istruzioni può essere suddiviso in tre sottoinsiemi, non necessariamente disgiunti: 34 CAPITOLO 2. VIRTUALIZZAZIONE • Privilegiate: sono le istruzioni eseguibili solo in supervisor-mode. • Sensibili: sono le istruzioni che modificano lo stato delle risorse del sistema, oppure dipendono da esse. • User: tutte le altre istruzioni. Popek e Goldberg, basandosi su questa classificazione, formularono una condizione sufficiente per la virtualizzazione di un sistema: la costruzione di un VMM è sempre possibile se il set di istruzioni sensibili del calcolatore è un sottoinsieme delle sue istruzioni privilegiate. In altre parole, un VMM può essere costruito per ogni computer sul quale tutte le istruzioni che modificano o dipendono dallo stato della macchina reale causano un interrupt se eseguite all’interno di una VM, che opera in usermode. L’interrupt cosı̀ generato può essere intercettato dal modulo dispatcher e opportunamente gestito. Tutte le istruzioni eseguibili in user-mode, invece, saranno eseguite dalla macchina virtuale direttamente sul processore fisico senza mediazione del VMM, che nemmeno se ne renderà conto. Se i requisiti di Popek-Goldberg sono rispettati, il VMM è in grado di soddisfare i tre requisiti di equivalenza, efficienza e controllo delle risorse sopra esposti. 2.3.3 Problemi delle architetture x86 L’architettura x86 è l’architettura di microprocessori ideata e prodotta inizialmente da Intel, a partire dalla fine degli anni ’70. Prende il nome del primo processore della famiglia, denominato 8086, a cui sono seguiti l’ 80286, l’80386 e l’80486; nei processori più recenti è stata cambiata la nomenclatura (si è passati dalle diverse versioni del Pentium all’attuale Core) ma non l’architettura. Nel corso degli anni anche i maggiori produttori concorrenti, come AMD, hanno fabbricato soprattutto processori x86-compatibili. Attualmente l’architettura x86 è la più diffusa nel campo dei PC, desktop e laptop, e in quello dei server di dimensioni medio-piccole, in pratica nei sistemi che più diffusamente si utilizzano per la virtualizzazione. Il grande limite di quest’architettura è che non rispetta la condizione di Popek-Goldberg: nel set d’istruzioni sono presenti istruzioni sensibili non privilegiate. Se una VM esegue un’istruzione sensibile non privilegiata, essa sfuggirà al controllo del VMM poiché l’istruzione non causerà un interrupt che possa essere intercettato e gestito: c’è il rischio concreto che le VM interferiscano con il VMM nell’interazione con le risorse fisiche, portando al mancato rispetto dell’essenziale requisito del controllo esclusivo delle risorse 2.4. TIPOLOGIE DI VIRTUALIZZAZIONE DEI SISTEMI 35 da parte del VMM. Per sopperire a questa mancanza sono state sviluppate tecniche che consentono in qualche modo di intercettare anche queste istruzioni potenzialmente dannose e che permettono quindi di virtualizzare anche architetture x86, con impatti più o meno negativi sulle performance. Il paragrafo seguente mostrerà le principali tipologie di virtualizzazione dei sistemi, comprese alcune di queste teniche. 2.4 Tipologie di virtualizzazione dei sistemi Lo scopo della virtualizzazione dei sistemi è quello di condividere in modo trasparente le risorse hardware della macchina fisica tra i sistemi operativi guest, di far comunque eseguire loro più istruzioni possibili direttamente sul processore senza interazione del VMM e di risolvere potenziali cause di malfunzionamenti dovute alle eventuali mancanze dell’architettura nei confronti dei requisiti di Popek-Goldberg. Le principali metodologie di virtualizzazione sono di seguito elencate. 2.4.1 Virtualizzazione a livello del kernel In questa tipologia le funzionalità per la virtualizzazione sono offerte direttamente dal normale kernel del sistema operativo. Le macchine virtuali cosı̀ create possono avere ognuna il proprio file-system, ma condividono il kernel del sistema operativo host. Lo svantaggio di questo approccio è che possono essere avviate macchine virtuali con un solo tipo di sistema operativo e che un eventuale falla di sicurezza nel kernel si ripercuoterebbe su tutte le VM. 2.4.2 Virtualizzazione completa Questo approccio prevede la completa simulazione software delle risorse hardware. Per far questo ogni istruzione eseguita dalle VM deve essere intercettata e, se è sensibile, tradotta a runtime per mezzo di meccanismi software detti “binary-translation”. Il VMM è tipicamente di tipo 2, ovvero un processo eseguito all’interno dell’ambiente del sistema operativo host. Il controllo di tutte le istruzioni permette di aggirare i limiti delle architetture x86 ma provoca inevitabilmente un degrado consistente delle prestazioni. 2.4.3 Para-virtualizzazione Questa tecnologia tenta di migliorare la scarsa efficienza della virtualizzazione completa pur continuando a supportare le architetture x86. Per far ciò 36 CAPITOLO 2. VIRTUALIZZAZIONE si avvale di un VMM di tipo 1, detto hypervisor, che gestisce direttamente le risorse hardware e ne offre alle VM un interfaccia software simile a quella di un sistema operativo. L’interazione tra VM e hypervisor avviene tramite speciali chiamate di sistema, dette “hypercalls”, che vanno a sostituire le “supercalls” utilizzate nei comuni sistemi operativi dalle applicazioni che richiedono l’accesso all’hardware; le istruzioni non sensibili invece vengono eseguite dalle VM sul processore fisico, senza l’intervento del VMM. Da quanto detto è evidente che i sistemi guest devono essere opportunamente modificati per utilizzare queste chiamate; per contro la virtualizzazione completa permette di eseguire sistemi operativi non modificati. Questo svantaggio è compensato dalle ottime prestazioni, appena al di sotto degli stessi sistemi non virtualizzati. 2.4.4 Virtualizzazione hardware Dal 2005 Intel e AMD hanno cominciato a dotare alcuni dei processori da loro prodotti di estensioni specifiche per gestire alcuni aspetti della virtualizzazione direttamente in hardware. Queste tecnologie, la VT di Intel e la Pacifica di AMD, implementano parzialmente nel processore complessi meccanismi per la gestione delle istruzioni sensibili non privilegiate o per la traduzione degli indirizzi di memoria delle VM in indirizzi fisici, funzioni che solitamente spettano al VMM. Piuttosto che essere considerato una tipologia a se stante, si può dire che il supporto hardware alla virtualizzazione estende le tecnologie già esistenti; in particolare, su macchine dotate di questi processori, si possono para-virtualizzare anche sistemi operativi non modificati. Questo apre la porta della virtualizzazione con buone performance anche ai sistemi a codice sorgente chiuso e quindi non modificabili, come quelli della famiglia Windows. 2.4.5 Emulazione L’emulazione non è una tipologia di virtualizzazione, ma poiché i due termini a volte vengono usati scambievolmente è bene conoscerne le affinità e le differenze. Anche l’emulazione permette di eseguire diverse macchine virtuali su un sistema operativo host, fornendo un’interfaccia software verso le risorse fisiche. A differenza della virtualizzazione, l’emulazione non ha lo scopo di eseguire più operazioni possibili nativamente sul processore fisico; al contrario è certo che tutte le istruzioni saranno controllate ed eventualmente tradotte prima di essere eseguite. Questo permette di eseguire anche ambienti compilati per architetture diverse da quelle della macchina host, ad esempio di 2.5. XEN 37 eseguire sistemi operativi e applicazioni compilati per architetture PowerPc 1 su processori x86 e viceversa; in pratica un’istruzione di un architettura può essere convertita in una o più istruzioni equivalenti di un’altra architettura e poi eseguita. La virtualizzazione invece non prevede questa eventualità, ma i sistemi operativi guest devono essere compilati per la stessa architettura della macchina fisica ospitante. Tra i prodotti per l’emulazione più noti si possono ricordare QEMU, in ambiente Linux, e Microsoft Virtual PC, in ambiente Windows. 2.5 Xen Xen è un sistema di para-virtualizzazione opensource nato nel 2003 e giunto attualmente alla sua terza versione. L’idea alla base di Xen è l’utilizzo di un sistema operativo host, detto Domain 0 o Dom0, oltre al tradizionale hypervisor, il quale resta comunque la componente più vicina all’hardware. Il Dom0, esso stesso virtualizzato, fornisce le funzioni per gestire i sistemi operativi guest, detti Unprivileged Domains o DomU, ed è l’unico che dialoga con l’hypervisor e collabora con esso nella gestione delle risorse fisiche; i DomU accedono all’hardware solo tramite particolari driver virtuali forniti dal Dom0. A partire dalla fine del 2006 Xen è in grado di ospitare come guest anche sistemi operativi non modificati, se il processore della macchina fisica possiede le estensioni per il supporto alla virtualizzazione di cui si è parlato precedentemente. Il capitolo spiega più nel dettaglio le funzionalità di ogni componente e mostra le potenzialità di Xen in termini di performance. 2.5.1 Hypervisor L’hypervisor di Xen è responsabile per lo scheduling della CPU e il partizionamento della memoria tra le macchine virtuali in esecuzione su di esso. Cosı̀ come farebbe un sistema operativo con i processi, l’hypervisor sospende e riavvia in modo trasparente le macchine virtuali; inoltre le VM non possono accedere direttamente alla memoria centrale ma possono utilizzarla solo tramite i servizi forniti dall’hypervisor. Tutte le altre perifiche di I/O non sono note all’hypervisor. Al momento dell’avvio della macchina il bootloader carica 1 PowerPC è la principale architettura per microprocessori concorrente all’x86. È stata creata nel 1991 dall’alleanza Apple-IBM-Motorola, conosciuta come AIM. Attualmente la diffusione dei processori PowerPC su macchine commerciali è in diminuzione, mentre è la più utilizzata in settori come quello delle console (Sony Playstation 3 e Nintendo Wii sono equipaggiate con processori basati su architettura PowerPC). 38 CAPITOLO 2. VIRTUALIZZAZIONE l’hypervisor che, dopo aver riservato per se una minima porzione di memoria e aver inizializzato le strutture dati per la gestione della virtualizzazione, lascia il controllo al Dom0. 2.5.2 Domain 0 Come Domain 0 possono essere utilizzati sistemi operativi Linux, NetBSD o Solaris opportunamente modificati; i sistemi GNU/Linux sono i più diffusi, anche localmente. Il Dom0 non è strutturalmente diverso dalle altre macchine virtuali, ma riveste un ruolo molto importante, quello di fornire loro l’accesso alle risorse hardware non gestite direttamente dall’hypervisor; il Dom0 accede quindi a queste risorse, tipicamente le periferiche di rete e di storage, senza intermediazione dell’hypervisor e tramite i comuni device drivers. Questo permette di sfruttare l’ampia selezione di device drivers sviluppati per il kernel di Linux e nello stesso tempo di semplificare notevolmente il lavoro dell’hypervisor. Per permettere l’utilizzo dell’hardware ai DomU, il Dom0 include anche due particolari driver di backend, che virtualizzano le periferiche di rete e i dispositivi a blocchi, detti Network Backend Driver e Block Backend Driver : è attraverso questi strumenti che il Dom0 svolge le sue funzioni di intermediario tra i DomU e le risorse fisiche. 2.5.3 Domain U Tutte le macchine virtuali controllate dall’hypervisor, ad eccezione del Dom0, sono dette Domain U. Come DomU possono essere utilizzati gli stessi sistemi operativi validi per il Dom0 con l’aggiunta di sistemi operativi non modificati se la macchina è in grado di offrire la virtualizzazione hardware. I sistemi operativi dei DomU svolgono autonomamente le funzioni di scheduling dei processi e di gestione della memoria nelle risorse a loro assegnate dall’hypervisor. Per quanto riguarda l’accesso alle periferiche di I/O i DomU si servono di speciali driver di frontend, che rappresentano le controparti nel dialogo con i driver di backend del Dom0. La comune gestione delle periferiche attraverso interrupt, operata dai sistemi operativi con accesso diretto all’hardware, viene sostituita da un meccanismo ad eventi che vengono segnalati al corretto DomU. In questo modo l’hypervisor può catturare gli interrupt provenienti dalle periferiche hardware e generare gli eventi di cui un determinato DomU è in attesa, come ad esempio la presenza di dati da poter leggere su un socket. Le immagini dei sistemi operativi guest possono essere ospitate su un’ampia varietà di supporti visti dai domU come dispositivi a blocchi virtuali (VBD). Essi possono essere ricavati da: 2.5. XEN 39 name = "DomU1" #quantità di memoria da assegnare a DomU1 memory = 1024 #numero di CPU virtuali vcpu = 2 #immagine del kernel modificato kernel = "/boot/vmlinuz-2.6.16-1-xen" #ip da assegnare all’interfaccia di rete virtuale vif = [ ’ip=192.168.1.10’ ] #dispositivi a blocchi virtuali disk = [ ’phy:/dev/iscsi_02,hda2,w’,’phy:/dev/iscsi_01,hda1,w’ ] #dispositivo virtuale contenente il root file system root = "/dev/hda2 ro" Tabella 2.1: File di configurazione per la definizione di un DomU. • Dispositivi Fisici: partizioni fisiche ospitate da un dispositivo a blocchi. • File: immagini di file system su file. • LVM: volumi logici. • NFS: file system forniti come export NFS. I DomU sono definiti attraverso comuni file di testo che, attraverso un preciso formato, permettono di specificare le caratteristiche della macchina da creare. Un esempio è fornito in tabella 2.1. 2.5.4 Demoni e strumenti di gestione La gestione dell’ambiente virtuale viene effettuata attraverso una serie di demoni 2 e programmi che devono essere eseguiti sul Domain 0 e che permettono l’interazione con l’hypervisor. La figura 2.2 dà una visione d’insieme dell’architettura di Xen, incluse le componenti di cui si parlerà in questo paragrafo. Tra di esse la principale è il demone xend. Xend ha il compito di fungere da tramite tra l’amministratore del sistema e l’hypervisor che ne gestisce a più basso livello l’allocazione delle risorse. Esso fa uso della libreria libxenctrl per dialogare con lo speciale driver privcmd che rappresenta l’interfaccia di 2 In ambienti UNIX col termine demone (deamon) ci si riferisce ai processi di sistema in esecuzione non interattiva che offrono servizi e funzioni di gestione. 40 CAPITOLO 2. VIRTUALIZZAZIONE comunicazione attraverso il quale il Dom0 presenta all’hypervisor le richieste sottomesse dall’amministratore. Queste richieste vengono effettuate attraverso l’applicazione a riga di comando xm, che consente di creare, spegnere, riavviare, distruggere e monitorare le macchine virtuali. Figura 2.2: Schema dell’archittetura di Xen Ad esempio, nella creazione di un domU, l’amministratore prima specifica i parametri della VM da creare visti nel precedente paragrafo; poi, attraverso l’invocazione del comando “xm create”, ordina a xend di comunicare all’hypervisor le relative richieste di allocazione delle risorse e provvedere al caricamento del sistema operativo guest. Accanto xend vi è il demone xenstored che gestisce parte dello scambio di informazioni tra il Dom0 e i DomU e mantiene delle strutture dati necessarie per effettuare lo scambio dati da e verso i dispositivi di rete e a blocchi per conto dei DomU. La gestione dei dispositivi infatti avviene con la mediazione di quest’ultimo demone, responsabile della corretta gestione dei canali di comunicazione, detti event channel, che come detto sostituiscono gli interrupt con un meccanismo ad eventi. Lo scambio di dati vero e proprio da e verso i dispositivi avviene in modo asincrono e per mezzo di aree di memoria condivisa sotto l’arbitrio dell’hypervisor, che assicura l’isolamento degli spazi di memoria delle VM. 2.5.5 Performance Sebbene non esistano benchmark 3 universalmente accettati per la valutazione delle prestazioni delle tecnologie di virtualizzazione, si può affermare che 3 Il termine benchmark è usato per indicare un insieme di applicazioni di test volte a valutare le prestazioni dei sistemi di calcolo in determinati ambiti. 2.6. APPLICAZIONE DELLA VIRTUALIZZAZIONE 41 devono essere tenuti in considerazione due aspetti fondamentali: • Impatto minimo: il tempo d’esecuzione di un programma di test in una macchina virtuale deve avvicinarsi quanto più possibile al tempo che lo stesso programma impiega in un sistema non virtualizzato • Scalabilità: il degrado di performance deve aumentare in proporzione lineare rispetto all’incremento del numero di macchine virtuali. Ciò è sinonimo di un’equa distribuzione delle risorse tra le macchine virtuali e un overhead dovuto alla gestione delle macchine praticamente trascurabile. Il gruppo di ricerca di Xen ha effettuato alcuni test per valutare le prestazioni di un ambiente GNU/Linux virtualizzato tramite Xen in paragone con lo stesso ambiente non virtualizzato e con altre tecnologie di virtualizzazione; sono state prese in considerazione situazioni ad alto tasso di utilizzo di CPU e RAM, altre con frequenti operazioni di I/O (tipicamente accessi ripetuti ad un database) e altre che contemplano entrambi i casi (ad esempio la compilazione del kernel, che utilizza intensamente la CPU ma esegue anche molte operazioni di lettura e scrittura su file). I risultati, mostrati in figura 2.3, evidenziano che in situazioni di utilizzo intensivo della CPU la differenza tra applicazione nativa e virtualizzata è quasi impercettibile, mentre per le operazioni di I/O il programma virtualizzato è penalizzato in misura inferiore al 5%. Inoltre le prestazioni di Xen sono notevolmente superiori a quelle di altri software di virtualizzazione. Il secondo aspetto, la scalabilità, è stato tenuto in gran considerazione dai progettisti di XEN: l’obiettivo dichiarato è quello di eseguire contemporaneamente fino a 100 macchine virtuali sulla stessa macchina fisica. I test effettuati a questo riguardo hanno rilevato che il tempo di calcolo dei programmi di test in molti casi cresce linearmente all’aumentare del numero di macchine virtuali: è il comportamento ottimale. È chiaro quindi che le tecnologie di para-virtualizzazione, e Xen in particolare, sono sufficientemente efficienti per essere utilizzate in ambienti dove le alte prestazioni sono una condizione irrinunciabile, quello dei cluster e delle griglie computazionali. 2.6 Applicazione della virtualizzazione La virtualizzazione offre molti vantaggi. Questo paragrafo ne mostra i principali e spiega come possono essere utilizzati nell’ambiente del cluster locale. 42 CAPITOLO 2. VIRTUALIZZAZIONE Figura 2.3: Risultati di alcuni test di benchmark effettuati dall’Università di Cambrige. Vengono comparati un sistema Linux non virtualizzato (L), un sistema virtualizzato con Xen (X) e sistemi virtualizzati con altri due software molto popolari, VMware Workstation (V) e User Mode Linux (U). Il test SPEC INT2000 utilizza intensivamente la CPU, con rare operazioni di I/O: il valore riportato è il punteggio assegnato dal benchmark. Un altro test ha riguardato il tempo di compilazione del kernel di Linux. Il terzo test, OSDB-OLTP, è realtivo alla valutazione delle performance di database, ovvero operazioni orientate all’I/O: il risultato è espresso in tuple accedute o modificate al secondo. L’ultimo test, SPEC WEB99, riguarda la prontezza del sistema nel fornire servizi di web server: il valore indicato è il massimo numero di connessioni simultanee supportate. 2.6.1 Vantaggi della virtualizzazione Unitamente alle buone prestazioni, la virtualizzazione dei sistemi è di grande aiuto per un’amministrazione flessibile e un pieno uso delle risorse. Sono formalizzati di seguito i settori in cui la virtualizzazione è un gradino sopra al tradizionale utilizzo diretto della macchina fisica. Consolidamento Spesso i moderni calcolatori sono più performanti di quanto necessiti un singolo ambiente operativo. La virtualizzazione, eseguendo più sistemi operativi sulla stessa macchina, permette di utilizzarne completamente le risorse. Questo si traduce in una riduzione dei costi: per espandere le potenzialità del proprio parco macchine si può sfruttare meglio quanto si ha a disposizione anziché acquistarne di nuove. Isolamento Per fornire servizi poco affidabili o pubblici possono essere predisposte apposite VM che, grazie ai meccanismi della virtualizzazione, saranno eseguite in un ambiente del tutto separato, garantendo la sicurezza del resto del sistema. 2.6. APPLICAZIONE DELLA VIRTUALIZZAZIONE 43 Controllo delle risorse Ad ogni macchina virtuale si possono assegnare risorse in base a precisi criteri. Ciò evita che alcune applicazioni possa sfruttare eccessivamente CPU, memoria od altro a discapito di altre applicazioni che vedrebbero la propria funzionalità ridotta. Test Tramite la virtualizzazione possono essere predisposti ambienti di test, anche distribuiti, senza dotarsi di hardware aggiuntivo. Inoltre le applicazioni possono essere testate per più sistemi operativi, tra quelli che possono essere ospitati dalle VM. Facilità d’amministrazione L’implementazione di una macchina virtuale richiede molto meno sforzi da parte degli amministratori. Inoltre le macchine virtuali possono essere fermate, messe in pausa, riavviate o addirittura clonate su altre macchine fisiche senza dover interrompere il funzionamento della macchina reale. Ciò consente di utilizzare la virtualizzazione per implementare meccanismi di fail-over o di bilanciamento del traffico molto più efficaci rispetto alla semplice replicazione hardware. 2.6.2 Ambienti virtuali Un ambiente d’esecuzione è tipicamente costituito da un sistema operativo e da una collezione di librerie, programmi e servizi di sistema volti all’espletamento di particolari funzioni richieste dall’utenza. Generalmente tutte queste componenti devono essere installate e configurate manualmente dagli amministratori. Come detto in precedenza, i job sottomessi al cluster necessitano di diversi ambienti d’esecuzione, che devono essere tutti forniti in qualche modo dal cluster. La soluzione adottata inizialmente è stata quella di suddividere le macchine in classi, ognuna delle quali mette a disposizione un certo ambiente. La difficoltà nel modificare l’ambiente installato in una macchina rende questa suddivisione piuttosto statica e rende difficile al batch system bilanciare i carichi di lavoro in base alle necessità contingenti. La virtualizzazione viene d’aiuto tramite la definizione di ambienti d’esecuzione virtuali, che è un altro dei concetti chiave di questa tesi. Un ambiente virtuale deve essere inizialmente configurato come un normale d’ambiente d’esecuzione, ma può poi essere eseguito su tutte le macchine fisiche che supportano la virtualizzazione, con l’ulteriore vantaggio della quasi completa 44 CAPITOLO 2. VIRTUALIZZAZIONE indipendenza dallo strato hardware; possono anzi essere definiti alcuni parametri fisici della macchina virtuale che ospiterà questo ambiente, come il numero di CPU virtuali, la quantità di RAM o lo spazio disco. Gli ambienti virtuali beneficiano inoltre di tutti i vantaggi della virtualizzazione descritti nel paragrafo precedente. La realizzazione di un ambiente virtuale in Xen avviene tramite l’installazione di un sistema operativo e dei pacchetti software necessari in un file immagine 4 ; questo file può essere eventualmente replicato in una partizione, in uno share NFS o in uno degli altri dispositivi a blocchi virtuali supportati da Xen. Nel file di configurazione di Xen vanno invece definiti i parametri dell’hardware virtuale. La coppia file immagine - file di configurazione identifica l’ambiente virtuale ed è sufficiente a Xen per avviare una o più macchine virtuali in grado di offrire tale ambiente. 2.6.3 Applicazione locale Un ambiente virtuale semplifica notevolmente l’amministrazione degli ambienti operativi, in quanto basta creare il file immagine e il file di configurazione una volta per tutte e replicarli su tutte le macchine che si desidera mettano a disposizione tale ambiente. Nel caso locale si può pensare di definire un ambiente virtuale per ogni classe di utenza e rendere ogni ambiente avviabile da più macchine fisiche del cluster. Ovviamente tutte le macchine impiegate dovranno disporre di una tecnologia di virtualizzazione; localmente, com’è intuibile, è stato scelto Xen. In base alle necessità ogni macchina fisica può rendere disponibili uno o più ambienti virtuali, della stessa classe o di classi diverse, ed è quindi in grado di accogliere contemporaneamente job di classi incompatibili o comunque di accettare un carico di lavoro superiore. Per modificare la destinazione d’uso di una macchina basta avviare o interrompere l’ambiente o gli ambienti virtuali che si desidera che la macchina offra o meno in quel momento. Per permettere alle macchine virtuali cosı̀ avviate di interagire con il batch system, l’ambiente virtuale deve includerne il componente client nella sua dotazione software. In questo modo quando una macchina viene avviata in risposta a una certa necessità questo componente notifica al batch system la disponibilità di un nuovo nodo, pronto ad accogliere job di una determinata classe. Dal punto di vista del batch system, quindi, i nodi non sono più le macchine fisiche ma le macchine virtuali; una macchina fisica potrà dunque 4 A titolo esemplificativo, nei sistemi basati su distribuzioni Debian questa operazione si realizza semplicemente grazie al tool debootstrap. 2.6. APPLICAZIONE DELLA VIRTUALIZZAZIONE 45 ospitare più di un nodo. Questo non fa nessuna differenza per il batch system, che anzi vede “nascere” dinamicamente le risorse di cui ha bisogno. Questo meccanismo dà una risposta valida ai problemi esposti nel capitolo precedente: • Diritti d’utilizzo: grazie agli ambienti virtuali è possibile soddisfare almeno parzialmente tutti gli utenti anche nei momenti di maggior carico. Se ad esempio si desidera mandare in esecuzione un job anche se tutte le risorse sono già impegnate, è sufficiente avviare una macchina virtuale della classe di quel job su una macchina fisica a scelta, preferibilmente quella con minor numero di altre macchine virtuali già attive. Naturalmente tutti i job ospitati dalle VM della macchina selezionata e il job in oggetto aumenteranno il loro tempo di esecuzione, a causa della condivisione delle risorse fisiche tra un maggior numero di ambienti virtuali. In ogni caso, se non utilizzato a sproposito, questo modo di agire può portare a un utilizzo più efficiente delle potenzialità del cluster; non è inoltre da sottovalutare l’aspetto psicologico: un utente che vede attivare il proprio job poco dopo averlo sottomesso è certamente più soddisfatto di uno che lo vede attendere per ore. • Ibridazione: come ampiamente discusso, grazie agli ambienti virtuali è possibile variare dinamicamente gli ambienti d’esecuzione supportati da una stessa macchina fisica. Aumentando o diminuendo le macchine virtuali di una certa classe disponibili complessivamente nel cluster è possibile rispondere in tempo quasi reale al variare del tipo di job correntemente in coda presso il batch system. 2.6.4 Ruolo del prototipo La virtualizzazione è già in parte utilizzata nel cluster, in particolare per implementare meccanismi di alta affidabilità. Sono virtualizzati ad esempio i nodi più importanti, come il Computing Element e le User Interface, in modo che in caso di guasti della macchina fisica tali servizi possano essere ripristinati in breve tempo avviando il relativo ambiente virtuale presso un altro nodo. La gestione dinamica degli ambienti virtuali come sopra descritta, invece, non è ancora attiva. Il motivo fondamentale è che necessiterebbe di un massiccio intervento umano, per monitorare costantemente lo stato del batch system e delle risorse del cluster e avviare e distruggere appropriatamente le macchine virtuali necessarie al momento; è infatti auspicabile che il tempo di reazione ai cambiamenti di stato sia il più breve possibile. Sarebbe necessario 46 CAPITOLO 2. VIRTUALIZZAZIONE un sistema che gestisca automaticamente un pool di Domain 0 attivi sulle macchine fisiche, e su di essi attivi una serie di ambienti virtuali (Domain U), in risposta alle richieste e le disponibilità contingenti: questo permetterebbe di migliorare notevolmente i tempi di soddisfacimento delle richieste di servizi, eliminando la necessità di interventi umani. È proprio questo l’obiettivo che si pone il prototipo oggetto della tesi: realizzare uno strumento che sia in ogni momento a conoscenza dello stato del batch system e dei Dom0 sotto il suo controllo e che reagisca in tempi brevi alle richieste in arrivo creando o distruggendo ambienti virtuali, con lo scopo di ottimizzare l’utilizzo delle risorse e il grado di soddisfacimento delle richieste. Questo strumento sarà a tutti gli effetti un componente middleware aggiuntivo, che affianca e facilita il lavoro del batch system. Il capitolo che segue mostra l’architettura generale del prototipo che, come si vedrà, è altamente flessibile ed estendibile e può essere utilizzato per una grande varietà di scopi, anche in ambienti diversi dal cluster e non relazionati a tecnologie di virtualizzazione; questa parte era stata già realizzata precedentemente alla stesura di questa tesi. Il capitolo ancora seguente mostra invece i moduli aggiunti per permettergli di svolgere in pratica il compito per cui è stato ideato, il gestore dinamico di ambienti virtuali. Capitolo 3 Virtdom 3.1 Introduzione La virtualizzazione può essere di grande aiuto all’interno di un cluster, permettendo di slegare la macchina fisica e il suo hardware dagli ambienti di esecuzione che essa fornisce e di sfruttarne appieno la potenza di calcolo; da sé, però, non è sufficiente, in quanto servirebbe comunque un costante intervento umano per regolare l’avvio e la distruzione degli ambienti virtuali in base allo stato del batch system, che cambia piuttosto frequentemente. Si è pensato quindi di dare vita ad un componente middleware che, tenendo in considerazione le necessità contingenti del batch system e lo stato di occupazione dei nodi, avvii finchè possibile macchine virtuali adatte ad accogliere i job in coda o distrugga quelle non più necessarie. Questo componente è perciò un gestore di ambienti o domini virtuali, da cui deriva il nome che gli è stato assegnato, Virtdom (Virtual Domains). Lo sviluppo di Virtdom ha avuto inizio alla fine del 2007; quando è stato dato inizio a questo lavoro di tesi era già pronta una prima versione della struttura portante del prototipo e ne erano state testate con successo le funzionalità basilari. Questo capitolo mostra l’architettura generale del prototipo, le iniziali scelte implementative, il protocollo di comunicazione, le modalità di collezione delle informazioni e di definizione delle politiche decisionali 1 1 Nel corso di questo lavoro di tesi sono state effettuate piccole modifiche rispetto alla versione iniziale. Quello che è presentato è il prototipo nel suo stato attuale, incluse quindi tali modifiche. 47 48 CAPITOLO 3. IL PROTOTIPO: VIRTDOM 3.2 Architettura del prototipo L’applicazione ha la tipica struttura client-server dei programmi middleware: abbiamo una componente centrale, detta manager, e una componente distribuita, composta dai client in esecuzione su ogni macchina da monitorare. La relazione tra manager e client è del tipo master-slave, ovvero il manager è su un livello logico gerarchicamente superiore, è l’unico autorizzato a prendere decisioni e i client sono subordinati alle sue richieste. La figura 3.1 mostra l’architettura generale del prototipo. Figura 3.1: Schema generale di Virtdom Nel dettaglio i compiti del manager sono: • Interrogare i client. • Concentrare le informazioni. • Prendere decisioni in base allo stato dei client. • Ordinare ai client l’esecuzione di comandi. Il manager è a conoscenza delle informazioni esportate da ogni client e le organizza in apposite strutture dati. La logica decisionale è implementata configurando appositi trigger che scattano ciclicamente o all’accadere di determinati eventi. I trigger analizzano le informazioni in possesso del manager e determinano quali azioni devono essere eseguite dai client; a questo scopo 3.2. ARCHITETTURA DEL PROTOTIPO 49 al manager sono note le azioni che ogni client è in grado di compiere. La figura 3.2 mostra la struttura e le funzionalità del manager. Figura 3.2: Schema del manager I compiti dei client invece sono: • Raccogliere informazioni sensibili dalla macchina locale • Eseguire comandi per conto del manager Ogni informazione che il client è in grado di prelevare è detta proprietà. Una proprietà è definita dal valore d’interesse e da un’etichetta descrittiva: ad esempio si può specificare la proprietà “cpucount” che indica il numero di cpu della macchina. Le proprietà non hanno limitazioni di tipo: possono essere valori numerici, stringhe, valori di verità. Le modalità di raccoltà delle proprietà sono di competenza del client: tipicamente ci si serve di programmi o script che ritornano i valori richiesti; in riferimento all’esempio precedente, per ottenere il numero di cpu della macchina in un sistema Linux basta creare uno script in un qualsiasi linguaggio di scripting che esegua il comando cat /proc/cpuinfo | grep processor | wc -l 2 2 Il comando stampa il contenuto del file speciale /proc/cpuinfo, contenente informazioni sui processori a disposizione della macchina, e ne conta il numero di righe contenenti la parola ‘‘processor’’. 50 CAPITOLO 3. IL PROTOTIPO: VIRTDOM e ne restituisca l’output. Le proprietà sono aggiornate periodicamente da ogni client e mantenute in attesa delle richieste del manager. I client sono anche in grado di eseguire azioni dietro richiesta del manager. A questo scopo sono definiti e messi a disposizione del client una serie di comandi, che pure in questo caso sono solitamente script o programmi, già esistenti o creati ad hoc. La figura 3.3 mostra nel dettaglio il funzionamento di un client. Figura 3.3: Schema del client Un concetto chiave è che sia le proprietà e i comandi per i client che la logica decisionale per il manager sono totalmente configurabili, flessibili ed estendibili in base all’ambiente. Proprietà, comandi e trigger sono considerabili a tutti gli effetti dei plugin, ovvero dei moduli separati che aggiungono al programma principale ogni tipo di funzionalità. Virtdom mette a disposizione i meccanismi di comunicazione, di concentramento delle informazioni e di gestione dei plugin, che vanno definiti tramite appositi file di configurazione, ma nel suo stato iniziale non è in grado di compiere nessuna azione. Il prototipo deve perciò essere esteso ed adattato in base alle necessità dell’ambiente; inoltre, mentre il manager è unico, ogni client può essere configurato per fornire diverse proprietà ed eseguire diverse azioni in base al suo ruolo specifico. Il lavoro oggetto di questa tesi riguarda proprio l’estensione del prototipo, attraverso la scrittura di appositi script e trigger, per permettergli di assolvere 3.3. SCELTE IMPLEMENTATIVE 51 a un compito specifico, ovvero il monitoraggio di un cluster e la gestione appropriata di ambienti virtuali all’interno dello stesso. 3.3 Scelte implementative Diverse peculiarità del prototipo sono rese possibili dal linguaggio di programmazione utilizzato e dal metodo scelto per lo scambio di messaggi a basso livello tra manager e client. Il linguaggio in cui è stato scritto Virtdom è Python. Il pacchetto software utilizzato per il sistema di comunicazione è il Toolkit Spread. Il paragrafo analizza le motivazioni di queste scelte evidenziando le caratteristiche di Python e di Spread che si sono rivelate particolarmente utili nello sviluppo del prototipo. 3.3.1 Linguaggio di programmazione Python è un linguaggio di programmazione orientato agli oggetti pseudocompilato. I programmi scritti in Python per essere eseguiti devono prima essere convertiti in bytecode, che è appunto il risultato della pseudocompilazione del codice sorgente. Un particolare programma detto interprete si occuperà di tradurre il bytecode in liguaggio maccnhina e quindi eseguirlo. Le caratteristiche basilari che hanno portato alla scelta di Python sono: • Facilità di apprendimento • Codice leggibile e ben manutenibile • Buona efficienza, nonostante sia interpretato • Gran numero di librerie in Python e wrapper altri linguaggi 3 per librerie scritte in • Ampia diffusione; è incluso di default in tutte le distribuzioni Linux • Supporto, anche se non particolarmente avanzato, al multi-threading Alcune caratteristiche particolari e risultate utili, se non indispensabili, nel corso dello sviluppo, sono i tipi di dato strutturati disponibili nativamente (come liste e dizionari) e alcune funzioni proprie del linguaggio, come le funzioni eval, exec o compile. Una breve descrizione di queste caratteristiche aiuterà a comprendere con maggior precisione il funzionamento del prototipo. 3 Nel linguaggio informatico un wrapper è un oggetto che incorpora e rende disponibili in un certo linguaggio funzionalità messe a disposizione da librerie già esistenti 52 CAPITOLO 3. IL PROTOTIPO: VIRTDOM Liste e dizionari In Python una lista non è nient’altro che quello che nei linguaggi tradizionali viene chiamato array: una collezione ordinata di oggetti accessibili tramite un indice. Python rende semplice inserire in una lista oggetti complessi o eterogenei e mette a disposizione funzioni native per l’ordinamento o la ricerca. Un dizionario è invece una collezione non ordinata di oggetti. Ogni elemento è identificato univocamente da una chiave, generalmente una stringa, anziché da un indice. è perciò possibile accedere a un elemento tramite la sua chiave, senza conoscerne la posizione; l’implementazione efficiente dei dizionari, basata su funzioni hash, fa sı̀ che l’accesso avvenga in tempo costante. Anche i dizionari possono contenere elementi eterogenei. Nel codice del prototipo si fa un uso estensivo di liste e dizionari, specie nelle strutture dati del manager: ad esempio è presente una lista di tutti i client, oppure ogni client ha un dizionario con la lista delle proprietà. In quest’ultimo caso è evidente la potenzialità di questi tipi di dato: in un’unica struttura sono contenute proprietà di tipi diversi (interi, stringhe, ma anche a loro volta liste o dizionari) accessibili tramite l’etichetta assegnata ad ogni proprietà. Funzioni eval, exec e compile La funzione compile riceve in input una stringa e restituisce pseudocodice direttamente eseguibile dall’interprete sotto forma di un oggetto detto code object. La funzione eval riceve in input una stringa o un code object e la valuta come se fosse un espressione python: se ad esempio riceve una stringa che rappresenta una lista restituisce la lista stessa. La funzione exec riceve in input una stringa o un code object e la considera come se fosse codice python, eseguendolo tramite l’interprete e restituendone l’output. Sia la funzione eval che la exec hanno due parametri opzionali, locals e globals, due dizionari che rappresentano il namespace locale e quello globale, in pratica l’elenco delle variabili visibili a livello di funzione e quello delle variabili e delle funzioni dell’intero modulo. Questo permette di richiamare porzioni di codice separate facendole lavorare nello stesso namespace della funzione chiamante, o parte di esso. Queste tre funzioni, come si vedrà, sono fondamentali per il meccanismo dei triggers. 3.3. SCELTE IMPLEMENTATIVE 3.3.2 53 Sistema di comunicazione Lo Spread Toolkit consiste di un demone server che implementa le funzioni di gestione dei messaggi e di una libreria da utilizzarsi per la realizzazione delle applicazioni client. Il demone spread gestisce lo scambio di messaggi a basso livello, l’ordinamento del flusso e l’affidabilità della consegna, la divisione dei client in gruppi e l’invio in multicast. La libreria offre un set di funzioni che permette alle applicazioni di collegarsi a una rete spread, entrare o uscire dai gruppi e ovviamente scambiarsi messaggi con diverse priorità e affidabilità. L’API della libreria è scritta in C ma esistono wrapper per diversi altri linguaggi, tra cui il Python. In una rete spread possono esistere più demoni server e ogni client deve essere registrato presso uno di essi; nel nostro caso si è utilizzato un solo demone, presso la macchina su cui è in esecuzione il manager. Ogni client ha associato un nome spread lungo al massimo 32 caratteri: il nome completo del client, utilizzato per l’invio dei messaggi, sarà dato dall’unione del nome del client e dell’hostname del server, nel formato #nome_client#hostname_server Dal punto di vista del prototipo la comunicazione tra manager e client è gestita tramite una connessione spread: entrambi sono quindi client rispetto al demone spread. Una caratteristica che si rivela molto utile per il prototipo è quella già accennata della divisione dei client spread in gruppi: questo permette di differenziare i client in Virtdom in base alle caratteristiche della macchina su cui sono in esecuzione o a una qualunque altra classificazione. I messaggi possono quindi essere inviati in modalità multicast, a tutti i componenti di un determinato gruppo, oltre che, ovviamente, in modalità, point-to-point, ad un singolo client. Ogni client può appartenere a più di un gruppo; il manager apparterrà invece a tutti i gruppi definiti. Messaggi spread Come già accennato per ogni messaggio si può specificare l’affidabilità di consegna e l’ordinamento. Nel nostro ambiente i messaggi sono inviati con l’attributo di alta affidabilità: questo significa che in caso di perdite di messaggi sarà il demone spread ad occuparsi della ritrasmissione. Inoltre si richiede che i messaggi siano inviati con un ordinamento totale. Questi due parametri garantiscono la consegna di tutti i messaggi nel corretto ordine. I messaggi spread sono divisi in due tipologie: messaggi Membership e messaggi Regular. I messaggi Membership hanno il formato descritto in tabella 3.1 e vengono generati in occasione di eventi come con l’entrata o l’uscita da un gruppo da parte di un client o di una disconnessione dalla rete 54 CAPITOLO 3. IL PROTOTIPO: VIRTDOM spread. Il tipo dell’evento è specificato da una costante numerica indicata nel campo reason. Una caratteristica interessante è che si può decidere se un client spread riceverà o meno questi messaggi. Nel nostro caso solo il manager è interessato alla ricezione dei messaggi membership, per conoscere lo stato dei gruppi e dei singoli client, mentre i client possono ignorarli senza conseguenze, benché è importante che li generino. Campi Tipo Significato MEMBERSHIP MESSAGE intero Id messaggio group stringa Nome gruppo reason intero Id evento extra stringa Nome client Tabella 3.1: Rappresentazione dei campi rilevanti per il prototipo di un messaggio di tipo Membership I messaggi Regular hanno il formato indicato in tabella 3.2. Nel campo groups va indicato il destinatario del messaggio, che può essere uno o più nomi di client spread, uno o più nomi di gruppi o una combinazione dei due. Il campo message contiene il contenuto informativo del messaggio, il cosiddetto “payload”. Il campo msg type è un intero a 16 bit e contiene la categoria del messaggio in relazione alla particolare applicazione. È utilizzato per realizzare in pratica il protocollo di comunicazione: il mittente tramite esso indica il significato del contenuto del campo message, mentre il ricevente lo utilizza per estrarne in modo appropriato le informazioni. Campi Tipo Significato REGULAR MESSAGE intero Id messaggio groups lista Destinatari message stringa Dati msg type intero Codice sender stringa Mittente Tabella 3.2: Rappresentazione dei campi rilevanti per il prototipo di un messaggio di tipo Regular 3.4 Protocollo di comunicazione Il protocollo di comunicazione tra manager e client è stato costruito attraverso la definizione di tipologie di messaggi, differenziabili attraverso l’apposito campo (msg type) nei messaggi regular di spread. La semantica del campo dati (message) dipenderà appunto dalla tipologia del messaggio. Le costanti numeriche che identificano il tipo di ogni messaggio sono definite in un apposito file. Sia per il manager che per i client l’operazione preliminare è la connessione alla rete spread e la dichiarazione dell’appartenenza a uno o più gruppi; i messaggi saranno poi inviati o ricevuti attraverso un oggetto spread detto MailBox. 3.4. PROTOCOLLO DI COMUNICAZIONE 3.4.1 55 Messaggi del manager Il set di messaggi del manager comprende le seguenti categorie: • Messaggi per la richiesta di proprietà. Rientrano in questa categoria i messaggi identificati dalle costanti GETPROP e FETCHPROP. Se il campo dati è vuoto il messaggio indica la richiesta della lista delle proprietà, altrimenti il campo dati conterrà l’etichetta della proprietà di cui si richiede il valore. La differenza tra i due messaggi è che FETCHPROP forza l’aggiornamento della proprietà prima dell’invio. • Messaggi per ordinare l’esecuzione di comandi. Questa categoria comprende il solo messaggio EXECUTE, nel cui campo dati sarà indicato il nome del comando da eseguire e gli eventuali parametri; se il campo dati è vuoto indica invece la richiesta della lista dei comandi a disposizione del client. • Messaggi per il controllo della connessione dei client. I messaggi di questa categoria permettono al manager di ordinare al client di eseguire determinate azioni sulla sua connessione. Abbiamo il messaggio STOP, per forzare la disconnessione del client, il messaggio RCON, per ordinare la reinizializzazione della connessione, il messaggio RJOIN, per ordinare al client di riassociarsi al gruppo indicato nel campo dati 3.4.2 Messaggi del client Solitamente ad ogni messaggio del manager corrisponde un messaggio di risposta del client, detto messaggio di callback. I messaggi di callback rientrano nelle seguenti categorie, speculari a quelle del manager: • Valori delle proprietà richieste. I messaggi di questa categoria sono identificati dalle costanti PROPLIST, per inviare la lista delle proprietà esportate dal client, PROPVAL, per restituire il valore della proprietà richiesta, e PROPERR, in caso di richiesta del valore di una proprietà mancante. • Risultato dell’esecuzione di un comando. Appartengono a questa categoria i messaggi EXECLIST, con la lista dei comandi che il client è in grado di eseguire, e EXECRET, che ritorna i risultati dell’esecuzione di un comando o il suo codice d’errore. • Messaggi informativi. In questa categoria si trovano i messaggi inviati in risposta a messaggi di controllo da parte del manager e servono soprattutto per la diagnostica di eventuali problemi. 56 3.5 CAPITOLO 3. IL PROTOTIPO: VIRTDOM Struttura del client I due compiti principali del client sono tenere aggiornata una lista di proprietà ed eseguire comandi per conto del manager. Questo paragrafo spiega nel dettaglio come ogni client assolve a queste reponsabilità e le modalità di configurazione. La figura 3.4 mostra la struttura di un client, comprendente i moduli che verranno man mano descritti. Figura 3.4: Schema dettagliato di un client e dei suoi moduli. 3.5.1 Gestione file eseguibili Per raccogliere informazioni dal sistema ed eseguire comandi il client si appoggia a una collezione di file eseguibili, propri del sistema o creati ad hoc. Poiché il demone client è in esecuzione con pieni privilegi all’interno del sistema operativo è necessario limitare il suo raggio d’azione. Per gestire questo meccanismo il client è dotato di un apposito modulo, chiamato Runner, che indicizza tutti i file eseguibili presenti in una lista di cartelle indicata nel file di configurazione; l’esecuzione di un comando avviene tramite questo modulo, che è in grado di utilizzare solo gli eseguibili a lui noti. Il comando viene eseguito dal modulo tramite i metodi forniti dal namespace command del python; in particolare il metodo getoutput riceve in input il nome del comando e gli eventuali parametri, lo esegue nella shell del sistema e ne restituisce l’output sotto forma di stringa, che verrà utilizzato per 3.5. STRUTTURA DEL CLIENT 57 aggiornare il valore di una proprietà o restituire il risultato dell’esecuzione, in base allo scopo per cui è stato eseguito il comando. 3.5.2 Gestione proprietà Si è detto che una proprietà è un valore collegato a una etichetta, una stringa che ne indica il significato. Può essere utilizzato come proprietà un qualunque attributo del sistema prelevabile tramite gli eseguibili noti al modulo Runner; ad esempio, si è fatto prima riferimento al numero di cpu della macchina e allo script necessario per ottenere tale informazioni. Poichè tali attributi possono variare nel tempo (ad esempio la quantità di memoria RAM libera), deve essere previsto un meccanismo per prelevare periodicamente i valori aggiornati delle proprietà. Dal punto di vista del client una proprietà è quindi definita dalle seguenti componenti: • Etichetta descrittiva • Comando per ottenerne il valore, con eventuali parametri • Tipo di dato che la proprietà rappresenta • Intervallo di aggiornamento Il tipo di dato non è utile tanto al client, che memorizza tutti i valori sotto forma di stringa, cosı̀ come sono restituiti dal modulo runner, ma al manager, che quando riceve le proprietà è cosı̀ in grado di memorizzarle e utilizzarle nel corretto formato. Accanto ai tipi di dato tradizionali (intero, stringa, booleano, ecc.) è stato definito anche un tipo di dato fittizio, eval, che include tutti i tipi di dato complessi (liste, dizionari), espressi sotto forma di stringa, che l’istruzione eval è in grado di riportare al tipo di dato originario. Il tipo eval permette perciò lo scambio di tipi di dato complessi evitando al manager più o meno complesse operazioni di decodifica. I valori delle proprietà sono mantenuti dal client in un’apposito dizionario, pronti ad essere letti e inviati dietro richiesta del manager.Per permettere l’aggiornamento periodico dei lavori il client si serve di un altro modulo, ReaderDaemon, che viene eseguito in un thread separato e attiva un ciclo generico di esecuzione in base a quanti di tempo definibili arbitrariamente nel file di configurazione. 58 3.5.3 CAPITOLO 3. IL PROTOTIPO: VIRTDOM Comunicazione con il manager Il client ha un ruolo totalmente passivo nella comunicazione: esso resta infatti in attesa di ordini da parte del manager e l’invio di messaggi avviene esclusivamente in risposta a tali ordini. Fanno eccezione i messaggi di membership, che vengono inviati implicitamente quando il client compie azioni relative alla rete spread. La ricezione e l’invio di messaggi di risposta sono permessi al client da un terzo modulo, IFaceDaemon. Anche questo modulo è eseguito in un thread separato e periodicamente controlla l’oggetto MailBox alla ricerca di nuovi messaggi: se ne trova ne determina la categoria ed esegue l’operazione richiesta, al suo interno o attraverso gli altri moduli. Per l’invio di messaggi il modulo mette a disposizione un apposito metodo che riceve un messaggio come parametro e lo invia al manager. 3.5.4 Configurazione La configurazione del client avviene attraverso un file principale e uno o più file aggiuntivi e opzionali in cui vengono definite le proprietà. La struttura dei file segue lo standard dei file di inizializzazione, costituiti da sezioni e parametri. Nel file di configurazione principale deve essere presente la sezione “config” contenente le impostazioni di inizializzazione. Tutte le altre sezioni, nel file principale e negli altri file, sono interpretate come proprietà. Le informazioni sono estratte dai file attraverso appositi metodi forniti dai namespace del python che offrono funzionalità di parsing dei file di configurazione. La struttura del file principale di configurazione è la seguente: [config] exe_path = ... fetch_interval = ... user_properties = ... spread_daemon = ... spread_port = ... local_name = ... manager_name = ... groups = ... [proprietà] command = ... parameters = ... return_type = ... 3.6. STRUTTURA DEL MANAGER 59 ticks = ... Il parametro exe path definisce le directory contenenti i file eseguibili cche devono essere a disposizione del modulo runner. La definizione non è ricorsiva: le sottodirectory delle directory indicate devono essere incluse esplicitamente. Il parametro fetch interval specifica in secondi il quanto di tempo di base per l’aggiornamento delle proprietà. Il parametro user properties contiene il percorso di uno o più file di configurazione contenenti definizioni di proprietà. Benché si possano definire proprietà all’interno del file principale, questo permette di dividere in classi le proprietà accomunate logicamente. I parametri spread daemon e spread port indicano l’hostname della macchina su cui è in esecuzione il demone spread e la porta su cui esso è in ascolto. Il parametro local name indica il nome spread del client: solitamente è consigliabile farlo corrispondere all’hostname della macchina; manager name indica il nome spread del manager in esecuzione sulla rete al quale il client deve essere associato. Il parametro groups definisce i gruppi spread a cui il client deve richiedere l’appartenenza appena dopo essersi connesso alla rete spread. In ogni altra sezione del file principale, e per tutte le sezioni degli altri file, il nome della sezione è interpretato come etichetta di una proprietà. I parametri che seguono corrispondono alle altre tre componenti di una proprietà dal punto di vista del client prima descritte. Il parametro command indica l’eseguibile che permette di ottenere il valore della proprietà, mentre il parametro parameters specifica gli eventuali parametri da passare al comando. Il parametro return type indica il tipo di dato della proprieà. Il parametro ticks definisce il numero di quanti di tempo base che devono passare prima di aggiornare la proprietà: la frequenza di aggiornamento in secondi di una proprietà si ottiene quindi attraverso l’operazione ticks * fetch interval. 3.6 Struttura del manager I compiti del manager sono principalmente quelli di collezionare le proprietà dei client, prendere decisioni in base ed esse ed ordinare ai client l’esecuzione di azioni corrispondenti. Il paragrafo descrive nel dettaglio il funzionamento del manager e la sua configurazione.La figura 3.5 mostra le strutture dati e i moduli del manager che saranno ora descritti. 3.6.1 Collezione delle informazioni Il manager possiede apposite strutture dati per mantenere informazioni sui client e sul loro stato. La classe base utilizzata è chiamata ClientDomain, che rappresenta un singolo client. Questa classe contiene un dizionario con 60 CAPITOLO 3. IL PROTOTIPO: VIRTDOM Figura 3.5: Schema dettagliato del manager. tutte le proprietà del client e una lista con i nomi dei gruppi spread a cui il client appartiene. Nel manager è quindi definito un dizionario, chiamato clients, in cui le etichette sono i nomi dei client noti e i valori sono gli oggetti ClientDomain corrispondenti. Un secondo dizionario e chiamato groups, che fa corrispondere a ogni nome di gruppo spread la lista dei nomi di client appartenenti a quel gruppo; lo scopo di questo dizionario è ricavare rapidamente i client associati a un gruppo senza esaminare tutto il dizionario clients. Queste strutture dati vengono appropriatamente modificate in base agli eventi che si presentano sulla rete, come si vedrà nel paragrafo seguente, che esamina le modalità di comunicazione tra manager e client. 3.6.2 Comunicazione con i client A differenza dei client il ruolo del manager è attivo, in quanto genera ed invia messaggi regular per l’interrogazione e il controllo dei client. Il manager è l’unico che indica al demone spread la necessità di ricevere i messaggi di membership, che utilizza per controllare lo stato della rete e aggiornare le proprie strutture dati. Inoltre utilizza due moduli separati, Listener per la ricezione e Sender per l’invio. Il modulo Listener controlla periodicamente l’oggetto MailBox creato al momento della connessione alla rete spread in attesa di nuovi messaggi e se ne trova esegue le azioni corrispondenti. Se il messaggio è di membership il comportamento del manager è quello mostrato nel diagramma in figura. 3.6. STRUTTURA DEL MANAGER 61 I messaggi regular in entrata che allo stato attuale il manager è in grado di gestire sono solo quelli riguardanti le proprietà. Come si nota nel diagramma in figura, quando il manager viene a conoscenza di un nuovo client invia un messaggio di richiesta della lista delle proprietà. Quando il messaggio di callback viene ricevuto, le proprietà contenute nel messaggio vengono inserite nell’apposito dizionario delle proprietà contenuto nell’oggetto ClientDomain relativo al nuovo client. Quando il manager riceve invece un messaggio contenente il valore di una certa proprietà di un client, viene aggiornato il dato corrispondente nel dizionario delle proprietà. Il modulo Sender si occupa invece dell’invio di messaggi, fornendo appositi metodi per le diverse tipologie di messaggi. La gran parte dell’invio di messaggi avviene, come si vedrà, all’interno dei trigger. È possibile scegliere in fase di configurazione se l’invio di messaggi deve avvenire in modo immediato o periodicamente. Nel secondo caso il messaggio passato al modulo viene inserito in una coda FIFO, da cui i messaggi vengono estratti ed inviati a intervalli regolari; questo metodo è preferibile in quanto viene garantito un tempo minimo tra l’invio di un messaggio e l’altro, evitando di saturare la rete nei momenti di maggior traffico. Caduta del manager Una situazione particolare si viene a verificare nel caso in cui il manager venga temporaneamente a mancare. Quando questo accade i client proseguono nella loro attività di prelievo delle proprietà, senza la possibilità di accorgersi dell’evento. Quando il manager viene riattivato e si ricollega alla rete spread ha perso tutte le informazioni relative ai client. Per riprendere il controllo della situazione è previsto che al suo avvio il manager mandi un messaggio di tipo RJOIN in multicast a tutti i gruppi di cui è a conoscenza; in risposta gli eventuali client attivi usciranno e rientreranno nei relativi gruppi, causando messaggi di membership che il manager utilizzerà per ricostruire le proprie strutture dati. 3.6.3 Decisione: i trigger Il manager deve essere in grado di tenere costantemente sotto controllo lo stato dei client ed eseguire azioni in risposta a determinate situazioni o eventi. È stato perciò creato un potente meccanismo per definire ed attivare trigger che prendano decisioni in base allo stato delle risorse note al manager. I trigger non fanno parte del prototipo nel suo stato iniziale, ma vanno appositamente scritti in moduli separati ed aggiunti tramite i file di configurazione; 62 CAPITOLO 3. IL PROTOTIPO: VIRTDOM essi infatti dipendono fortemente dalle proprietà e dai comandi esportati dai client, che variano a seconda dell’ambiente d’utilizzo del prototipo. Un trigger consiste di due componenti fondamentali: • Una condizione, che ne determina o meno l’avvio. • Il trigger vero e proprio, che generalmente consiste di una serie di ulteriori valutazioni sullo stato delle risorse e l’invio di messaggi che ordinano ai client l’esecuzione di appropriati comandi. Per permettere al trigger di operare sulle strutture dati del manager pur facendo parte di un modulo separato sono di fondamentale importanza le funzionalità del python mostrate nel paragrafo. Tramite il metodo compile il manager, al suo avvio, precompila tutte le condizioni e i relativi trigger di cui viene messo a conoscenza dai file di configurazione, salvando i code object risultanti in apposite strutture dati. Per valutare la condizione di un trigger viene utilizzata la funzione eval, che ne restituisce il valore booleano. Se il valore risultante è vero il trigger viene eseguito tramite la funzione exec. Sia eval che exec ricevono in input i code object che il manager ha precedentemente prodotto e memorizzato e i dizionari locals e globals, appositamente costruiti in modo da contenere le informazioni in possesso del manager utili per l’esecuzione dei trigger. In particolare, il corpo del trigger, eseguito dalla funzione exec, è messo a conoscenza di tutte le strutture dati del manager, e gli viene messo a disposizione il modulo Sender, in modo che siano in grado di inviare messaggi ai client tramite i consueti meccanismi del prototipo. Un altra caratteristica fondamentale dei trigger è la loro modalità di attivazione, da specificare in fase di configurazione, che può essere periodica o conseguente a una modifica dello stato dei client. Il manager mantiene in due strutture dati separate i trigger di diversa tipologia. Per il primo caso è stato predisposto un modulo, TriggerDaemon, che periodicamente valuta le condizioni dei trigger interessati e, per ogni condizione verificata, esegue l’azione corrispondente. Nel secondo caso il meccanismo di valutazione ed eventuale esecuzione è svolto da un apposita funzione, che va richiamata del manager in tutte le occasioni che si verifica un cambiamento di stato, ovvero, allo stato attuale, in caso di entrata o uscita di un client da un gruppo, di disconnessione di un client dalla rete spread o di invio del valore di una proprietà da parte di un client. Il tipo di evento tipicamente va discriminato nella condizione del trigger: per permettere ciò nel dizionario locals passato alla funzione eval sono indicati il nome del client che ha causato l’evento, il gruppo di appartenenza, l’eventuale nome della proprietà e il tipo di evento, identificato da una costante numerica; nel dizionario globals sono presenti invece tutti i dati contenuti nelle strutture del manager. I trigger di questo 3.7. CONFIGURAZIONE DEL MANAGER 63 secondo tipo permettono perciò di eseguire azioni in immediata risposta a cambiamenti di stato, in modo da agire su valori di proprietà appena giunti e quindi certamente aggiornati; al contrario, i trigger del primo tipo agiscono su valori di cui non si conosce l’effettiva corrispondenza al reale stato delle risorse. 3.7 Configurazione del manager La configurazione del manager è molto simile a quella del client. Segue la stessa struttura, con una sezione “config” iniziale e un numero variabile di sezioni seguenti, interpretate tutte come trigger, che possono essere contenute nel file principale o in file aggiuntivi. Il modello del file principale di configurazione è il seguente: [config] spread_daemon = ... spread_port = ... local_name = ... groups = ... queued_sending = yes/no queued_sending_interval = ... triggers_eval_interval = ... user_triggers = ... [trigger] expr = {...} cmd = {...} on_update_check = yes/no ticks = ... I parametri spread daemon, spread port e local name hanno lo stesso significato descritto per i client. Il valore del campo local name dovrà corrispondere al valore del campo manager name nel file di configurazione di tutti i client sotto il controllo del manager. Il campo groups indica tutti i gruppi di cui si desidera che il manager abbia il controllo; come si è visto nel paragrafo questo elenco è particolarmente utile in caso di caduta del manager, in quanto è l’unica informazione sulla configurazione della rete spread che esso possiede al suo avvio. Gli attributi queued sending e queued sending interval indicano rispettivamente se si desidera che il manager utilizzi una coda FIFO per l’invio di messaggi e, in caso affermativo, l’intervallo di tempo in secondi tra un invio e il successivo. Il parametro triggers eval interval definisce il 64 CAPITOLO 3. IL PROTOTIPO: VIRTDOM quanto di tempo base, in secondi, per la valutazione dei trigger attivati su base temporale. L’ultimo campo, user triggers, specifica il percorso di uno o più file di configurazione contenenti definizioni di trigger. Ogni altra sezione è interpretata come un trigger. Il parametro expr indica la condizione che viene valutata per decidere se avviare o meno l’esecuzione del trigger. Tale parametro deve essere scritto in codice python ed essere un’espressione logica unitaria e correttamente interpretabile. Il campo cmd contiene il corpo del trigger, che può essere scritto direttamente nel file di configurazione o in un file separato. In quest’ultimo caso il campo deve contenere il percorso di tale modulo esterno preceduto dalla stringa “file:”. L’attributo ticks indica il numero di quanti di tempo basilari devono trascorrere per la valutazione del trigger; come per l’intervallo di aggiornamento delle proprietà di client, il valore dell’intervallo di valutazione dei trigger in secondi si ricava attraverso l’operazione ticks * triggers eval interval. Se il valore del campo ticks contiene un numero negativo, il trigger corrispondente non verrà mai valutato su base temporale. Il parametro on update check definisce invece se il trigger deve essere valutato o meno in seguito a cambiamenti di stato. 3.8 Test e considerazioni Durante e al termine della prima fase di sviluppo di Virtdom sono stati effettuati diversi test per verificare il corretto funzionamento del prototipo, sia in termini di affidabilità che di efficienza. Quest’ultimo paragrafo mostra alcuni risultati dei test ed espone ulteriori considerazioni. 3.8.1 Test Come ambiente di test è stato utilizzato quello che sarà meglio descritto nel prossimo capitolo. Si può dire brevemente che è costituito da un pool di Xen Domain-0, su uno dei quali è stato attivato il manager e sugli altri un numero variabile di client per ciascuno. I client non prelevavano nessuna proprietà dalla macchina locale, ma ne possedevano una fittizia costituita da 10Kb di caratteri random; sul manager era impostato un solo trigger, per prelevare costantemente tale proprietà da tutti i client ogni 10 secondi. La dimensione della proprietà è significativa in quanto spesso le proprietà comunemente utilizzate sono di gran lunga più piccole. Come strumento di monitor è stato usato un apposito script, in esecuzione sulla macchina dove era ospitato il manager, che prelevava costantemente, tramite gli strumenti forniti dal sistema operativo, i valori locali di utilizzo della rete, della cpu e della memoria. Durante i test si è cercato di ridurre al minimo qualunque altra 3.8. TEST E CONSIDERAZIONI 65 attività sulla macchina in esame, in modo che i valori ottenuti rispecchiassero quasi fedelmente il reale consumo di risorse da parte del prototipo. Nel primo test sono stati utilizzati complessivamente 300 client e il manager è stato configurato per inviare messaggi senza intervalli forzati tra l’uno e l’altro. La situazione è stata monitorata per 300 secondi. Il risultato è mostrato in figura 3.6. Figura 3.6: Test di comunicazione con 300 client senza l’uso di una coda FIFO. Vanno evidenziati i picchi in download di circa 3000 Kb/s: il client inviava i messaggi di richiesta delle proprietà a tutti i client quasi contemporaneamente e allo stesso modo giungevano le risposte. Il valore ottenuto è consistente con l’ambiente di test: 300 client che inviano insieme al manager un messaggio da 10Kb, per un totale di 3000 Kb/s. Il secondo test utilizzava invece 100 client, e il manager era impostato per inviare i messaggi tramite la coda FIFO, al ritmo di 10 al secondo. Anche in questo caso la situazione è stata monitorata per 30 secondi. Per questo test,invece, il valore in download non presenta picchi consistenti, ma si attesta intorno ai 100 Kb/s. Anche questo valore è consistente con l’ambiente creato: ipotizzando una risposta immediata dei client, al manager sarebbero giunte 10 messaggi da al secondo da 10Kb ciascuno, per un totale di 100 Kb/s, che è praticamente il valore medio ottenuto. Il grafico di questo test è mostrato in figura 3.7. Per effettuare test di scalabilità sono state mantenute le impostazioni del manager come nel secondo dei test precedenti, aumentando gradualmente il numero dei client e monitorando l’andamento per circa 5 minuti dopo ogni 66 CAPITOLO 3. IL PROTOTIPO: VIRTDOM Figura 3.7: Test di comunicazione con 100 client con l’utilizzo di una coda FIFO. incremento, effettuando poi la media dei valori ottenuti per ognuno degli intervalli. Si sono ottenuti cosı̀ i grafici dell’utilizzo medio delle risorse di rete, della CPU e della memoria RAM all’aumentare del numero dei client, mostrati nelle figure 3.8 (a), (b) e (c). I grafici mostrano come l’utilizzo delle risorse aumenti in modo praticamente lineare in relazione al numero dei client. Questo indica che la scalabilità del prototipo all’aumentare del numero delle risorse amministrate è buona, e che non ci sono evidenti debolezze o “colli di bottiglia” anche in una situazione piuttosto al limite. È interessante notare come il valore di utilizzo in upload si attesti ad un valore costante oltre i 100 client. Questo è perfettamente in sintonia con le impostazioni del manager, che genera e mette in coda le richieste di proprietà per tutti i client ogni 10 secondi, ma è in grado di inviarne al massimo 100 in questo intervallo (10 al secondo). 3.8.2 Considerazioni Nel corso dei test per il prelievo delle proprietà dai client è stato utilizzato un semplice trigger, cosı̀ definito: [trigger] expr = { len(manager.clients) != 0 } cmd = { sender.send_get_property() } on_update_check = no ticks = 10 3.8. TEST E CONSIDERAZIONI (a) Utilizzo CPU. 67 (b) Utilizzo RAM. (c) Utilizzo rete. Figura 3.8: Test di scalabilità: è mostrato l’aumento dell’utilizzo delle risorse da parte del manager all’aumentare del numero dei client. Questo trigger utilizza semplicemente il metodo send get property fornito dal modulo Sender, che, se richiamato senza parametri, richiede i valori di tutte le proprietà a tutti i client noti. La condizione indica che il trigger deve essere eseguito se c’è almeno un client attivo. Benché si sia detto che i trigger devono essere definiti in base all’ambiente d’esecuzione e allo scopo del prototipo, un trigger uguale o simile a questo è praticamente necessario in ogni situazione. Il manager infatti richiede automaticamamente solo la lista delle proprietà di un client, quando tale client si unisce alla rete spread per la prima volta, ma non è prevista una funzionalità di richiesta e aggiornamento delle proprietà nativamente, all’interno del manager. Se non si hanno a disposizione i valori delle proprietà, e non si aggiornano con una certa frequenza, il manager, e soprattutto i trigger, perdono il loro valore e la loro funzionalità. Il prossimo capitolo mostrerà come Virtdom è stato esteso per gestire macchine virtuali all’interno di un cluster, al servizio del batch system. Per far questo sono stati scritti e testati appositi script di prelievo delle proprietà, script di esecuzione di azioni per conto del manager e trigger. Il trigger sopra 68 CAPITOLO 3. IL PROTOTIPO: VIRTDOM definito è stato il primo ad essere aggiunto alla configurazione del manager. Capitolo 4 Stage 4.1 Introduzione 4.2 Ambiente di test 4.2.1 Code, tipi di VM e Dom0 4.3 Client: proprietà e azioni 4.4 Manager: trigger 4.5 Configurazione del batch system 4.6 Test 69 70 CAPITOLO 4. ESTENSIONE DEL PROTOTIPO Capitolo 5 Conclusioni TODO 71 72 CAPITOLO 5. CONCLUSIONI Ringraziamenti Thanks to... RIKKA 73 74 CAPITOLO 5. CONCLUSIONI Bibliografia [1] R. Buyya. High Performance Cluster Computing: Architectures and Systems, Volume I. Prentice Hall, 1999. [2] M. Baker et al. Cluster Computing White Paper. cs.DC/0004014, 2000. Arxiv preprint [3] G.F. Pfister. In search of clusters. Prentice-Hall, Inc. Upper Saddle River, NJ, USA, 1998. [4] BC Brock, GD Carpenter, E. Chiprout, ME Dean, PL De Backer, EN Elnozahy, H. Franke, ME Giampapa, D. Glasco, JL Peterson, et al. Experience with building a commodity intel-based ccNUMA system. IBM J. RES. DEV, 45(2):207–227, 2001. [5] H.W. Meuer. The TOP500 Project: Looking Back over 15 Years of Supercomputing Ex-perience. 2008. [6] J.J. Dongarra, H.W. Meuer, E. Strohmaier, and altri. TOP500 Supercomputer Sites. URL http://www. top500. org/.(updated every 6 months), 2008. [7] F. Cantini. Studio delle prestazioni di un batch system basato su torque/maui, 2007. [8] I. Foster. What is the Grid? A Three Point Checklist. Grid Today, 1(6):22–25, 2002. [9] I. Foster. The Grid: A new infrastructure for 21st century science. Physics Today, 55(2):42–47, 2002. [10] I. Foster, C. Kesselman, and S. Tuecke. The Anatomy of the Grid. [11] M. Baker, R. Buyya, and D. Laforenza. Grids and Grid technologies for wide-area distributed computing. 75 76 BIBLIOGRAFIA [12] I. Neri. Installazione, configurazione e monitoraggio di un sito INFNGrid., 2005. [13] Lcg project overview. [14] G.J. Popek and R.P. Goldberg. Formal requirements for virtualizable third generation architectures. Communications of the ACM, 17(7):412– 421, 1974. [15] M. Tim Jones. Virtual linux an overview of virtualization methods, architectures, and implementations. 2006. [16] S.N.T. Chiueh. A Survey on Virtualization Technologies. [17] R. Rose. Survey of System Virtualization Techniques. 2004. [18] B. Quetier, V. Neri, and F. Cappello. Selecting A Virtualization System For Grid/P2P Large Scale Emulation. Proc of the Workshop on Experimental Grid testbeds for the assessment of largescale distributed applications and tools (EXPGRID06), Paris, France, 19-23 June, 2006. [19] K. Adams and O. Agesen. A comparison of software and hardware techniques for x86 virtualization. Proceedings of the 12th international conference on Architectural support for programming languages and operating systems, pages 2–13, 2006. [20] J.S. Robin and C.E. Irvine. Analysis of the Intel Pentium’s ability to support a secure virtual machine monitor. Proceedings of the 9th conference on USENIX Security Symposium-Volume 9 table of contents, pages 10–10, 2000. [21] M.F. Mergen, V. Uhlig, O. Krieger, and J. Xenidis. Virtualization for high-performance computing. ACM SIGOPS Operating Systems Review, 40(2):8–11, 2006. [22] W. Huang, J. Liu, B. Abali, and D.K. Panda. Performance Computing with Virtual Machines. A Case for High [23] P. Barham, B. Dragovic, K. Fraser, S. Hand, T. Harris, A. Ho, R. Neugebauer, I. Pratt, and A. Warfield. Xen and the art of virtualization. Proceedings of the nineteenth ACM symposium on Operating systems principles, pages 164–177, 2003. BIBLIOGRAFIA 77 [24] B. Clark, T. Deshane, E. Dow, S. Evanchik, M. Finlayson, J. Herne, and J.N. Matthews. Xen and the art of repeated research. Proceedings of the Usenix annual technical conference, Freenix track, pages 135–144, 2004. [25] P.R. Barham, B. Dragovic, and K.A. Fraser. Xen 2002. 2003. [26] H.K.F. Bjerke. HPC Virtualization with Xen on Itanium. PhD thesis, Master thesis, Norwegian University of Science and Technology (NTNU), July 2005. [27] A. L. Lopez. Uso di macchine virtuali (XEN) per garantire servizi di Grid, 2006. [28] Xen 3.0 Users Manual, 2008. [29] Xen 3.0 Interface Manual for x86, 2008.