Distcc

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Distcc and the translation is 100% complete.

Other languages:
English • ‎español • ‎français • ‎italiano • ‎日本語 • ‎한국어 • ‎русский • ‎Türkçe • ‎中文(中国大陆)‎


External resources

Distcc es un programa diseñado para distribuir tareas de compilación a través de la red hacia máquinas participantes. Consiste en un servidor, distccd y un programa cliente, distcc. Distcc puede trabajar de forma transparente con ccache, Portage y Automake realizando una sencilla configuración.

Cuando planee utilizar distcc para ayudarle a realizar el bootstrap en una instalación Gentoo, asegúrese de leer Utilizar distcc para realizar el bootstrap.

Configuración

Dependencias

Para utilizar distcc, todas las máquinas en la red deben tener la misma versión de GCC. Mezclar 3.3.x (variando la x) es correcto, pero mezclar 3.3.x y 3.2.x "puede" resultar en errores en tiempo de compilación o ejecución.

Instalar distcc

Distcc incluye un monitor gráfico para monitorizar las tareas que un computador está enviando para compilación. Este monitor se habilita cuando el ajuste USE gtk está activado.

Después de configurar el ajuste USE, instale el paquete sys-devel/distcc:

root #emerge --ask distcc
Importante
Recuerde instalar sys-devel/distcc en todas las máquinas que vayan a participar en la construcción.

Configurar Portage para utilizar distcc

Configurar Portage para usar distcc es fácil. Siga estos sencillos pasos en cada sistema que vaya a participar en la compilación distribuida.

En primer lugar asegúrese de que sys-devel/distcc está instlado:

root #emerge --ask distcc

A continuación, ajuste la variable MAKEOPTS y la variable FEATURES tal y como se describe abajo. Una estrategia común es definir N como el doble del número total de CPUs disponibles (locales y remotas) más uno y definir M como el número de CPUs locales. En el caso en el que las máquinas participantes no estén disponibles o cuando el ebuild a instalar requiera un compilación exclusivamente local (por ejemplo gcc), entonces el ajuste -lM evitará que se lancen demasiadas tareas.

ARCHIVO /etc/portage/make.conf Ajustar MAKEOPTS y FEATURES
MAKEOPTS="-jN -lM"
FEATURES="distcc"

Por ejemplo, cuando hay dos equipos PC anfitriones con cuatro núcleos que corren distcc y el equipo PC local tiene una CPU con doble núcleo entonces la variable MAKEOPTS podría ser:

ARCHIVO /etc/portage/make.conf Ejemplo jde MAKEOPTS para dos equipos PC con cuádruple núcleo (remotos) y un equipo PC con dos núcleos (local)
# Dos equipos remotos con cuatro núcleos cada uno = 8 núcleos remotos
# Un equipo local con dos núcleos = 2 núcleos en local
# El número total de núcleos es 10, de modo que:N = 2*10+1 and M=2
MAKEOPTS="-j21 -l2"

Cuando edite el fichero make.conf, asegúrese de que no se ha definido -march=native en las variables CFLAGS o CXXFLAGS. distcc no distribuirá trabajos a otras máquinas si march está definido a native. El valor adecuado para -march= se puede obtener lanzando la siguiente orden:

user $gcc -Q -march=native --help=target

Lea -march=native en línea para distcc para ampliar la información.

Especificar las máquinas participantes

Utilice la orden distcc-config para indicar la lista de máquinas.

A continuación se muestra una lista ejemplo de definiciones de equipos. En la mayoría de los casos, serán suficientes variaciones de las líneas 1 y 2. Se puede encontrar más información sobre la sintaxis de las líneas 3 y 4 en la página del manual de distcc.

CÓDIGO Ejemplos de definiciones de máquinas
192.168.0.1 192.168.0.2 192.168.0.3
192.168.0.1/2 192.168.0.2 192.168.0.3/10
192.168.0.1:4000/2 192.168.0.2/1 192.168.0.3:3632/4
@192.168.0.1 @192.168.0.2:/usr/bin/distccd 192.168.0.3

Hay otras formas de configurar máquinas. Eche un vistazo a la página del manual de distcc (man distcc) para obtener más información.

Si se van a realizar compilaciones en la máquina local debería escribir localhost en la lista de máquinas. Contrariamente, si no se va a utilizar la máquina local para compilar, omítala de la lista de máquinas. En una máquina lenta usar localhost puede de hecho hacer las cosas más lentas. Asegúrese de comprobar los ajustes para mejorar el rendimiento.

