Analisi delle prestazioni
Si sono svolti alcuni test dell’applicazione
con diverse configurazioni per valutarne le prestazioni e
la scalabilità.
I risultati che vengono successivamente
riportati si riferiscono a prove effettuate sulle macchine
del lab3, su jdk1.2.2 per Windows NT.
L’obiettivo era valutare le prestazioni
di comunicazione del sistema e per questo si è cercato di
distribuire nel modo più uniforme possibile i componenti sulle
macchine. In particolare, visto anche i limiti di memoria
delle postazioni e la relativa pesantezza della JVM, si sono
posti i server utilizzati per una stessa prova su nodi diversi,
mentre per l’ultima prova, che vedeva variare il numero di
clienti, se ne sono posti al massimo due su uno stesso nodo.
Sempre nell’ottica di valutare gli effettivi
tempi di comunicazione, si trattava di neutralizzare il comportamento
della JVM riguardo al caricamento delle classi. Il suo comportamento
a default infatti prevede l’uso del JIT (Just In Time) Compiler,
cioè quando una classe viene caricata per la prima volta il
JIT trasforma il codice interpretato in codice macchina, che
sarà poi utilizzato successivamente. A livello di prestazioni
questo si traduce in un ritardo per ogni caricamento di una
nuova classe ed in una successiva ottimizzazione quando la
classe viene utilizzata in seguito.
Per questo le prove che abbiamo effettuato
sono state eseguite più volte mediando i risultati e tralasciando
la prima esecuzione.
Per valutare le prestazioni si sono
misurati i tempi necessari ad un client o ad un server per
eseguire una operazione. Si è fatto in modo di stampare su
console un messaggio in corrispondenza dell’inizio dell’operazione
e della fine della medesima, vista dallo stesso componente.
Si è fatto uso della classe java.text.SimpleDateFormat per
stampare l’ora corrente.
Come prima cosa si è voluto valutare
il tempo impiegato da un server per entrare in una rete all’aumentare
del numero di server presenti nella rete stessa.
Il grafico dei tempi ottenuto è il seguente
:
Come era da aspettarsi vista l’organizzazione
del sistema, tale operazione risulta non scalabile e presenta
un andamento pressoché lineare all’aumentare del numero dei
server. Infatti ogni nuovo server entrante mette in moto il
protocollo 2PC per garantire su tutti i server la consistenza
dell’ingresso ed inoltre deve contattare ogni server già presente
nel sistema per reperire le stanze dei giochi presenti su
ognuno di essi. Evidentemente queste operazioni hanno durata
dipendente dal numero di server connessi.
Si sono poi fatte prove per rilevare
le durate delle operazioni compiute dai clienti, anch’esse
al variare del numero di server connessi.
Si sono misurati i tempi di connessione
al sistema, di creazione di una partita e di invio di un messaggio
pubblico.
Il criterio con cui sono state scelte
tali operazioni è stato quello di sollecitare i server a compiere
azioni strutturalmente diverse. Infatti :
- La connessione di un nuovo utente comporta l’applicazione
del protocollo 2PC a livello MainServer
- La creazione di una partita comporta l’applicazione del
protocollo 2PC a livello RoomServer
- L’invio di un messaggio pubblico non presenta problemi
di consistenza e viene eseguita senza nessun coordinamento
preventivo
I grafici che illustrano i risultati
delle prove compiute sono i seguenti :
Come si può notare, le prime due operazioni
presentano una durata sostanzialmente lineare con il numero
di server connessi.
L’invio di un messaggio invece ha una
durata quasi costante, anche grazie alla struttura ad eventi
realizzata nel sistema. Non si ha comunque un andamento perfettamente
costante, come ci si potrebbe aspettare idealmente, perché
la presenza di più server comporta anche la presenza di più
thread (cfr. progetto) che quindi competono per acquisire
la CPU su uno stesso nodo.
L’ultima prova realizzata, a differenza
delle precedenti, ha valutato la durata di un’operazione compiuta
da un client al variare non del numero di server, ma di quello
di clienti presenti.
Ciò che si voleva verificare era la
ricercata scalabilità di questo aspetto, cioè di come il numero
di clienti connessi influenzi poco i tempi di esecuzione delle
operazioni.
Per fare questo si sono connessi due
server ed i clienti che entravano si connettevano alternativamente
all’uno e all’altro server. L’operazione che si è effettuata,
a titolo di esempio, è stata la creazione di una partita.
I tempi misurati sono rappresentati
nel seguente grafico :
Si può quindi dire che l’obiettivo,
almeno in parte, è stato raggiunto. Riguardo il lieve incremento
comunque presente valgono i ragionamenti fatti precedentemente
al riguardo.
Test di correttezza
Si sono realizzate anche delle prove
per valutare la correttezza dell’implementazione del protocollo
2PC. Si sono di fatto riprodotte tutte le situazioni di interferenza,
così come presentate nel progetto
con più server e più client connessi e si è riscontrato sempre
un corretto funzionamento.
|