La Gaceta de Linux ... ¡ haciendo a Linux un poco más divertido !

Velocidad Compilando con Distcc

Por V. L. Simpson

Traducción al español por Victor Reyes
el día 4 de Abril de 2005, para La Gaceta de Linux

Introducción

¿Cuándo fue última vez que compilaste un núcleo (kernel) de linux?

¿Ayer? ¿La semana pasada? ¿Hace cinco minutos?

¿En una 486?

Tampoco recuerdo.

¿Recuerdas cuanto tiempo tomó?

Eso lo recuerdo. Demasiado. Demasiado terriblemente.

Ahora porqué desearía compliar el último núcleo en una 486?

Usualmente no lo haría. Pero con la trágica muerte de mi computadora me ví forzado a cambiar mis necesidades a una vieja 486 que alguien me había dado. La había estado usando como un servidor de tiempo NTP para mi red casera. Dicho lo suficiente lo que había en el servidor NTP no era lo último ni lo mejor. La otra computadora en la red no era mucho mejor que la 486. (Una portátil abandonada con un minúsculo disco duro.)

Bueno estaba arruinado porque necesitaba mi Emacs. Así que quite el disco duro de la computadora muerta y lo conecté a la 486.

Funcionó sin defectos, el cual es un testamento de el núcleo de Linux y la calidad y eficiencia del Software GNU. Realmente no sabía que esperar con respecto a la respuesta y el comportamiento general del ambiente, pero en modo de consola no noté diferencia. Aun el sistema de ventana X funcionó bien, no obstante se tardaba en el arranque. Ahora, no había forma que GIMP ó Mozilla fueran ejecutados con algún tipo de utilidad, pero pude usar Emacs y lynx ó dillo sin muchos problemas.

Pero ¿realemente quería sentarme a través de algo que tomaría al menos unas cuantas horas? La verdad, no. Creo que podría lavar los platos, podar el cesped ó ver TV pero, oye, la TV apesta. Mejor veo compilar el núcleo.

Entra a award-winning distcc, una interfaz de un compilador distribuido para gcc escrito por Martin Poole.

Distcc

Distcc consiste de dos programas binarios: distccd y distcc.

distccd se ejecuta como un demonio (daemon) que administra el tráfico de red. Pasando archivos de código pre-procesados a otras computadora a través de una red con un compilador instalado, efectivamente tienes dos o más compilaciones trabajando a la vez.

distcc es una interfaz para gcc y g++. Especifica distcc como el compilador en lugar de gcc y transparentemente maneja toda la magía que está pasando. distcc puede ser usado para todos los trabajos de compilación ya sea que necesites las capacidades de red o no, ej., puedes compilar un archivo ó miles, tu eliges.

La forma más facil de demostrar las habilidades de distcc es usarlo para compilarse por sí mismo como un ejemplo de compilación distribuida.

Demostraré como compilar distcc y darme el tiempo para la compilación inicial, despúes recompilar usando distcc en lugar de gcc.

Requerimientos mínimos:

Dos computadoras conectadas en red designadas como un servidor y un cliente.

El servidor:
Esta máquina debe tener un ambiente de desarrollo C/C++ completamente instalado. También necesitarás cualquier otro paquete de desarrollo (readline, ncurses, gtk+, lo que sea) para la parte de software en particular que necesitará para la compilación.

distcc no requiere de nada en especial.

Nota: Hay un par de otros programas creados por distcc: distccmon-text y distccmon-gnome.

Estos son programas de monitoreo que te muestran lo que esta sucediendo durante una sesión de compilación de distcc. La versión de *-gnome necesita GTK como mínimo pero si no lo tienes instalado no te preocupes.

El cliente:
Esta máquina solamente necesita los compiladores instalados. No necesitas libc, ncurses, cabeceras del núcleo ó el arcenal infinito de cosas de las bibliotecas y cosas que parecen necesitarse hoy en día.

distcc código fuente disponible aquí:
código fuente de distcc.

Construyendo distcc, la primera ejecución:

Procedimiento de Operación Estandard:

$ tar -jxvf distcc*
(usa la bandera flag no z con tar, distcc es bzip2ed).
$ cd distcc*
$ ./configure
$ time make 
(no olvides el comando time).

distcc es pequeño y no requiere de mucho tiempo para crearse. Aquí esta el tiempo de la 486DX antes mencionada:

     Sin distcc 
     real    13m45.185s
     user    12m4.320s
     sys     1m7.120s

