Compilación distribuida …

20 04 2008

Para los que desarrollen notarán que muchas veces empleamos una cantidad de tiempo determinada a la hora de construir nuestro proyecto. Puede llegar incluso a parecer bastante, más aún si el número de dependencias de nuestro proyecto es alto y cada una en sí compleja. Existen herramientas que nos pueden auxiliar para optimizar el tiempo de compilación de nuestro proyecto. A continuación expondremos algunas conocidas y cómo usarlas:

distcc

Quizás una de las que más nos pueda ayudar sea distcc ( Distributed C/C++ Compiler ). Sirve para distribuir la construcción de nuestro proyecto de C, C++, Objective C ú Objective C++ a través de un grupo de ordenadores o incluso en nuestra misma máquina. Lo mejor que tiene es que no necesita que todas las máquinas en el grupo de compilación tengan el mismo sistema de archivos, relojes sincronizados, las mismas bibliotecas o cabeceras instaladas, arquitecturas o incluso el mismo sistema operativo. Sí requiere que se use el mismo compilador en todas. Para esta guía se utilizó el compilador gcc de GNU que nos ayudará en cuanto a la portabilidad si montaremos la compilación a través de distintas arquitecturas o sistemas. Para comenzar:

# apt-get install distcc distccmon-gnome

El programa distccmon-gnome nos ayudará a monitorear el proceso de compilación a través de las máquinas.

El distcc opera a modo de cliente/servidor. En la máquina que recibirá el paquete a compilar estará escuchando un servidor: distccd y en la máquina que pide el servicio se usará un cliente: distcc.

Servidor

Para montar el distcc como servidor podemos auxiliarnos del fichero de configuración /etc/default/distcc que se instala con el paquete:

STARTDISTCC="true" # define si levanta el servicio con el arranque del sistema
ALLOWEDNETS="xxx.xxx.xxx.xxx" # Redes permitidas, escucha en estas redes para compilar
LISTENER="127.0.0.1" # Interfaz desde el cual escuchará, por defecto es local 127.0.0.1

Luego:

# /etc/init.d/distcc restart

Si no podemos lograr levantar el servidor mediante el demonio por esta vía podemos usar la línea de comando directamente. Tomando como referencia los datos anteriores el comando quedaría así:

# distccd --daemon --allow xxx.xxx.xxx.xxx

Cliente

Para correr el cliente tenemos variantes todas explicadas en el manual de uso de distcc:

# man distcc

Existen 3 modos de uso de distcc. Sólo se recomienda usar uno, y no mezclar variantes. Aquí explicaremos solamente 2.

Modo máscara

El primero se llama módo enmascarado ( masquerade mode ), y lo que hace es interceptar las llamadas al compilador ejecutándose él por defecto. Lo bueno de esta vía es que tendremos disponible siempre implícitamente el distribuidor para compilar en otras máquinas lo que nos propicia que podamos compilar distribuidamente con todas las herramientas posibles, lo malo es que si no nos encontramos en un ambiente cerca de otras máquinas el distribuidor tratará de resolver la compilación por su cuenta. Es aquí donde quizás sea útil definir la variable DISTCC_FALLBACK. Por defecto el distribuidor si falla en otra pc, tratará de compilar localmente. Podemos eliminar ese modo de operación con:

# export DISTCC_FALLBACK=0

Para habilitar el modo máscara crearemos un directorio en el cual redireccionaremos los vínculos a los compiladores reales en nuestra pc, luego declararemos ese directorio en la variable PATH que define rutas globales para los recursos en la pc. Aquí definiremos la ruta nuestra antes que las restantes para que trate de buscar los compiladores en la ruta definida y no en la ruta real. De este modo enmascaramos su uso. Quedaría así:

# mkdir /usr/lib/distcc/bin
# cd /usr/lib/distcc/bin
# ln -s ../../../bin/distcc gcc
# ln -s ../../../bin/distcc cc
# ln -s ../../../bin/distcc g++
# ln -s ../../../bin/distcc c++

Luego editamos el fichero /etc/bash.bashrc para añadir la ruta antes de las reales. Quedaría así la línea referente a la variable PATH:

if [ -d /usr/lib/distcc/bin ]; then
export DISTCC_HOSTS="distcc"
export PATH=/usr/lib/distcc/bin:$PATH
fi

La variable DISTCC_HOSTS define las máquinas en las que enviaremos la petición de compilar.

Modo explícito

El segundo método se vale en definir a la hora de compilación todas las directivas para distribuir la compilación. Necesitamos declarar dos variables para ello. La primera es DISTCC_HOSTS que vimos anteriormente. La segunda se le pasa como un argumento a la herramienta que esté compilando:

$ make -j8 CXX="distcc"

Esto es un ejemplo de cómo se puede llamar. La opción j8 declara cuantos trabajos de compilación como máximo se deben ejecutar. Por defecto cada núcleo de procesamiento procesa 2 trabajos en paralelo. Para los casos que compilaremos en una pc con 2 núcleos tendremos un máximo de 4 trabajos máximos.

Mientras se esté compilando podemos ejecutar el distccmon-gnome que mostrará una ventana con el estado del proceso.

Advertisements

Actions

Information

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s




%d bloggers like this: