cluster en linux

12
Cluster en Linux Manual Realizado por: Antonio Jesús Mancera Blanco. Juan Carlos Canto Gonzalez. www . mancera . org Realizado por: Juan Carlos Canto Gonzalez Diciembre 2010 Antonio Jesús Mancera Blanco

Upload: tvmanradio

Post on 22-Nov-2014

43 views

Category:

Documents


1 download

DESCRIPTION

Aprenderás paso a paso como montar tu propio cluster en Linux

TRANSCRIPT

Page 2: Cluster en Linux

Datos iniciales: -Se han utilizado 2 ordenadores personales con Ubuntu desktop.-Red configurada (Para el ejemplo ub0: 192.168.1.20 , ub1:192.168.1.25).-Después de los pasos todos los nodos llegarán a tener los mismos nombres de usuarios (para el ejemplo: mpiu@ub0, mpiu@ub1) y el mismo directorio de trabajo (para el ejemplo: /home/mpiu)

1. Instalar en todas las máquinas MPIHC2.mpiu@ub0:~$ sudo apt-get install mpich2mpiu@ub1:~$ sudo apt-get install mpich2

2. Instalar NFS.mpiu@ub0:~$ sudo apt-get install nfs-kernel-servermpiu@ub1:~$ sudo apt-get install nfs-kernel-server

3. Instalar SSH.mpiu@ub0:~$ sudo apt-get install sshmpiu@ub1:~$ sudo apt-get install ssh

4. Editar /etc/hosts para configurar las ip’s de y en todos los nodosmpiu@ub0:~$ sudo nano /etc/hostsmpiu@ub1:~$ sudo nano /etc/hosts

Para el ejemplo las líneas relativas a las IP´s deben quedar como siguen :127.0.0.1 localhost localhost.localdomain192.168.1.20 ub0192.168.1.25 ub1

Guardamos (Ctrl+o) y salimos (Ctrl+x).

5. Compartir directorio del usuario en ub0 para los demás nodos.Añadir al fichero /etc/exportsmpiu@ub0:~$ sudo nano /etc/exportsY añadir dentro: /home/mpiu *(rw,sync)

Realizado por:Juan Carlos Canto Gonzalez Diciembre 2010Antonio Jesús Mancera Blanco

Page 3: Cluster en Linux

6. Montar en ub1 el directorio compartido de ub0 mpiu@ub1:~$ sudo mount ub0:/home/mpiu /home/mpiu Si queremos podemos editar el archivo /etc/fstab para no tenerlo que montar cada vez que iniciemos la maquina, añadiendo esta linea:ub1:/home/mpiu /home/mpiu nfs

7. Crear en /home/mpiu de ub0 el fichero(oculto) .mpd.conf(con puntos incluidos, éste contendrá la clave de conexión de SSH .Se le dará permisos 600).

Editamos/creamos : mpiu@ub0:~$ nano /home/mpiu/.mpd.confy escribimos la línea en el fichero:MPD_SECRETWORD="secret"Guardamos (Ctrl+o)y salimos (Ctrl+x).Permisos:mpiu@ub0:~$ sudo chmod 600 /home/mpiu/.mpd.conf

NOTA: el propietario del fichero debe ser siempre el usuario mpiu, por si no hemos podido crearlo en nombre de éste ejecutamos: mpiu@ub0:~$ sudo chown mpiu /home/mpiu/.mpd.conf

8. Crear en /home/mpiu de ub0 el fichero(oculto) .mpd.hosts(con puntos incluidos éste, contendrá los nombres de los hosts .Se le dará permisos 600) .Editamos/creamos : mpiu@ub0:~$ nano /home/mpiu/.mpd.hostsy escribimos la línea en el fichero:ub0ub1

Guardamos (Ctrl+o)y salimos (Ctrl+x).Permisos:mpiu@ub0:~$ sudo chmod 600 /home/mpiu/.mpd.hosts

NOTA: el propietario del fichero debe ser siempre el usuario mpiu, por si no hemos podido crearlo en nombre de éste ejecutamos: mpiu@ub0:~$ sudo chown mpiu /home/mpiu/.mpd.hosts

Realizado por:Juan Carlos Canto Gonzalez Diciembre 2010Antonio Jesús Mancera Blanco

Page 4: Cluster en Linux

9. Generar las claves de SSH en los nodos.Para que no pida contraseñas se genera la llave:mpiu@ub0:~$ ssh-keygen -t dsaSe pregunta donde guardarla y passwords, se deja el archivo por defecto (intro) y sin passwords(intro 2 veces).-Luego se copia a los nodos esclavosmpiu@ub0:~$ ssh-copy-id mpiu@ub1mpiu@ub0:~$ ssh-add

Ahora lo mismo con la llave rsampiu@ub0:~$ ssh-keygen -t rsampiu@ub0:~$ ssh-copy-id mpiu@ub1mpiu@ub0:~$ ssh-add

10. Se puede probar la conexión SSH con los nodos, desde el maestro(ub0). Al principio puede que solicite (yes), pero luego no debe pedir passwords.mpiu@ub0:~$ ssh ub1

Con ello entramos como usuario remoto en ub1…, luego salimos con exit.

