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:
Deutsch • ‎English • ‎español • ‎français • ‎italiano • ‎日本語 • ‎한국어 • ‎polski • ‎русский • ‎Türkçe • ‎中文(中国大陆)‎


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 el apartado para realizar la inicialización.

Instalación

Antes de configurar distcc, echémos un vistazo a la instalación del paquete sys-devel/distcc en todos los equipos.

Requisitos para todos los equipos

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.

Ajustes USE

USE flags for sys-devel/distcc Distribute compilation of C code across several machines on a network

crossdev Enable support for sys-devel/crossdev local
gnome Add GNOME support global
gssapi Enable support for net-libs/libgssglue local
gtk Add support for x11-libs/gtk+ (The GIMP Toolkit) global
hardened Activate default security enhancements for toolchain (gcc, glibc, binutils) global
ipv6 Add support for IP version 6 global
selinux !!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur global
xinetd Add support for the xinetd super-server global
zeroconf Support for DNS Service Discovery (DNS-SD) global

Emerge

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 sys-devel/distcc
Importante
Recuerde instalar sys-devel/distcc en todas las máquinas que vayan a participar en la construcción.

Configuración

Servicio

Para que distccd arranque de forma automática se debe seguir las instrucciones siguientes.

OpenRC

Modifique /etc/conf.d/distccd y asegúrarse de usar la directiva --allow para permitir únicamente máquinas cliente 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.

En el siguiente ejemplo se permite a los clientes distcc correr en 192.168.0.4 y 192.168.0.5 para conectarse al servidor distccd que corre en la máquina local:

ARCHIVO /etc/conf.d/distccdPermitir a clientes específicos conectarse a distccd
DISTCCD_OPTS="--port 3632 --log-level notice --log-file /var/log/distccd.log -N 15 --allow 192.168.0.4 --allow 192.168.0.5"
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

systemd

Editar el fichero /etc/systemd/system/distccd.service.d/00gentoo.conf para añadir los clientes permitidos en formato CIDR. El ejemplo añade todas las direcciones IP en el rango 192.168.1.xxx:

ARCHIVO /etc/systemd/system/distccd.service.d/00gentoo.confDefinir ALLOWED_SERVERS
Environment="ALLOWED_SERVERS=192.168.1.0/24"
Nota
El nombre "ALLOWED_SERVERS" puede llevar a confusiones ya que se refiere a los clientes a los que se le permite conectar al servidor distccd local. Independientemente de esto, el valor de esta variable se utiliza en el servicio distccd para asignarle un valor a la opción --allow. Eche un vistazo al fichero /usr/lib/systemd/system/distccd.service. para obtener información adicional.

Recargar los fichero de unidad después de realizar estos cambios:

root #systemctl daemon-reload

Habilitar el auto arranque de distcc y a continuación arrancar el servicio:

root #systemctl enable distccd
root #systemctl start distccd

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. La última utiliza la sintaxis /limit para informar a distcc sobre el máximo número de trabajos que se deben lanzar en este nodo. 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"

Distcc también ofrece soporte a un modo bombeo (pump) cuando se invoca la orden pump. Esto puede reducir de forma significativa el tiempo de construcción cuando se compilan muchos ficheros en paralelo. Se cachean las cabeceras preprocesadas en el lado servidor y, como resultado, desaparece la continua carga y preprocesado de estos ficheros cabecera.

Para configurar un equipo en modo bombeo, se debe añadir el sufijo ,cpp,lzo a las definiciones de los equipos. El modo bombero requiere de los ajustes cpp y lzo (independientemente de si los archivos son C o C++).

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

Utilización

Con Portage

Configurar Portage para usar distcc es fácil. Es cuestión de habilitar la característica distcc y definir un valor correcto para el número de trabajos simultáneos (ya que así distcc incrementará la cantidad de recursos disponibles para la construcción)

Ajuste la variable MAKEOPTS y la variable FEATURES tal y como se describe abajo.

Una estrategia común es

  • Definir el valor de N al doble del número total (local + remotas) de núcleos de CPU + 1, y
  • Definir el valor de M al número de núcleos de CPU locales

El uso de -lM en la varialble MAKEOPTS evitará lanzar demasiadas tareas cuando alguno de los equipos del cluster de distcc no estén disponibles (incrementando la cantidad de trabajos simultáneos en el resto de los sistemas) o cuando se configure un ebuild para no permitir construcciones en remoto (como con gcc). Esto se logra rechazando el inicio de trabajos adicionales cuando la carga del sistema están en el valor de M o por encima de éste.

ARCHIVO /etc/portage/make.confAjustar MAKEOPTS y FEATURES
# Reemplace N y M por los valores correctos calculados previamente
MAKEOPTS="-jN -lM"
FEATURES="distcc distcc-pump"
Nota
El modo bombeo de Distcc puede reducir significativamente los tiempos de construcción para los paquetes grandes. Considerar la sección sobre cómo especificar las máquinas participantes para obtener más detalles.

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.confEjemplo 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 -v -E -x c -march=native -mtune=native - < /dev/null 2>&1 | grep cc1 | perl -pe 's/ -mno-\S+//g; s/^.* - //g;'

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

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.

Para realizar la inicialización

El uso de distcc para el inicio (esto es, construir una cadena de herramientas antes de instalar el resto del sistema) requiere realizar algunas acciones adicionales.

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.confConfigure 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 los nodos participantes.

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 emerge distcc 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.

Extras

La aplicación distcc tiene características adicionales y aplicaciones para dar soporte al trabajo en un entorno distcc.

Utilidades de monitorización

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.

Un truco consisten en definir DISTCC_DIR en variables de entorno:

root #echo 'DISTCC_DIR="/var/tmp/portage/.distcc/"' >> /etc/env.d/02distcc