Tomó más tiempo para ejecutar el guión de configuración (configure) que lo que tomó la compilación.

Instalación de los binarios:

make install
distcc y distccd tienen que estar en /usr/local/bin

Para las máquinas clentes: Tranfiere una copia de distccd a /usr/local/bin ó el deposito de binarios de tu elección.

Ahora para usar distcc para recompilar distcc.

Asegurate que estas en el directorio fuente de distcc

$ make clean

Esto limpiará todas las sobras de la primera compilación. No necesitarás la ejecución del guión de configuración (configure) otra vez.

Necesitamos un par de minutos para configurar distcc.

1. Ejecuta el demonio distccd en ambas computadoras.

$ distccd --daemon

Se quejará que no hay usuario de distcc. No hagas caso de la advertencia.
Puedes checar viendo que se esta ejecutando actualmente vía "$ps -ax | grep distccd" para asegurar tus preocupaciones.

2. Fija la variable del ambiente en DISTCC_HOSTS:

Puedes usar la dirección IP ó si tu archivo esta configurado apropiadamente con los nombres de tus computadoras en tu /etc/hosts.

Por el momento tengo dos computadoras:
mothra en 192.168.1.2
ghidra en 192.168.1.3 (Esta es la portátil de 120MHz rescatada. Esta sería mi computadora principal pero no tiene el espacion que necesito.)

Fija la variable (sintaxis sh, ajustadas para tu shell):

$ export DISTCC_HOSTS="mothra ghidra"

o

$ export DISTCC_HOSTS="192.168.1.2 192.168.1.3"

De cualquier forma no importa.
NOTA: Nombre ó direcciones son delimitadas por espacios.

Recompilar el código:

$ time make -j4 CC=distcc

Explicación de la linea de comandos:

time: (tiempo) es obvio.

make -j4:
la bandera -j es ejecutar "comandos múltiples" a la vez de make. Lee la información del manual para una información más especifica. Confía, solo usa -j4 por ahora.

CC=distcc:
Sobre escribe las directivas configuradas del compilador. De esta forma puedes hacer una configuración regular con gcc definidas en el archivo makefile. distcc es bueno sin forzarlo a procedimientos complicados para usarlo.

distcc compilado con distcc
     real    6m38.089s
     user    2m42.200s
     sys     0m29.520s

!Corta a la mitad el tiempo! No te puedes quejar.

Los siguientes muestran las veces para algunos de mis programas favoritos compilados con y sin distcc, utilizando los dos nodos instalados mencionados arriba.

Recuerda, estoy compilando con una 486 sin distcc.

                     		  
     Dillo Web Browser
Sin Distcc Con Distcc real 52m14.120s real 22m31.975s user 47m24.820s user 5m12.630s sys 3m29.220s sys 1m23.930s

     The BASH Shell
Sin Distcc Con Distcc real 75m25.306s real 18m22.613s user 69m2.110s user 3m27.950s sys 5m8.030s sys 0m58.980s

Esto fue sorprendente para mi. Esto es 1/4 del tiempo de compilación de distcc!

Conclusión:

distcc es flexible. Puedes usarlo como un compilador de paso a paso ó configurar tus creaciones para usarlo para todas las compilaciones.

Puedes definir los anfitriones (hosts) disponibles en el archivo $HOME/.distcc/hosts.

Puedes forzar a distcc para que de preferencia a una máquina en vez de otra listando el orden en .distcc/hosts ó DISTCC_HOSTS en las variables del ambiente.

Por ejemplo, que mejor que tener mi pobre escritorio 486 en un estado casi inútil como gcc asume el control sobre el sistema, configurar DISTCC_HOSTS='ghidra' y toda la compilación se enviá a la computadora portatil más rápida.

Más documentación en distcc web site.

Oh, sí - la compilación del núcleo. ¿Cuanto tiempo tomó? No sé. Dije al diablo, nada más me quedare con la almacenada de la instalación de mi Slackware. Aun con distcc tomaría para siempre. Tal vez caeré en algun punto - pero creo que mejor lo ahorraré para ese procesador Athlon que he estado deseando.

 


[BIO] V. L. Simpson es nada más otro GNU Geek. Usa Emacs como su sistema operativo que es atada a una distribución de Slackware Linux.

Pronto el nombre que usa para conectarse (vls) será tan famoso como RMS y esr.

Copyright © 2004, V. L. Simpson. Publicado bajo los términos de la Open Publication License

Publicado en el número 107 de Linux Gazette, Octubre 2004