Home Projetos Diversos Montando um Cluster com Kerrighed
Montando um Cluster com Kerrighed Imprimir E-mail
Ter, 28 de Abril de 2009 01:39

O kerrighed é um sistema operacional de imagem única (Single System Image Operating System – SSI OS) que estende o kernel do Linux e tem como objetivo a construção de clusters de, principalmente, alto desempenho e alta disponibilidade. Ele oferece aos usuários a ilusão de que os nós são grandes maquinas SMP, que dispõem da soma de todos os recursos disponíveis nos computadores que compõem o cluster. Este relatório mostra, passo-a-passo, como implementar um cluster usando o kerrighed e usufruir do poder de processamento da sua rede.

 

Introdução

 

Um sistema SSI proporciona uma visão unificada de todos os recursos e atividades em execução no cluster, possibilitando abstrair ao usuário o caráter distribuído, não precisando ele sequer saber que usufrui de um cluster. A distribuição de carga é feita de forma automática e não exige que os processos tenham sido escritos especificamente para sistemas distribuídos (com uso de bibliotecas específicas, como MPI), podendo estes migrarem livremente para quaisquer dos nós.

No projeto de implementação de um cluster, é imprescindível que sejam levantadas as suas reais necessidades, bem como as suas aplicações finais, a fim de que não seja desperdiçado poder de processamento com atividades que poderiam ser solucionados por um único computador (com menor consumo de energia, por exemplo). Este relatório é fruto da implementação de um protótipo de cluster no laboratório Ada de Lovelace do Departamento de Informática – DI/UFPB, e tem como objetivo futuro atender aos usuários que desejam ampliar seus conhecimentos em desenvolvimento para arquiteturas distribuídas e auxiliar em tarefas “pesadas”, como processamento digital de imagens, renderização de moldes e cenas 3D e demais tarefas desta natureza que são rotineiras no departamento de informática. Outra possível aplicação útil pode ser feita nos servidores de uma rede, a fim de oferecer alta disponibilidade, além de elevar o desempenho.

Considerações Iniciais

 

Dentre as versões do kerrighed, foram testadas duas em desenvolvimento (corrente) e a versão estável, tendo sido uma versão intermediária a mais indicada, por ter resolvido problemas presentes na ultima release lançada e não apresentado as falhas da corrente mais recente. A distribuição do Linux usada foi o Ubuntu, por ser a utilizada atualmente no laboratório Ada de Lovelace, do Departamento de Informática – DI/UFPB, no qual o protótipo foi montado.

Foram realizados testes com as versões 3.3, 4.1, 4.2 e 4.3 do compilador GCC e, apesar da documentação oficial do projeto sugerir a versão 3.3 para todo o processo de compilação, a prática mostrou que a versão 4.1 se mostrou mais indicada, com a qual foi possível compilar todas as etapas sem muitos problemas e por fim não obter falhas de segmentação, que ocorriam ao usar o gcc-3.3, e demais erros.

 

Instalando o Cluster

 

Antes de prosseguir, se faz-se necessário resolver alguns futuros problemas com dependências. Sugere-se a instalação dos seguintes pacotes:

 

#apt-get install ncurses-dev

#apt-get install subversion

#apt-get install automake

#apt-get install autoconf

#apt-get install libtool

#apt-get install pkg-config

#apt-get install gawk

#apt-get install rsync

#apt-get install lsb-release

#apt-get install xmlto

#apt-get install patchutils patch

#apt-get install xutils-dev

#apt-get install build-essential

#apt-get install make

 

Quadro 1: Instalando dependências.

Se a versão do apt-get suportar múltiplos argumentos, use:

#apt-get install automake autoconf libtool pkg-config awk rsync bzip2 gcc-3.3 libncurses5 libncurses5-dev wget lsb-release xmlto patchutils xutils-dev build-essential

 

Para instalar o gcc-4.1, a dependência abaixo deve ser adicionada ao arquivo /etc/apt/sources.list:

deb http://cz.archive.ubuntu.com/ubuntu dapper main

Em seguida, é preciso sincronizar os pacotes com a nova dependência para posterior instalação:

#apt-get update

#apt-get install gcc-4.1

#apt-get install g++-4.1

#cp /usr/bin/gcc /usr/bin/gcc.old

#ln –s /usr/bin/gcc-4.1 /usr/bin/gcc

A instalação do kerrighed, usando uma versão do svn, pode ser iniciada acordo com os comandos abaixo:

#svn checkout svn://scm.gforge.inria.fr/svn/kerrighed/trunk /usr/src/kerrighed -r 4762
#cd /usr/src/kerrighed

#./autogen.sh
#./configure CC=gcc-4.1
#make defconfig


Quadro 2: Resumo da instação.

Todos os passos necessários para a instalação estão listados abaixo, porém este documento irá abordá-los passo-a-passo em conseqüência da necessidade de solucionar alguns erros ocorridos durante a instalação.

