Struttura, metodi di gestione e configurazione dei dischi rigidi;
Il linguaggio di programmazione C;
Il Sistema Operativo Linux-Fedora installato, con relativo
utilizzo della shell bash attraverso i principali comandi
standard UNIX;
Il protocollo NFS (Network File System);
Sviluppo di programmi in C per la scrittura e la lettura di file da
256 MB su un hard disk remoto;
Test di velocità di NFS riguardo la scrittura e la lettura di
file in un hard disk remoto.
Testing dell’efficienza di una rete composta da 5 macchine collegate tra
loro, analizzando la velocità di trasferimento dei dati tramite operazioni di
lettura e scrittura.
lxmaster01
Gigabit Ethernet
switch cisco
catalyst 6000
Fast Ethernet fullduplex
lxmaster02
lxmaster03
lxmaster04
lxmaster05
Dischi: Un disco è una memoria su cui è possibile eseguire le
operazioni di lettura scrittura e spostamento
Il disco è suddiviso in tracce e settori; un insieme di settori è
chiamato cluster.
Conf. Dischi:
mirror :scrive su 2 dischi gli stessi dati metodo lento ma più sicuro;
stripped:ogni disco contiene meta' dell'informazione, metodo più
veloce in lettura e scrittura ma in caso di rottura di un disco si
perdono tutti i dati;
Raid 5:le informazioni sono suddivise in n-1 dischi e l'n disco
contiene i bit di parità quindi in caso di rottura di un solo disco,
dopo la sostituzione, attraverso il disco di parita e' possibile
ricostruire tutti i file.
File system:
vengono creati durante la formattazione logica di un disco e sono
composti da un insieme di moduli che permettono la scrittura e la
lettura di un disco. Il file system di Windows è il FAT 16,24,32 a
seconda della quantità di bit da cui è costituito, Unix-Linux invece
utilizza principalmente EXT3 che utilizza la tecnologia I-NODE che
contiene un’ area di dati del file e un’area che punta a blocchi
contenente il file(indirizzament singolo) Nell'indirizzamento doppio
l’I-NODE punta a dei blocchi e a loro volta puntano altri blocchi
che conterranno il file.
Il tipo di distribuzione Linux installata è la versione “Fedora 8”.
PRINCIPALI PROCEDURE DI INSTALLAZIONE:
• Configurazione degli hard disk in stripe mode, in modo da ridurre i tempi
di lettura e scrittura, ma perdendo garanzia sulla sicurezza dei dati;
• Suddivisione del disco tra i seguenti file system: root, boot, home, swap;
• Configurazione rete ethernet;
• Scelta e installazione dei pacchetti aggiuntivi del sistema operativo;
non e' stato possibile installare l'ultima versione di Fedora (Fedora 9),
perche' essendo stata rilasciata alla fine di maggio presentava al suo
avvio diversi bug
La shell è uno dei livelli che compongono i sistemi operativi UNIX.
Esegue la read (o lettura) di una linea di comando dallo standard input e
la interpreta secondo uno schema di regole prefissato. In pratica rende
comprensibili alla macchina i comandi che le vengono inviati.
PRINCIPALI COMANDI DELLA SHELL:
ls: visualizza il contenuto di una directory;
cd: cambia la directory di lavoro;
mkdir: crea una nuova directory;
touch: crea un nuovo file;
rm: cancellazione di un file;
chmod: cambia i diritti di lettura,scrittura ed eseguibilità di un file;
more: visualizza il contenuto di un file;
su: cambia utenza;
ps: visualizza i nomi dei processi in esecuzione in una data shell;
reboot: riavvio del sistema;
ssh: prende il controllo di una macchina remota collegata in rete;
find: ricerca di un file nel sistema.
vi nomeprog: apre l'editor vi per scrivere programmi in linguaggio C
Il Network File System è un protocollo sviluppato
inizialmente da Sun Microsystems nel 1984. L'NFS è un
file system che consente ai computer di utilizzare la rete
per accedere ai dischi remoti come fossero dischi locali.
NFS è spesso associato a sistemi Unix, sebbene spesso
sia utilizzato anche da macchine utilizzanti i sistemi
operativi Macintosh e Microsoft Windows.
NFS permette ad n calcolatori che compongono un
sistema distribuito di condividere file, directory od un
intero file system utilizzando il protocollo client-server
Un calcolatore (client) deve richiedere esplicitamente ad
un altro calcolatore (server) del sistema distribuito di
condividere una directory o un file, dichiarando un punto
di montaggio. Una volta effettuato un montaggio un
utente sul calcolatore client accede alla directory
montata in modo assolutamente trasparente, ossia
accede alla directory remota credendo di accedere ad
una directory locale.
NFS si può pensare inoltre come uno strato superiore
del famoso protocollo TCP/IP.
#include <stdio.h>
main()
{
int p,r,l,x,y;
p=0;
l=0;
r=1;
x=0;
y=x;
x=getchar();
while (x==10 | x==32)
{
l=l+1;
if (x==32) r=r+1;
x= getchar();
}
if (x!=EOF)
{
p=p+1;
while (x!=EOF)
{
if (x!=EOF)
{
if (!(x==10 | x==32)&&(y==10 | y==32))
p=p+1;
l=l+1;
if (x==32) r=r+1;
}
y=x;
x=getchar();
}
}
printf("\n i caratteri sono: %d \n ", l);
printf("le parole sono: %d \n ", p);
printf("le righe sono: %d \n ", r);
}
Questo
programma è
stato
l’introduzione al
linguaggio C e al
suo utilizzo. E'
una semplice
funzione che
calcola il numero
di caratteri,
parole, righe
presenti da un
flusso di input
#include<stdio.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
FILE *pf;
int c;
int sizeb,sizef;
char lett[131072];
#define BILLION 1000000000L;
struct timespec start, stop;
double accum;
sizeb=atoi(argv[2]);
sizef=atoi(argv[3]);
if (sizeb>131072)
{
printf("\n Inserire una dim. max. cluster di 131072 \n");
exit(-1);
}
if (argc<2)
{
printf("\n Inserire dal prompt il nome del file \n");
}
for (c=0;c<argc;c++)
{
printf("\n parametro %d : %s \n",c , argv[c]);
}
pf=fopen(argv[1],"w");
if (pf==NULL)
{
printf("\n il file non e' stato aperto \n");
exit(-1);
}
else
{
printf("\n file aperto con successo \n");
for (c=0;c<131072;c++)
lett[c]='a';
if( clock_gettime( CLOCK_REALTIME, &start) == -1 ) {
perror( "clock gettime" );
return EXIT_FAILURE;
}
for(c=0;c<sizef;c=c+sizeb)
fwrite(&lett,sizeb,1,pf);
fclose(pf);
if( clock_gettime( CLOCK_REALTIME, &stop) == -1 ) {
perror( "clock gettime" );
return EXIT_FAILURE;
}
accum = ( stop.tv_sec - start.tv_sec )
+ (double)( stop.tv_nsec - start.tv_nsec )
/ (double)BILLION;
printf("\n file scritto con successo \n");
printf("\n tempo impiegato = %lf\n", accum);
}
}
#include<stdio.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
FILE *pf;
int c;
int sizeb,sizef;
char lett[131072];
struct timespec start, stop;
#define BILLION 1000000000L;
double accum;
sizeb=atoi(argv[2]);
sizef=atoi(argv[3]);
int dim;
if (argc<2)
{
printf("\n Inserire dal prompt il nome del file
\n");
exit(-1);
}
for (c=0;c<argc;c++)
{
printf("\n parametro %d : %s \n",c ,
argv[c]);
}
pf=fopen(argv[1],"r");
if (pf==NULL)
{
printf("\n il file non e' stato aperto \n");
exit(-1);
}
else
{
printf("\n file aperto con successo \n");
fseek(pf,0, SEEK_END );
dim=ftell(pf);
if ((sizeb>dim)||(sizef>dim)||(sizeb<=0)||(sizef<=0))
{
printf("\n Inserire una dim. max di %d e maggiore di 0 \n",dim);
exit(-1);
}
else
fseek(pf,0,SEEK_SET);
if( clock_gettime( CLOCK_REALTIME, &start) == -1 ) {
perror( "clock gettime" );
return EXIT_FAILURE;
}
for(c=0;c<sizef;c=c+sizeb)
{
fread(&lett,sizeb,1,pf);
}
fclose(pf);
if( clock_gettime( CLOCK_REALTIME, &stop) == -1 ) {
perror( "clock gettime" );
return EXIT_FAILURE;
}
accum = ( stop.tv_sec - start.tv_sec )
+ (double)( stop.tv_nsec - start.tv_nsec )
/ (double)BILLION;
printf("\n lettura effettuata ");
printf("\n tempo impiegato = %lf\n", accum);
}
}
Test di velocità in scrittura e lettura su disco remoto con variazione
di Block Size e numero di macchine.
1 CLIENT
blocchi
1024
2048
4096
8192
16384
32768
65536
131072
scrittura
tempo
35.31
35.14
35.29
35.12
34.52
34.78
35.28
35.34
velocita
7.25
7.29
7.25
7.29
7.42
7.36
7.26
7.24
blocchi
1024
2048
4096
8192
16384
32768
65536
131072
lettura
tempo
34.33
33.92
33.98
33.93
34.29
34.22
34.33
34.14
velocita
7.46
7.55
7.54
7.54
7.47
7.48
7.46
7.5
2 CLIENTS
blocchi
1024
2048
4096
8192
16384
32768
65536
131072
scrittura
tempo
98.6
99.46
97.93
98.31
102.03
83.52
103.55
133.85
blocchi
1024
2048
4096
8192
16384
32768
65536
131072
lettura
tempo
72.98
68.91
77.23
67.31
39.55
37.83
37.79
34.62
velocita
3.51
3.71
3.32
3.8
6.47
6.76
6.77
7.4
blocchi
1024
2048
4096
8192
16384
32768
65536
131072
lettura
tempo
91.49
62.29
67.48
49.81
50.85
50.44
52.51
41.3
velocita
2.8
4.11
3.79
5.14
5.03
5.08
4.87
6.2
velocita
2.6
2.57
2.61
2.6
2.51
3.07
1.87
1.91
3 CLIENTS
blocchi
1024
2048
4096
8192
16384
32768
65536
131072
scrittura
tempo
164.15
90.41
237.22
167.2
138.03
249.23
149.56
177.84
velocita
1.56
2.83
1.08
1.53
1.85
1.03
1.71
1.44
lettura e scrittura 1 client
7.5
velocita (MB/sec)
7.4
7.3
lettura
scrittura
7.2
7.1
7
1024
2048
4096
8192
16384
block size (byte)
32768
65536
131072
lettura e scrittura 2 clients
8
7
velocita (MB/sec)
6
5
4
lettura
scrittura
3
2
1
0
1024
2048
4096
8192
16384
block size (byte)
32768
65536
131072
lettura e scrittura 3 clients
7
6
velocita (MB/sec)
5
4
lettura
scrittura
3
2
1
0
1024
2048
4096
8192
16384
block size (byte)
32768
65536
131072
Analizzando i dati delle tabelle si nota che la lettura tende
ad aumentare di velocità con l’ aumentare del block size
mentre la scrittura aumenta di velocità fino a raggiungere
un valore di picco e poi tende a rallentare.
Quindi sfruttando i dati raccolti si potranno ottimizzare le
operazioni di lettura e scrittura da 1 a 3 macchine con un
disco in remoto impostando il block size che massimizza
tali operazioni
Block size scelti:
Con 1 client:16384 per la scrittura e 2048 per la lettura
Con 2 client:32768 per la scrittura e 131072 per la lettura
Con 3 client:2048 per la scrittura e 131072 per la lettura
Non è stato possibile raccogliere dati con 4 macchine in
quanto una ha presentato problemi hardware durante
l’esercitazione.
Scarica

Progettazione e gestione sotto il sistema operativo Unix di un