Il nostro mini-cluster è composto da un computer principale,
denominato Marvin, e 15 Raspberry Pi 3 ®. Marvin funge da server:
ospita le pagine web che state leggendo e permette agli utenti di
collegarsi da remoto per utilizzare le sue funzionalità, mentre
i Raspberry, denominati yupana01,..., yupana15, sono accessibili solo
da Marvin. I dettagli dell'hardware utilizzato sono descritti nella
pagina Hardware all'interno
delle FAQ.
Se si dispone di abbastanza spazio e di attrezzature adeguate, la
configurazione hardware non è molto difficoltosa: come si
può notare
nella Gallery, è
sufficiente utilizzare un router/switch e connetere i Raspberry ad
esso con un cavo ethernet. I Raspberry Pi 3 sono equipaggiati con
ricevitori wireless e bluetooth (le versioni precedenti non ne erano
provvisti), dunque è possibile configurare anche un cluster non
cablato.
La configurazione software di ciascuna singola macchina
Sia su Marvin che sui Raspberry è installato il sistema
operativo Linux: per Marvin abbiamo scelto Debian 8 (Jessie), mentre i
Raspberry sono stati equipaggiati con il sistema operativo Raspbian,
derivato da Debian e adattato proprio alla specifica architettura dei
Raspberry.
Ciascuna macchina del cluster è in grado di compilare ed
eseguire programmi in parallelo usando il protocollo MPI per il
linguaggio di programmazione C. È stato dunque necessario
installare su ciascuna macchina il relativo compilatore. Su Marvin e
su ciascun Raspberry è stato sufficiente digitare il
comando
da terminale, con privilegi da amministratore. Si faccia attenzione al
fatto che tale comando dipende dalla versione del proprio sistema
operativo e dalla versione corrente di OpenMPI.
Successivamente all'esecuzione del suddetto comando, ciascuna macchina
è stata in grado di compilare ed eseguire (in parallelo) i
nostri programmi.
Come far comunicare ciascun elemento del cluster con gli altri
Per poter sfruttare appieno il cluster per la programmazione in
parallelo, è necessario che ogni macchina possa comunicare
liberamente con le altre. Infatti, senza un'adeguata configurazione,
ogni tentativo di accesso a ognuno dei nodi del cluster richiede
l'inserimento della password dell'utente. Pertanto è necessario
fare in modo che ciascun nodo sia accessibile in maniera automatica,
in modo da ridurre al minino i tempi di esecuzione del programma che
non siano legati alla complessità computazionale dello
stesso. A tale scopo è stata eseguita la procedura
descritta di seguito, che può essere velocizzata e resa
più efficiente, utilizzando il tool clusterssh (per
maggiori informazioni si può visitare il sito
web https://github.com/duncs/clusterssh/wiki),
che consente di aprire più connessioni ssh contemporaneamente
verso macchine diverse e avere un'unica finestra per lanciare lo
stesso comando su ciascuna macchina.
DA ESEGUIRE SU MARVIN
Ci si connette a Marvin e si aquisiscono i privilegi di
amministratore del sistema;
si crea l'utente "Mi Sun de Milan" su Marvin, con
username test-ina; ovviamente, i suddetti
username e nome esteso sono stati utilizzati solo per
produrre gli esempi che sono illustrati in questo ed in
altri mini-tutorial; tale utente è stato creato
temporaneamente e poi rimosso (anche perché è
assolutamente inadeguato per avere accesso alle risorse di
calcolo di un'università romana...);
si avvia una connessione multipla a tutti e 15 i Raspberry
tramite clusterssh (si apriranno 15 finestre di terminale e
una consolle per l'inserimento contemporaneo dei
comandi);
DA ESEGUIRE SU CIASCUN RASPBERRY
si aquisiscono i privilegi di amministratore del sistema
sui Raspberry;
si crea l'utente "Mi Sun de Milan" con
username test-ina su ciascun Raspberry;
si passa all'utente test-ina (che è stato
appena creato) con il comando
su test-ina
si genera la coppia di chiavi con il comando
echo -e "\n" | ssh-keygen -t rsa -P
""
si copia la chiave pubblica su un file temporaneo:
cp .ssh/id_rsa.pub
$(hostname)_tmp_id_rsa.pub
si copia il file appena creato su Marvin tramite
l'istruzione
scp *_tmp_id_rsa.pub Marvin:
DA ESEGUIRE SU MARVIN
all'interno della finestra di terminale con cui ci si
è connessi a Marvin si passa
all'utente test-ina digitando
su test-ina
si genera come in precedenza la coppia di chiavi con il
comando
echo -e "\n" | ssh-keygen -t rsa -P
""
si genera un unico file contente tutte le chiavi pubbliche
concatenando i file provenienti da ciascun Raspberry:
si copia il file contenente tutte le chiavi pubbliche su ciascun Raspberry:
scp Marvin:.ssh/authorized_keys
.ssh/
Nel
file add-prototype-user.txt
si può trovare lo storico delle operazioni realmente eseguite
su Marvin per la creazione e la configurazione di un utente "test", al
fine di effettuare le verifiche necessarie a controllare il buon
funzionamento della programmazione parallela sul mini-cluster.
Nell'immagine sottostante si può invece vedere cosa succede
quando ci si connette a tutti i nodi del mini-cluster
(contemporaneamente) usando clusterssh.
A questo punto, se tutto è andato a buon fine, da ogni nodo del
cluster ci si può connettere a qualsiasi altro nodo senza che
venga richiesta la password. In questo modo un programma che deve
essere eseguito in parallelo sul cluster (o su parte di esso),
è libero di scambiare informazioni da una macchina all'altra; i
tempi di esecuzione saranno dunque influenzati esclusivamente dalla
velocità della rete locale e dal tempo di esecuzione del
programma sui singoli processori.
Nel nostro mini-cluster ciascun utente viene equipaggiato, al momento
della sua creazione, di una cartella con alcuni file che consentono di
eseguire in parallelo un primo esempio elementare di programma. Per
poterne comprendere i meccanismi di funzionamento, non si deve fare
altro che seguire passo dopo passo il
corrispondente mini tutorial.