Configuraremos distcc para que usar los equipos mencionados en la primera línea del ejemplo:

root #/usr/bin/distcc-config --set-hosts "192.168.0.1 192.168.0.2 192.168.0.3"

Modifique /etc/conf.d/distccd y asegúrese de usar la directiva --allow para permitir únicamente máquinas de confianza. Para mayor seguridad debería utilizar también la directiva --listen para indicarle al demonio distcc en qué dirección IP debe escuchar (en sistemas con más de una dirección IP). Se puede encontrar más información acerca de seguridad en distcc en las notas sobre seguridad de distcc.

Importante
Es importante utilizar --allow y --listen. Por favor, lea la página del manual de distccd o el documento sobre seguridad indicado arriba para obtener más información.

Ahora inicie el demonio distcc en todas las máquinas participantes:

root #rc-update add distccd default
root #rc-service distccd start

Configurar distcc para trabajar con Automake

Esto es más fácil de configurar en algunos casos que con Portage. Todo lo que se necesita hacer es actualizar la variable de entorno PATH para incluir /usr/lib/distcc/bin delante del directorio que contiene gcc (/usr/bin/). No obstante, hay un problema. Si se utiliza ccache, entonces deberá poner la localización de distcc después de la de ccache:

root #export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"

Coloque esto en el archivo ~/.bashrc del usuario o fichero equivalente para tener configurada la variable PATH cada vez que que el usuario entre en el sistema o defínala globlamente en un fichero en /etc/env.d/

En lugar de llamar únicamente a make, agregue -jN (donde N es un número entero). El valor de N depende de la red y de la tipología de los computadores que se utilizan para compilar. Una aproximación heurística a los valores correctos se ha dado anteriormente en este artículo.

Configurar distcc para trabajar con ssh

La configuración de distcc a través de ssh incluye algunos detalles. En primer lugar, genere un par de claves SSH sin contraseña. Observe que portage compila los programas con el usuario portage. La carpeta de inicio del usuario portage es /var/tmp/portage/ lo que implica que las claves se deben almacenar en /var/tmp/portage/.ssh/.

root #ssh-keygen -b 2048 -t rsa -f /var/tmp/portage/.ssh/id_rsa

A continuación cree una sección para cada máquina en el fichero de configuración de SSH:

ARCHIVO /var/tmp/portage/.ssh/config Añadir las secciones para cada equipo
Host test1
  HostName 123.456.789.1
  Port 1234
  User UserName
Host test2
  HostName 123.456.789.2
  Port 1234
  User UserName

También asegúrese de que todas las máquinas están listadas en el fichero known_hosts y añada la clave pública al fichero authorized_keys de todas las máquinas. Para configurar las máquinas test1 y test2 lance:

root #/usr/bin/distcc-config --set-hosts "@test1 @test2"

Por favor, observe que el símbolo '@', especifica las máquinas ssh para distcc.

Compilación cruzada

La compilación cruzada consiste en construir programa para otra arquitectura. Esto puede ser tan simple como usar un Athlon (i686) para construir un programa para un K6-2 (i586) o usar un SPARC para construir un programa para un PowerPC. Esto se documenta en la guía de compilación cruzada.

Utilizar distcc para realizar el bootstrap

Paso 1: Configurar Portage

Inicie la nueva máquina con un LiveCD de Gentoo Linux y siga las instrucciones de instalación mientras se siguen las instrucciones en las FAQ de Gentoo para obtener más información sobre el bootstrap. A continuación configure Portage para que utilice distcc:

ARCHIVO /etc/portage/make.conf Configure Portage para usar distcc
FEATURES="distcc"
MAKEOPTS="-jN"

Actualice también la variable PATH en la sesión de instalación:

root #export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"

Paso 2: Obtener distcc

Instale sys-devel/distcc:

root #USE='-*' emerge --nodeps sys-devel/distcc

Paso 3: Configurar distcc

Lance distcc-config --install para configurar distcc. Sustituya la cadena máquina# del ejemplo por las direcciones IP o nombres de la máquinas que participan como nodos DistCC.

root #/usr/bin/distcc-config --set-hosts "localhost máquina1 máquina2 máquina3 ..."

¡Distcc ya está configurado para hacer bootstrap! Continúe con las instrucciones de instalación adecuadas y no olvide lanzar kbd>emerge distcc</kbd> después de lanzar emerge @system. Esto asegurará que las dependencias necesarias también se instalarán.

Nota
Durante el arranque y emerge system puede que parezca que distcc no se está utilizando. Esto es normal ya que algunos ebuilds no funcionan bien con distcc por lo que se deshabilita intencionadamente.

Solución a problemas

Algunos paquetes no utilizan distcc

A medida que se instalan algunos paquetes, los usuarios observarán que la construcción de algunos de ellos no se está realizando (y por tanto no se están construyendo en paralelo). Esto puede ocurrir porque el fichero Makefile del paquete no soporta operaciones en paralelo o el mantenedor del ebuild ha deshabilitado explícitamente dichas operaciones en paralelo debido un problema conocido.

En algunas ocasiones, distcc puede causar que un paquete falle en su compilación. Si sucede esto, por favor informe de ello.

Versiones mezcladas de GCC

Si el entorno aloja versiones diferentes de GCC, probablemente tenga problemas extraños. La solución es asegurarse de que todas las máquinas tengan la misma versión.

Las actualizaciones de Portage más recientes utilizan ${CHOST}-gcc (menos gcc) en lugar de gcc. Esto significa que si se mezclan máquinas i686 con otros tipos de máquina (i386, i586) entonces las construcciones darán problemas. Una solución temporal a esto es lanzar export CC='gcc' CXX='c++' en un terminal de root o ponerlo en /etc/portage/make.conf.

Importante
Hacer esto explícitamente redefine algún comportamiento de Portage y puede que tenga resultados un tanto extraños en el futuro. Haga esto solo si no puede evitar el mezclar CHOSTs.

-march=native

A partir de la versión 4.3.0 de GCC, el compilador ofrece soporta para la opción -march=native que habilita la detección automática de la CPU y de las optimizaciones que merece la pena activar en el procesador sobre el que está corriendo GCC. Esto es un problema cuando se utiliza distcc, ya que permite mezclar código optimizado para diferentes procesadores. Por ejemplo, al correr distcc con -march=native en un sistema que tiene un procesador AMD Athlon y haciendo lo mismo en otro sistema que tiene un procesador Intel Pentium processor se mezclará el código compilado en ambos procesadores.

Preste atención a la siguiente advertencia:

Advertencia
No utilice -march=native o -mtune=native en las varibales CFLAGS o CXXFLAGS de make.conf cuando compile con distcc.

Para conocer los ajustes que GCC habilitaría cuando se llama con -march=native, lance lo siguiente:

user $gcc -march=native -E -v - </dev/null 2>&1 | grep cc1
/usr/libexec/gcc/x86_64-pc-linux-gnu/4.7.3/cc1 -E -quiet -v - -march=corei7-avx \
 -mcx16 -msahf -mno-movbe -mno-aes -mpclmul -mpopcnt -mno-abm -mno-lwp -mno-fma \
 -mno-fma4 -mno-xop -mno-bmi -mno-bmi2 -mno-tbm -mavx -mno-avx2 -msse4.2 -msse4.1 \
 -mno-lzcnt -mno-rdrnd -mno-f16c -mno-fsgsbase --param l1-cache-size=32 \
--param l1-cache-line-size=64 --param l2-cache-size=6144 -mtune=corei7-avx

Extras de distcc

Monitores de distcc

Distcc se distribuye con dos herramientas de monitorización. La basada en texto se construye siempre y se llama distccmon-text. Al lanzarlo la primera puede resultar confuso, pero es muy fácil de utilizar. Si el programa se lanza sin parámetros, correrá solo una vez. Sin embargo si se le pasa un número, actualizará la información cada N segundos, donde N es el argumento indicado.

user $distccmon-text 10

La otra utilidad de monitorización solo se habilita cuando se habilita el ajuste USE gtk. Esta herramienta está basada en GTK+, corre en un entorno X y es bastante encantador. En Gentoo, se ha cambiado el nombre a distccmon-gui para evitar confusiones (originalmente se llamaba distccmon-gnome).

user $distccmon-gui

Para monitorizar el uso de distcc por parte de Portage:

root #DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-text 10
root #DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-gui
Importante
Si el directorio distcc está en otro lugar, cambie la variable DISTCC_DIR adecuadamente.

Recursos externos



This article is based on a document formerly found on our main website gentoo.org.
The following people have contributed to the original document: Lisa Seelye, Mike Frysinger, Erwin, Sven Vermeulen, Lars Weiler, Tiemo Kieft and nightmorph
They are listed here as the Wiki history does not provide for any attribution. If you edit the Wiki article, please do not add yourself here, your contributions are recorded on the history page.