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 • ‎中文(中国大陆)‎


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 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"

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.

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"

Usar distcc 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"

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.

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

Utilizar distcc para realizar el bootstrap

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 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 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 de distcc

La aplicación distcc tiene características adicionales y aplicaciones para dar soporte al trabajo en un entorno 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.

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/

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.

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.

-march=native

A partir de la versión 4.3.0 de GCC, el compilador ofrece soporta para la opción -march=native</t> 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 <tt>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

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