#svn checkout svn://scm.gforge.inria.fr/svn/kerrighed/trunk /usr/src/kerrighed -r 4762
#cd /usr/src/kerrighed

#./autogen.sh
#./configure CC=gcc-4.1
#make defconfig
#cd kernel

#make menuconfig

#cd ..

#make kernel CC=gcc-4.1

#make CC=gcc-4.1

#make kernel-install CC=gcc-4.1

#make install CC=gcc-4.1

 

Na versão estável 2.3.0 fazia-se necessário baixar o source do kernel Linux 2.6.20, a fim de que o microkernel kerrighed pudesse estendê-lo. Na versão em desenvolvimento, disponível via svn, na qual se baseia este guia, o source do kernel pode ser encontrado dentro do subdiretório kernel/, o qual deverá ser configurado de acordo com as necessidades e particularidades do cluster, devendo ser dada atenção a correta configuração da interface de rede, bem como os módulos de suporte a NFS, como a seguir:

 

#cd kernel

#make menuconfig

 

Será apresentado ao usuário o menu de configurações do kernel (percebe-se, na parte superior, a sigla –krg junto ao nome da versão do kernel) ilustrado na figura 1. Como já mencionado, é indispensável ativar o suporte à interface de rede – além de configurações particulares de cada caso - que pode ser feito de acordo com o caminho abaixo:

Device Drivers -à Network device suport -à Escolha a categoria da sua interface [ex: Ethernet ( 10 or 1000Mbit ) ] -à Selecione seu modelo ( ex: AMD PCnet32 PCI support, Intel(R) PRO/100+ support, Realtek, VIA, etc ).

 

Figura 1 – Configuração do kernel

 

Concluído as modificações no kernel, deve-se pressionar a tecla [ESC] duas vezes em cada menu até que seja perguntado se as alterações devem ser salvas, devendo-se escolher a opção YES para salvá-las.

Se não houver muita familiaridade da parte do usuário com o kernel, pode-se ainda optar por usar um arquivo pré-definido de configurações, que dispensará a configuração manual da interface de rede (realizada logo acima), além de outras configurações ( usar um arquivo de configuração sem os devidos cuidados pode acarretar em erros pós-instalação). Um arquivo de configuração para este caso pode ser obtido como abaixo:

#wget http://trac.nchc.org.tw/grid/raw-attachment/wiki/krg_DRBL/config-2.6.20-krg

Em seguida, carrega-se o arquivo no kernel, como pode ser visto nas linhas seguintes e nas figuras 2 e 3:

#make menuconfig

Load an Alternate Configuration File

Digite o nome do arquivo de configuração: config-2.6.20-krg

Tecle [ENTER], [ESC] duas vezes para sair e salve as alterações.

 

Figura 2 – Carregar arquivo de configuração do kernel

 

Figura 3 – Definindo arquivo de configuração

 

Uma vez atendido aos passos acima, pode-se compilar o kernel e prosseguir com a instalação. Durante a compilação diversos erros podem ocorrer, os quais serão resolvidos passo-a-passo no decorrer do guia:

 

#cd ..
#make kernel CC=gcc-4.1


Erro 1:

root@joao:/usr/src/kerrighed# make kernel

make -C /usr/src/ kerrighed/kernel bzImage

make[1]: Entrando no diretório `/usr/src/kerrighed/kernel'

scripts/kconfig/conf -s arch/i386/Kconfig

make[1]: Saindo do diretório `/usr/src/kerrighed/kernel'

make[1]: Entrando no diretório `/usr/src/kerrighed/kernel'

CHK include/linux/version.h

CHK include/linux/utsrelease.h

HOSTCC scripts/mod/sumversion.o

scripts/mod/sumversion.c: In function ‘get_src_version’:

scripts/mod/sumversion.c:384: error: ‘PATH_MAX’ undeclared (first use in this function)

scripts/mod/sumversion.c:384: error: (Each undeclared identifier is reported only once

scripts/mod/sumversion.c:384: error: for each function it appears in.)

scripts/mod/sumversion.c:384: warning: unused variable ‘filelist’

make[3]: ** [scripts/mod/sumversion.o] Erro 1

make[2]: ** [scripts/mod] Erro 2

make[1]: ** [scripts] Erro 2

make[1]: Saindo do diretório `/usr/src/linux-2.6.20'

make: ** [kernel] Erro 2

root@joao:/usr/src/kerrighed#

Para solucionar este erro, deve-se abrir o arquivo sumversion.c e incluir a biblioteca limits.h:

#vi scripts/mod/sumversion.c (use o seu editor de preferência)

Adicionar a linha: #include <limits.h> (pode ser na primeira linha)

Salvar o arquivo e tentar compilar novamente:

