Distcc

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

Other languages:
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 Utilizar distcc para realizar el bootstrap.

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.

Instalar el software

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.

Auto iniciar el demonio distcc

Para que distccd arranque de forma automática se debe seguir las instrucciones siguientes dependiendo del sistema de inicio utilizado.

Usar 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

Usar systemd

Editar /etc/systemd/system/distccd.service.d/00gentoo.conf y añadir los clientes permitidos en formato CIDR. A continuación se muestra un ejemplo:

ARCHIVO /etc/systemd/system/distccd.service.d/00gentoo.confDefinir ALLOWED_SERVERS
Environment="ALLOWED_SERVERS=192.168.1.0/24"
Nota
The name "ALLOWED_SERVERS" here is rather confusing as it refers to the clients that are allowed to connect to the local distccd server. Nevertheless, it is this variable which is used in the distccd service as value for the --allow option – see /usr/lib/systemd/system/distccd.service.

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

Configuración

Echemos un vistazo a la configuración de distcc.

Especificar las máquinas participantes

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

The following is an example list of host definitions. In most cases, variants of lines 1 and 2 suffice. The latter uses the /limit syntax to inform distcc about the maximum amount of jobs to be launched on this node. More information about the syntax used in lines 3 and 4 can be found in the distcc manual page.

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"

Usar distcc con Portage

Setting up Portage to use distcc is easy. It is a matter of enabling the distcc feature, and setting a decent value for the number of simultaneous build jobs (as distcc increases the amount of build resources).

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

The use of -lM in the MAKEOPTS variable will prevent spawning too many tasks when some of the distcc cluster hosts are unavailable (increasing the amount of simultaneous jobs on the other systems) or when an ebuild is configured to disallow remote builds (such as with gcc). This is accomplished by refusing to start additional jobs when the system load is at or above the value of M.

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"

For instance, when there are two quad-core host PCs running distccd and the local PC has a dual core CPU, then the MAKEOPTS variable could look like this:

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"

While editing the make.conf file, make sure that it does not have -march=native in the CFLAGS or CXXFLAGS variables. distccd will not distribute work to other machines if march is set to native. The appropriate -march= value can be obtained by running the following command:

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

See Inlining -march=native for distcc for more information.

Usar distcc con automake

This is, in some cases, easier than the Portage setup. All that is needed is to update the PATH variable to include /usr/lib/distcc/bin/ in front of the directory that contains gcc (/usr/bin/). However, there is a caveat. If ccache is used, then put the distcc location after the ccache one:

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/

Instead of calling make alone, add in -jN (where N is an integer). The value of N depends on the network and the types of computers that are used to compile. A heuristic approach to the right value is given earlier in this article.

Utilizar distcc para realizar el bootstrap

Using distcc to bootstrap (i.e. build a working toolchain before installing the remainder of the system) requires some additional steps to take.

Paso 1: Configurar Portage

Boot the new box with a Gentoo Linux LiveCD and follow the installation instructions, while keeping track of the instructions in the Gentoo FAQ for information about bootstrapping. Then configure Portage to use 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

Run distcc-config --install to setup distcc; substitute the host# in the example with the IP addresses or hostnames of the participating nodes.

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

Distcc is now set up to bootstrap! Continue with the proper installation instructions and do not forget to run emerge distcc after running emerge @system. This is to make sure that all of the necessary dependencies are installed.

Nota
During bootstrap and emerge @system distcc may not appear to be used. This is expected as some ebuilds do not work well with distcc, so they intentionally disable it.

Extras de distcc

The distcc application has additional features and applications to support working in a distcc environment.

Monitores de distcc

Distcc ships with two monitoring utilities. The text-based monitoring utility is always built and is called distccmon-text. Running it for the first time can be a bit confusing, but it is really quite easy to use. If the program is run with no parameter it will run just once. However, if it is passed a number it will update every N seconds, where N is the argument that was passed.

user $distccmon-text 10

The other monitoring utility is only enabled when the gtk USE flag is set. This one is GTK+ based, runs in an X environment, and it is quite lovely. For Gentoo, the GUI monitor has been renamed to distccmon-gui to make it less confusing (it is originally called distccmon-gnome).

user $distccmon-gui

To monitor Portage's distcc usage:

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

Usar SSH para la comunicación de distcc

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 los permisos del fichero como se muestra a continuación:

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

To set up the hosts test1 and test2, run:

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

Please note the @ (@ sign), which specifies ssh hosts for distcc.

Finally, tell distcc which SSH binary to use:

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

It is not necessary to run the distccd initscript on the hosts when distcc communicates via SSH.

Solución a problemas

If a problem occurs while using distcc, then this section might help in resolving the problem.

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

Next update the /var/log path of the distccd configuration file in /etc/conf.d/distccd to the distcc directory created in the step before:

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.

Sometimes distcc might cause a package to fail to compile. If this happens, please report it.

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.

-march=native

Starting with GCC 4.3.0, the compiler supports the -march=native option which turns on CPU auto-detection and optimizations that are worth being enabled on the processor on which GCC is running. This creates a problem when using distcc because it allows the mixing of code optimized for different processors. For example, running distcc with -march=native on a system that has an AMD Athlon processor and doing the same on another system that has an Intel Pentium processor will mix code compiled on both processors together.

Preste atención a la siguiente advertencia:

Advertencia
Do not use -march=native or -mtune=native in the CFLAGS or CXXFLAGS variables of make.conf when compiling with distcc.

To know the flags that GCC would enable when called with -march=native, execute the following:

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

Ver también

  • The DistCC Cross-compiling guide explains how using one architecture to build programs for another architecture is done through distcc. This can be as simple as using an Athlon (i686) to build a program for a K6-2 (i586), or using a SPARC to build a program for a PowerPC.

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.