Computação baseada em clusters
Computadores domésticos baratos podem ser agrupados em clusters de várias máquinas, onde exercem funções que exigem alto desempenho computacional como se fossem uma única máquina de grande porte. A base de tudo isto? Software Open Source e o Linux
O Cluster Beowulf
Em 1994, a NASA, agência espacial norte-americana, necessitava de um equipamento com poder de processamento da ordem de um gigaflop, o que significa um bilhão de operações em ponto flutuante por segundo. Entretanto, um supercomputador com tal nível de desempenho custava em torno de um milhão de dólares, o que era considerado um investimento muito alto para um único grupo de pesquisadores. Os pesquisadores Thomas Sterling e Donald J. Becker decidiram então interligar 16 computadores pessoais, cada um com um microprocessador 486, usando o sistema operacional Linux e uma rede padrão Ethernet. Usado em aplicações científicas, este conjunto atingiu a marca de 70 megaflops. Para a época, era uma velocidade nada baixa, se comparada com a dos pequenos supercomputadores comerciais disponíveis. O custo total do sistema foi de U$ 40.000,00 (quarenta mil dólares) ou dez por cento do preço de uma máquina equivalente em 1994.
Uma característica chave de um cluster Beowulf é o uso do sistema operacional Linux, assim como de bibliotecas para troca de mensagens (PVMPVM, MPI e BSPMPI) de livre distribuição. Isto permitiu a realização de alterações no sistema operacional, que lhe deram novas características que facilitaram a implementação para aplicações paralelas.
Um cluster Beowulf é constituído de vários nós escravos, controlados por um computador principal, ao qual se tem acesso direto, interligados por uma rede fast ethernet. Este computador principal é o responsável pela distribuição das tarefas; os escravos limitam-se a processar os dados que lhes são enviados.
Configurando nosso primeiro cluster
Instale o Gnu/Linux em todas as máquinas e defina os seguintes parâmetros:
IP da rede local: 192.168.0.0
Máscara de subrede: 255.255.255.0
Nome do servidor: mestre.pinguim.br
Nomes dos nós: escravo1.pinguim.br, escravo2.pinguim.br, escravo3.pinguim.br ...
Em todos os computadores, adicione as seguintes linhas ao arquivo /etc/hosts/:
127.0.0.1 localhost localhost.localdomain
192.168.0.1 mestre mestre.pinguim.br
192.168.0.2 escravo1 escravo1.pinguim.br
192.168.0.3 escravo2 escravo2.pinguim.br
192.168.0.4 escravo3 escravo3.pinguim.br
O próximo passo será configurar o arquivo /etc/hosts.equiv, que define a relação de confiança entre os hosts através de equivalência, sem a necessidade de autenticação por senha. Isto representa um grande risco de segurança, mas é requerido pelo protocolo de acesso remoto RSH (Remote Shell) para que seja possível acessar todas as máquinas do cluster. Este arquivo deve estar presente em todas as máquinas que farão parte do seu sistema. O formato é o seguinte:
mestre
escravo1
escravo2
escravo3
O arquivo .rhosts
Este arquivo deverá constar em cada diretório de trabalho de cada usuário, como /home e /root. Observe a existência do ponto (.) na frente do arquivo, isto o torna “invisível” ao comando ls. Este arquivo também será usado pelo protocolo RSH para execução de comandos remotos e por algumas aplicações de monitoramento. Seu conteúdo é o seguinte:
escravo1
escravo2
escravo3
Observação: os arquivos hosts, hosts.equiv e .rhosts devem ser replicados em todas as máquinas que formam seu supercomputador.
Configurando o Servidor do Sistema de Arquivos (NFS)
O servidor NFS tem a função de permitir o acesso transparente a discos remotos, centralizando assim a administração, pois é possível ter todos os diretórios de trabalho em uma única máquina e compartilhá-lo com diversos clientes conectados por uma rede local. No computador mestre, edite o arquivo /etc/exports e acrescente as seguintes linhas:
/home *(rw,no_root, root_squash)
/usr/local *(rw,no_root, root_squash)
Salve o arquivo e inicie o serviço NFS. Para configurar os clientes, em cada nó escravo editamos o arquivo /etc/fstab para montar automaticamente nosso sistema de arquivos remoto. Adicione as seguintes linhas ao final do arquivo:
192.168.0.1:/home /home nfs exec,dev,suid,rw 1 1
192.168.0.1:/usr /usr nfs exec,dev,suid,rw 1 1
Habilite os serviços de rsh, rlogin, ssh e rexec com o comando ntsysv. Acrescente as seguintes linhas ao final do arquivo /etc/securetty/:
rsh
rlogin
Se tudo correu bem, estamos com 50% de caminho percorrido. Passamos então para próxima etapa, que consiste em entender e configurar a biblioteca de passagem de mensagens, MPI
O que é o MPI?
É uma biblioteca de passagem de mensagens, desenvolvida para ser padrão de comunicação entre processos em ambientes de memória distribuída. Vá ao site www-unix.mcs.anl.gov/mpi/mpic e baixe o arquivo mpich.tar. Descompacte-o no diretório /user/local com o comando:
# tar -zxvf mpich.tar
Entre no diretório /mpich-1.2.4 recém-criado e execute a seqüência de comandos abaixo:
./configure —prefix=/usr/local
make
make install
Abra com seu editor predileto o arquivo machines.LINUX, localizado no diretório /usr/local/mpich-1.2.4/util/machines/, e acrescente os nomes dos computadores que farão parte do cluster.
mestre
escravo1
escravo2
escravo3
Vá ao diretório /root e edite o arquivo .bash_profile, acrescentando as seguintes linhas:
PATH:$PATH=/usr/local/mpich-1.2.4/bin
export MPIR_HOME = /usr/local/mpich-1.2.4
Muitos aplicativos de testes acompanham o pacote MPICH, entre os quais um programa para cálculo de PI paralelizado, denominado CPI, que será utilizado para o nosso primeiro teste básico de passagem de mensagens. Cada computador calcula o valor de pi e compara-o com o valor 3.14159265358979. O programa CPI pode ser encontrado em /usr/local/mpich/1.2.4/examples. Compile o programa com o comando abaixo:
mpicc cpi.c -o cpi
E execute-o com quatro processos (ou seja, um para cada máquina do nosso cluster)
mpirun -np 4 cpi
Você verá algo similar ao mostrado abaixo:
Process 0 on mestre.pinguim.br
Process 1 on escravo1.pinguim.br
Process 2 on escravo2.pinguim.br
Process 3 on escravo3.pinguim.br
pi is approximately 3.1416009869231249, Error is 0.0000083333333318
wall clock time =0.003784
Com isso, podemos ter certeza de que o nosso primeiro supercomputador está funcionando corretamente.
Marcos José Pitanga Alves pitanga@domain.com.bR
Profissional com mais de 19 anos de experiência em informática, com formação em Eletrônica, Análise de Sistemas, Redes de Computadores e Segurança de Redes. É docente da Universidade UniABEU, na Baixada Fluminense, onde ministra aulas nas disciplinas de Redes de Computadores, Sistemas Operacionais, Sistemas Distribuídos e Segurança de Redes. É também autor do livro Construindo Supercomputadores com Linux pela editora Brasport.