#make kernel CC=gcc-4.1

Erro 2:

kernel/built-in.o: In function `timespec_add_ns’:
/include/linux/time.h:177: undefined reference to `__umoddi3′
kernel/built-in.o: In function `do_gettimeofday’:
/kernel/time/timekeeping.c:121: undefined reference to `__udivdi3′
/kernel/time/timekeeping.c:122: undefined reference to `__umoddi3′
kernel/built-in.o: In function `timespec_add_ns’:
/include/linux/time.h:172: undefined reference to `__udivdi3′
/include/linux/time.h:177: undefined reference to `__umoddi3′
make[2]: *** [.tmp_vmlinux1] Error 1

Este erro ocorre devido ao fato do gcc tentar fazer otimização de loops, que neste caso, não foi suportada pela biblioteca time.h. Para solucioná-lo, abre-se o arquivo time.h e adiciona-se a linha asm("" : "+r"(ns)) ao procedimento que causou o erro:

#vi include/linux/time.h

Localizar o procedimento abaixo:

static inline void timespec_add_ns(struct timespec *a, u64 ns)

{

ns += a->tv_nsec;

while(unlikely(ns >= NSEC_PER_SEC)) {

/* The following asm() prevents the compiler from

* optimising this loop into a modulo operation. */

asm("" : "+r"(ns)); ß Adicionar esta linha.

ns -= NSEC_PER_SEC;

a->tv_sec++;

}

a->tv_nsec = ns;

}

Após salvar o arquivo, tenta-se compilar novamente. Provavelmente não ocorrerão mais erros nesta etapa.

#make kernel CC=gcc-4.1

 

Se não ocorreram erros, prossegue-se com o comando seguinte:

 

#make CC=gcc-4.1

 

O passo acima poderá retornar, de acordo com os testes, dois erros, que não precisam estar na ordem exposta abaixo, mas que podem ser solucionado de acordo com os seguintes passos:

 

 

Erro 3

Making all in modules

make[1]: Entrando no diretório `/usr/src/kerrighed/modules'

rm -f "/usr/src/kerrighed/modules/asm"

[ "/usr/src/kerrighed" == "/usr/src/kerrighed" ] || lndir -silent "/usr/src/kerrighed-2.3.0/modules"

[: 1: ==: unexpected operator

/bin/sh: lndir: not found

make[1]: ** [all-y] Erro 127

make[1]: Saindo do diretório `/usr/src/kerrighed/modules'

make: ** [all-recursive] Erro 1

Este erro pode ser causado por dois possíveis motivos. No primeiro deles, o comando lndir pode não ter sido encontrado no sistema, podendo ser facilmente resolvido com a instalação do pacote que o contém:

#apt-get install xutils-dev

Porém, ao resolver a dependência, o erro pode continuar presente pelo fato do comando lndir estar fazendo uma comparação entre dois diretórios iguais, o que o leva retonar 0 (false) e encerrar a compilação. Esta comparação indevida é realizada em conseqüência da verificação condicional anterior não estar sendo corretamente avaliada; linha: [ "$(top_builddir)" == "$(top_srcdir)" ] || lndir -silent "$(MODULE_SRC) ).

Para solucionar o problema relacionado, deve-se abrir o arquivo modules/Makefile e alterar, na linha SHELL=, /bin/sh por /bin/bash, ou pode-se criar um link simbólico de /bin/bash em /bin/sh:

#vi modules/Makefile

Alterar a linha SHELL = /bin/sh

Para à SHELL = /bin/bash

Ou, criando o link simbólico:

#cp /bin/sh /bin/sh.old

#ln –s /bin/bash /bin/sh

Feito isto, executa-se novamente o comando que causou o erro:

#make CC=gcc-4.1

 

Provavelmente neste ponto o kernel será compilado sem mais problemas, porém, se não foi utilizado o gcc-4.1, ainda existe a possibilidade de outro erro ocorrer:

 

Erro 4:

usr/src/kerrighed/modules/scheduler/core/policy.c: In function ‘scheduler_policy_new’:

/usr/src/kerrighed/modules/scheduler/core/policy.c:330: error: format not a string literal and no format arguments

make[4]: ** [/usr/src/kerrighed/modules/scheduler/core/policy.o] Erro 1

make[3]: ** [/usr/src/kerrighed/modules/scheduler/core] Erro 2

make[2]: ** [_module_/usr/src/kerrighed/modules] Erro 2

make[2]: Saindo do diretório `/usr/src/kerrighed/kernel'

make[1]: ** [all-y] Erro 2

make[1]: Saindo do diretório `/usr/src/kerrighed/modules'

make: ** [all-recursive] Erro 1

Este erro é causado por conta do compilador esperar receber uma string formatada como argumento. Em outras palavras, ao verificar a linha que causou o erro (policy.c:330), encontra-se:

request_module(name);