Ahora actualice el entorno:

root #env-update
root #source /etc/profile

Para terminar, arranque la aplicación GUI:

root #distccmon-gui

SSH para comunicaciones

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 (o como root si no se ha definido FEATURES="userpriv"). 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/configAñ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

Envíe la clave pública a cada nodo de compilación:

root #ssh-copy-id -i /var/tmp/portage/.ssh/id_rsa.pub NombreDeUsuario@NodoDeCompilación

También asegúrese de que todas las máquinas están listadas en el fichero known_hosts:

root #ssh-keyscan -t rsa <nodo-de-compilación-1> <nodo-de-compilación-2> [...] > /var/tmp/portage/.ssh/known_hosts

Corrija el propietario del fichero como se muestra a continuación:

root #chown -R portage:portage /var/tmp/portage/.ssh/

Para configurar los equipos 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.

Para terminar, indíquele a distcc qué binario SSH debe utilizar:

ARCHIVO /etc/portage/make.conf
DISTCC_SSH="ssh"

No es necesario lanzar el guión de inicio distccd en los equipos cuando distcc se comunica a través de SSH.

Pruebas

Para probar distcc, escribir un simple programa Hola distcc y lanzar distcc en modo hablador para comprobar si se está comunicando correctamente.

ARCHIVO main.c
#include <stdio.h>
 
int main() {
    printf("¡Hola distcc!\n");
    return 0;
}

A continuación, en el modo hablador, compilar el programa utilizando distcc y enlazar el fichero objeto generado en un ejecutable:

user $export DISTCC_VERBOSE=1
user $distcc gcc -c main.c -o main.o # or 'pump distcc <...>'
user $gcc main.o -o main
Nota
Reemplazar la orden distcc por pump distcc si se desea utilizar el modo bombeo.

Debería haber un montón de información acerca de distcc con su configuración, selección de la máquina con la que conectar, conexión a la misma y por último la compilación de main.c. Se la salida no muestra las máquinas distcc esperadas, se debe comprobar la configuración.

Por último, asegurarse de que el programa compilado funciona correctamente. Para probar cada máquina, enumerar las máquinas de compilación en el fichero de máquinas.

user $./main
¡Hola distcc!

Solución a problemas

Si se produce cualquier problema mientras se utiliza distcc, entonces esta sección puede ser de ayuda.

ERROR: failed to open /var/log/distccd.log

A partir del 22 de enero de 2015 la instalación no crea el fichero distccd.log apropiado en /var/log/. Esto afecta aparentemente solo a la versión 3.1-r8 de distcc. Esta incidencia está en proceso de solución (ver bug #477630). Es posible evitar este problema creando manualmente el fichero de registro, asignarle el propietario adecuado y reiniciando el demonio distccd:

root #mkdir -p /var/log/distcc
root #touch /var/log/distcc/distccd.log
root #chown distcc:daemon /var/log/distcc/distccd.log

A continuación actualice la ruta /var/log del fichero de configuración de distccd en /etc/conf.d/distccd para definirla al directorio de distcc creado en el paso anterior:

ARCHIVO /etc/conf.d/distccdActualizar la ruta al registro
DISTCCD_OPTS="--port 3632 --log-level notice --log-file /var/log/distcc/distccd.log -N 15

Para terminar, reinicie el servicio distccd:

root #/etc/init.d/distccd restart

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:

root #export CC='gcc' CXX='c++'

También es posible definir las variables CC y CXX en /etc/portage/make.conf a los valores listados en la orden de arriba.

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.
Nota
No es suficiente tener la versión adecuada de gcc como ranura (slot) en el servidor. Portage utiliza distcc como reemplazo del compilador referenciado por la variable CHOST (esto es, x86_64-pc-linux-gnu) y distccd lo invoca utilizando exactamente el mismo nombre. El compilador del sistema por defecto debe ser la versión adecuada de gcc en todos los equipos que participen en la compilación.

-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

Obtener más información de los registros de emerge

Es posible obtener más información de registro si se habilita el modo hablador. Esto se consigue añadiendo DISTCC_VERBOSE al archivo /etc/portage/bashrc:

ARCHIVO /etc/portage/bashrcHabilitar el registro detallado
export DISTCC_VERBOSE=1

Se puede encontrar el registro detallado en /var/tmp/portage/$CATEGORÍA/$PF/temp/build.log.

Se debe recordar que la primera invocación de distcc visible en build.log no es necesariamente la primera llamada a distcc durante el proceso de construcción. Por ejemplo un equipo de construcción puede ausentarse por un periodo de un minuto durante la fase de configuración cuando se realizan algunas comprobaciones utilizando un compilador (distcc define un periodo de ausencia cuando falla la compilación de un servidor remoto, no importa si falló en la máquina local o no).

Consultar el directorio /var/tmp/portage/$CATEGORÍA/$PF/work/ para investigar este tipo de situaciones. Buscar en otros registros o llamar a make de forma explícita desde el propio directorio de trabajo.

Otra variable interesante que se puede utilizar es DISTCC_SAVE_TEMPS. Cuando se define, guarda la salida estándar y la de error de un compilador remoto que, para las construcciones de Portage, se generan en ficheros dentro del directorio /var/tmp/portage/$CATEGORÍA/$PF/temp/.

ARCHIVO /etc/portage/bashrcGuardar la salida temporal
export DISTCC_SAVE_TEMPS=1

Ver también

  • La guía de compilación cruzada de DistCC explica cómo se utiliza una arquitectura para construir programas para otra arquitectura mediante distcc. Esto puede ser tan simple como utilizar una máquina Athlon (i686) para construir un programa para una K6-2 (i586) o utilizar una máquinaSPARC para construir un programa para una basada en PowerPC.

Recursos externos


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