Stage estivo di Informatica 2006 Studenti: Giorgio Cambie' Matteo Sciarra Tutor: Giuseppe Fabio Fortugno
Obiettivo del corso Misurare i tempi di elaborazione di un set di dati allo scopo di ottimizzare le operazioni di lettura e scrittura in locale e via rete ad alta velocita'
Descrizione dell'apparato utilizzato Il server utilizzato nell'esperimento e' un IBM X Series modello 335 dotato di due dischi SCSI in modalita' raid 0 con interfaccia di rete Ethernet Gigabit. I client utilizzati sono IBM X Series modello 335 con interfaccia di rete Fast Ethernet. Lo switch di rete e' un CISCO Catalyst modello 4506.
Descrizione del linguaggio C Il linguaggio C e' un linguaggio di medio livello che ha sostituito l'Assembler da molti anni. Esso consente un controllo del terminale molto piu' profondo di qualsiasi altro linguaggio di programmazione. E' perfettamente integrato in Unix. E' in grado di far comunicare processi locali e remoti tra di loro. Inoltre, consente un accesso in profondita' nel nucleo di Unix permettendo un altissimo controllo sul sistema operativo.
Tabelle
Lettura in Locale Scrittura in Locale
Tempo reale in Rete Tempo reale in Locale
File sorgente #include main (int argc,char *argv[]) { int ii=0,a,i,buf,v[32768]; float t=0.0, t1=0.0, t2=0.0; int *adv; int fp; unsigned n; adv=&v[0]; t=CLOCKS_PER_SEC; ========> #include main (int argc,char *argv[]) { int ii=0,a,i,buf,v[32768]; float t=0.0, t1=0.0, t2=0.0; int *adv; int fp; unsigned n; adv=&v[0]; t=CLOCKS_PER_SEC; ========>
if(argc==2){ buf=atoi(argv[1]); if(buf==512|| buf==1024|| buf==2048 || buf==4096||buf==8192|| buf==16384|| buf==32768)ii=1; } for (i=0; i<32768; i++) v[i]=random(); while(ii==0) { printf("\n Inserisci il valore del blocksize = "); scanf ("%i", &buf); switch (buf) { case 512: ii=1; break; case 1024: ii=1; break;========> if(argc==2){ buf=atoi(argv[1]); if(buf==512|| buf==1024|| buf==2048 || buf==4096||buf==8192|| buf==16384|| buf==32768)ii=1; } for (i=0; i<32768; i++) v[i]=random(); while(ii==0) { printf("\n Inserisci il valore del blocksize = "); scanf ("%i", &buf); switch (buf) { case 512: ii=1; break; case 1024: ii=1; break;========>
case 2048: ii=1; break; case 4096: ii=1; break; case 8192: ii=1; break; case 16384: ii=1; break; case 32768: ii=1; break; default: printf("\n Valori ammessi: "); break; } ========> case 2048: ii=1; break; case 4096: ii=1; break; case 8192: ii=1; break; case 16384: ii=1; break; case 32768: ii=1; break; default: printf("\n Valori ammessi: "); break; } ========>
fp=creat("uscita_mg",O_CREAT | S_IRWXU); t1=clock()/t; for (i=0; i<(512*1024*1024)/buf; i++) { n=write (fp,adv,buf); if(n!=buf)printf("\n Errore di scrittura del file \n"); } close(fp); t2=clock()/t-t1; printf("\n\n Il tempo necessario a scrivere 500 MB di numeri random e'= %9.5f \n",t2); fp=open ("uscita_mg",O_RDONLY); t1=clock()/t; ========> fp=creat("uscita_mg",O_CREAT | S_IRWXU); t1=clock()/t; for (i=0; i<(512*1024*1024)/buf; i++) { n=write (fp,adv,buf); if(n!=buf)printf("\n Errore di scrittura del file \n"); } close(fp); t2=clock()/t-t1; printf("\n\n Il tempo necessario a scrivere 500 MB di numeri random e'= %9.5f \n",t2); fp=open ("uscita_mg",O_RDONLY); t1=clock()/t; ========>
for (i=0; i<(512*1024*1024)/buf; i++) { n=read(fp,adv,buf); if(n!=buf)printf("\n Errore di lettura %d byte letti \n",n); } close(fp); t2=clock()/t-t1; printf("\n\n Il tempo necessario a leggere un file di 500 MB di numeri random e'= %9.5f \n",t2); exit (0); } for (i=0; i<(512*1024*1024)/buf; i++) { n=read(fp,adv,buf); if(n!=buf)printf("\n Errore di lettura %d byte letti \n",n); } close(fp); t2=clock()/t-t1; printf("\n\n Il tempo necessario a leggere un file di 500 MB di numeri random e'= %9.5f \n",t2); exit (0); }
Conclusioni Scrivendo e leggendo in locale, maggiore e' il blocksize e minore e' il tempo impiegato dalla macchina. Confrontando il valore dei tempi effettivamente impiegati dalla macchina per compiere il lavoro, tra Locale e Remoto il Locale e' piu' veloce, raggiungendo la massima velocita' rispettivamente a 8192kb e 2148kb. Tuttavia un blocksize di 8192kb e' ottimo per entrambi i sistemi. Infine, quando sono piu' macchine a scrivere simultaneamente sulla stessa macchina ricevente il blocksize migliore e' di 512kb.
GRAZIE PER L'ATTENZIONE !