Quando o compilador espera: request_module(“%s” , name);

Se isto ocorreu, é necessário se certificar quanto à versão do GCC, que deve ser a 4.1, na qual este tipo de problema não ocorre. Corrigir o código manualmente levaria muito tempo, visto que o mesmo padrão de sintax é usado em diversos componentes e módulos.

 

Concluído o passo anterior, o cluster está a um passo de ser compilado. Pode-se finalizar com os comandos abaixo, os quais não deverão retornar erros se os requisitos anteriores tiverem sido atendidos:


#make kernel-install CC=gcc-4.1
#make install CC=gcc-4.1


Ao fim do make install, o novo kernel está pronto e sua imagem deve ter sido criada em /boot/vmlinuz-2.6.20-krg. Para testar o novo nó do cluster, deve-se adicionar a nova imagem em uma entrada no seu gerenciador do boot, conforme o procedimento abaixo para o grub:

#vi /boot/grub/menu.list

Adicionar as linhas abaixo:

title Kerrighed Cluster (ubuntu)

kernel /boot/vmlinuz-2.6.20-krg root=/dev/sda1 ro session_id=1 node_id=1

OBS: root=/dev/sda1 indica a partição raiz. Em alguns casos, ainda que sua raiz seja reconhecida como sda, talvez seja necessário usar hda. Este problema foi reportado em alguns dos computadores do laboratório Ada. Caso o boot não seja efetuado corretamente (terminando em um Shell ram), é provável que se deva alterar sda1 para hda1 no menu.list.

session_id=1: indica a sessão na qual este nó será inserido.

node_id: identificação do nó. Cada qual deverá ter seu próprio id.

 

Confirma-se as alterações:

 

#update-grub

 

Se não ocorreram erros, o primeiro nó está pronto. Ao reiniciar o computador, escolhe-se a nova entrada no grub, conforme figura 4.

 

Figura 4 – Iniciando cluster pelo grub

 

A versão do kernel pode ser verificada digitando:

#uname –r

Que deverá retornar “2.6.20-krg”

 

Gerenciamento

 

O gerenciamento é feito pelo “krgadm”. Digita-se man krgadm para verficar o seu manual. Em resumo, os seguintes comandos são suficientes:

 

Exibe o status dos nós disponíveis:

#krgadm nodes

 

Exibe informações sobre a inicialização da(s) sessões:

#krgadm cluster

 

Para iniciar o cluster, usa-se o comando abaixo, que irá inicializá-lo com todos os nós:

#krgadm cluster start

 

Uma vez inicializado, os processos serão distribuídos automaticamente pelos nós do cluster.



Comentários
Pesquisar
Sr.
Luciano (201.24.61.xxx) 2009-07-01 10:57:39

Instalei o Kerrighed num conjunto de máquinas. Ela s estao em cluster mas nao es
tao distribuido threa ds entre os nós. Apenas a máquina master do clus ter pro
cessa, os nós ficam com atividade baixíssim a. O que tenho que fazer pra ativar
o balanceamen to de carga entre os nós?
O MTLB nao é uma fun çao básica do
Kerrighed?

Grato

Luciano
re: Sr.
Oliveira (189.97.229.xxx) 2009-07-02 20:48:13

Caro, luciano, não existe MTLB no kerrighed, ele s uporta workload schedulers es
critos customizáveis, escritos para fins específicos, ele migra threads leves,
é necessário customização para isso aconte cer. e um bom conhecimento de desenv
olvimento de k ernel.
Módulo Vmware
Antonio Carlos (189.97.225.xxx) 2009-07-03 12:53:27

Oliveira,

Fizemos os testes com o Módulo do bi ll e escalona SMP, abandonamo
s a migração, full sm p é mais eficiente.
Vou ver com o marcos se ele tem o c
ontato do bill, foi o marcos que me passou o módulo.
fuiz.
Re: Módulo Vmware
Bill (189.97.225.xxx) 2009-07-03 13:02:25

Pessoal,
Vamos falar via msn.

um abraço
Sergio Palhano (189.103.144.xxx) 2009-07-13 13:40:58

Boa tarde,

Estamos testando a instalação do Kerri ghed conforme seu tutorial. T
udo ocorreu como desc rito exceto o arquivo jar que não foi possivel bai xar.

P
oderia atualizar o link de download?

Obrig ado,

Sergio Palhano
admin (SAdministrator) 2009-07-14 10:23:33

Olá Sergio
Desculpe pelo link quebrado, já foi co rrigido.

Abraço,
João
Somente usuários registrados podem escrever comentários!

!joomlacomment 4.0 Copyright (C) 2009 Compojoom.com . All rights reserved."

 
João F. M. Figueiredo, Creative Commons License
Todo conteúdo, exceto onde indicado ao contrário, está licenciada sob uma Licença Creative Commons.