Acelerando a compilação com o distcc
Colaboração: Carlos E. Morimoto
Data de Publicação: 05 de Setembro de 2005
Se você é do tipo que passa muito tempo compilando
programas, esta dica lhe será bem útil.
Você pode utilizar outros micros da rede para reduzir o
tempo de compilação utilizando o 'distcc". Ele permite
que os jobs da compilação (criados usando a opção -j)
sejam processados pro diferentes PCs da rede, reduzindo
o tempo de compilação quase que proporcional mente. Com 5
micros de configuração similar, a compilação é realizada
em aproximadamente 1/4 do tempo. Ele é usado pelos
desenvolvedores de muitos projetos para diminuir o
tempo perdido com cada compilação e assim acelerar o
desenvolvimento, sobretudo nas fases de teste.
Para usar o distcc não é necessário que todos os micros
possuam configuração similar, nem que estejam rodando
a mesma distribuição. É recomendável apenas que sejam
sempre utilizadas versões similares do distcc em todos,
para evitar problemas inesperados.
Ele está disponível na maioria das distribuições, procure
pelo pacote "distcc". Nas distribuições derivadas do Debian
ele pode ser instalado através do apt-get:
# apt-get install distcc
Naturalmente, você deve instalá-lo em todas as máquinas
que serão usadas. Como medida de segurança, mesmo depois de
instalado ele fica explicitamente desabilitado no arquivo
"/etc/default/distcc". Para ativar, edite o arquivo e mude
a opção "STARTDISTCC="false" para:
STARTDISTCC="true"
A seguir, na opção "ALLOWEDNETS" você deve especificar
quais micros poderão usar o servidor, especificando
diretamente o IP ou nome de cada um, ou autorizando
diretamente toda a faixa de endereços da rede local. Neste
caso a opção fica:
ALLOWEDNETS="192.168.1.0/24"
Concluída a configuração, reinicie o serviço, em todas
as máquinas:
# /etc/init.d/distcc restart
A grosso modo, o distcc trabalha enviando trechos de
código para as demais máquinas da rede, juntamente com
os parâmetros de compilação necessários e recebe de volta
os binários já compilados. Apenas o seu micro precisa ter
o código fonte do que está sendo compilado, mas todas as
máquinas que forem ser usadas precisam ter os compiladores
necessários para compila-lo. Ao instalar o sistema em cada
máquina, aproveite para sempre habilitar a categoria de
desenvolvimento na seleção dos pacotes. É desejável também
que, mesmo que sejam usadas distribuições diferentes,
todas as máquinas tenham instaladas versões idênticas ou
pelo menos similares do gcc e g++.
Na hora de compilar, comece criando a variável "DISTCC_HOSTS" no shell, que especifica quais máquinas da rede serão utilizadas pelo distcc durante a compilação, como em:
$ export DISTCC_HOSTS='127.0.0.1 192.168.1.33 192.168.1.100 192.168.1.156'
Se preferir, você pode tornar esta configuração permanente,
salvando a lista dentro do arquivo ".distcc/hosts", dentro
do diretório home do usuário usado nas compilações. Depois
de criar a pasta .distcc, você pode usar o comando:
$ echo '127.0.0.1 192.168.1.33 192.168.1.100 192.168.1.156' > ~/.distcc/hosts
Depois de criada a lista com os hosts, você pode compilar
da forma usual, adicionando os parâmetros "-jX CC=distcc"
depois do "make", onde o X é o número de jobs simultâneos
que serão criados. Ao usar o distcc, uma regra geral é
usar 3 jobs por processador, por máquina. Com 4 máquinas
monoprocessadas, -j12 é um bom número. Em algumas
situações, usar um número maior de jobs pode reduzir um
pouco o tempo de compilação e em outras vai simplesmente
retardar o processo.
No caso da compilação do Kernel, os comandos seriam:
$ make -j12 CC=distcc bzImage
$ make -j12 CC=distcc modules
# make modules install
Note que não usei o distcc no "make modules install",
pois ele não envolve compilação, apenas a instalação dos
módulos gerados no comando anterior. O mais correto é
sempre fazer compilações usando um login de usuário e usar
o root apenas para rodar os comandos de instalação. Para
fazer isso, é necessário que a conta de usuário tenha
sempre permissão de acesso completa à pasta com o código
fonte. Se você está compilando o Kernel e o fonte está na
pasta "/usr/src/linux/2.6.13/" (que originalmente pertence
ao root), você pode pode usar o comando:
# chown -R joao.joao /usr/src/linux/2.6.13/
Para transferir a posse da pasta para o usuário joao,
grupo joao, de forma que ele possa fazer a compilação sem
enfrentar problemas de permissão.
Gostou da dica? Conheça outros trabalhos do autor.