11. Una vez que tenemos todo configurado ponemos a prueba el cluster.Iniciamos el proceso de escucha en el maestro:mpiu@ub0:~$ mpdboot -n 2 -f .mpd.hosts(NOTA: el 2 por el número de nodos totales)

Para comprobar que se ha cargado el demonio …mpiu@ub0:~$ mpdtraceDevolverá los nodos implicados si está todo correcto :ub0ub1

12. Compilando ejemplos(éstos están instalados en /usr/include/mpi/examples)Si no están compilados los programas (programas especiales para procesos distribuidos), lo compilamos con mpicc.En el caso de que estos archivos no existieran como era nuestro caso, abajo está el código fuente escrito en C y que debemos copiar en un archivo de texto plano llamado CPI.C o ICPI.C

Ej: cpi.c (programa que calcula aproximaciones del número PI)mpiu@ub0:~$ mpicc -o /home/mpiu/cpi /usr/include/mpi/examples/cpi.c

Realizado por:Juan Carlos Canto Gonzalez Diciembre 2010Antonio Jesús Mancera Blanco

Page 5: Cluster en Linux

(Donde cpi es el nombre del ejecutable obtenido y cpi.c el fuente)

13. Ejecutando ejemplompiu@ub0:~$ mpiexec -l -n 3 /home/mpiu/cpi (Debemos obtener los procesos ejecutados en cada nodo y tiempo de ejecución)

Para comparar el tiempo de ejecución, podemos cambiar el número de nodos que deseamos que intervengan cambiando el 3 , pero teniendo en cuenta que deben ser programas que ejecuten grandes tareas , por ejemplo con el programa icpi.c ( ejecuta varias vueltas en bucles del cálculo) . Si son programas cortos puede que se ejecuten más rápidos con menos nodos (no siendo lógico), por la velocidad de red...

Realizado por:Juan Carlos Canto Gonzalez Diciembre 2010Antonio Jesús Mancera Blanco

Page 6: Cluster en Linux

Código fuente de ejemplos CPI.C

#include "mpi.h"#include <stdio.h>#include <math.h> double f(double); double f(double a){

return (4.0 / (1.0 + a*a));} int main(int argc,char *argv[]){

int n, myid, numprocs, i;double PI25DT = 3.141592653589793238462643;double mypi, pi, h, sum, x;double startwtime = 0.0, endwtime;int namelen;char processor_name[MPI_MAX_PROCESSOR_NAME];

MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); MPI_Get_processor_name(processor_name,&namelen);

fprintf(stdout,"Process %d of %d is on %s\n", myid, numprocs, processor_name);

fflush(stdout);

n = 10000; /* default # of rectangles */if (myid == 0)

startwtime = MPI_Wtime();

MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

h = 1.0 / (double) n;sum = 0.0;/* A slightly better approach starts from large i and works back */for (i = myid + 1; i <= n; i += numprocs){

x = h * ((double)i - 0.5); sum += f(x);

}mypi = h * sum;

MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

if (myid == 0) {

endwtime = MPI_Wtime(); printf("pi is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT)); printf("wall clock time = %f\n", endwtime-startwtime); fflush(stdout);

}

MPI_Finalize();return 0;

}

Realizado por:Juan Carlos Canto Gonzalez Diciembre 2010Antonio Jesús Mancera Blanco

Page 7: Cluster en Linux

ICPI.C

#include "mpi.h"#include <stdio.h>#include <math.h>double f(double);double f(double a){

return (4.0 / (1.0 + a*a));}int main(int argc,char *argv[]){

int done = 0, n, myid, numprocs, i;double PI25DT = 3.141592653589793238462643;double mypi, pi, h, sum, x;double startwtime = 0.0, endwtime;int namelen;char processor_name[MPI_MAX_PROCESSOR_NAME];

MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

MPI_Comm_rank(MPI_COMM_WORLD,&myid); MPI_Get_processor_name(processor_name,&namelen);

/* fprintf(stdout,"Process %d of %d is on %s\n", myid, numprocs, processor_name); fflush(stdout);

*/while (!done) {

if (myid == 0) { fprintf(stdout, "Enter the number of intervals: (0 quits) "); fflush(stdout); if (scanf("%d",&n) != 1) { fprintf( stdout, "No number entered; quitting\n" ); n = 0; } startwtime = MPI_Wtime(); } MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); if (n == 0) done = 1; else { h = 1.0 / (double) n; sum = 0.0; for (i = myid + 1; i <= n; i += numprocs) { x = h * ((double)i - 0.5); sum += f(x); } mypi = h * sum; MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (myid == 0) { printf("pi is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT)); endwtime = MPI_Wtime(); printf("wall clock time = %f\n", endwtime-startwtime); fflush( stdout ); } }

}MPI_Finalize();return 0;

}

Realizado por:Juan Carlos Canto Gonzalez Diciembre 2010Antonio Jesús Mancera Blanco

Page 8: Cluster en Linux

Cluster Linux by Juan Carlos Canto Gonzalez , Antonio Jesús Mancera Blanco is licensed under a Creative Commons Reconocimiento - NoComercial - CompartirIgual 3.0 España License .

Con la colaboración de Juan José Gallego García, que sin él no hubiese sido posible la realización de este proyecto.

Realizado por:Juan Carlos Canto Gonzalez Diciembre 2010Antonio Jesús Mancera Blanco