Publi

Distribuyendo la compilación en varios equipos

linux_cluster Cuando se instala Gentoo o Linux From Scratch, una cosa que llega a ser desesperante son los tiempos de compilación, y es que estos tipos de sistemas son un poco “yo me lo guiso, yo me lo como“, es decir, a partir del código fuente, tú te compilas el sistema operativo completo.

Si a veces, para compilar el kernel, nos podemos tirar varias horas (siempre que lo tengo que hacer, le doy la mínima prioridad al proceso, para poder utilizar mientras el ordenador); cuando toca compilar un entorno de escritorio tipo GNOME, o KDE, puede llegar a ser eterno, sobre todo en máquinas más o menos antiguas.

Una de las grandes ayudas que descubrí en mis años de Gentoo es distcc, un pequeño programa que nos ayuda a distribuir la compilación en varios ordenadores. Gentoo viene preparado para poder utilizar distcc de serie en todas las compilaciones, y se nota bastante cuando por ejemplo se colocan tres ordenadores en red para compilar un paquete tipo OpenOffice (aunque en Gentoo hay versión precompilada, hace años no funcionaba muy bien y era mejor compilarla tú mismo).

Actualmente, me encuentro desde Linux Mint haciendo algunos programas bastante pesados, todos llevan su entorno gráfico hecho en gtkmm y algunas modificaciones conllevan una compilación que suele tardar un minuto, lo malo es que a veces falla algún pequeño detalle y tengo que compilar varias veces, por ello, he decidido aprovechar la potencia de todos los ordenadores de la casa y para ello he instalado distcc en todos:

Lo podemos encontrar en los repositorios de nuestras distribuciones, y si podemos instalar el último paquete “distcc-pump” mejor, por ejemplo, para instalar en Linux Mint/Ubuntu:

$ sudo apt-get install distcc-pump distccmon-gnome

En Gentoo podremos hacerlo así

root$ USE=”gtk” emerge distcc

En Arch:

root$ pacman -S distcc

luego, antes de hacer nada, tenemos que cargar el demonio en todos los ordenadores donde queramos compilar, imaginemos que nuestro equipo (el que dará la orden de compilar) es 192.168.0.6:

$ distccd –allow 192.168.0.6 # Como usuario vale

Tras esto, una vez cargado el demonio en todos los ordenadores, podemos ejecutar en el ordenador principal (el nuestro) la orden de compilar un paquete o un programa hecho por nosotros, para eso, primero debemos establecer una serie de ordenadores donde querremos compilar (todos aquellos donde hemos cargado el demonio):

$ export DISTCC_HOSTS=’192.168.0.6 192.168.0.4 192.168.0.2 192.168.0.20′

He incluido el localhost (192.168.0.6) con la ip de red, porque en algunos equipos, no funciona bien al querer utilizar localhost con IPv6, depende de la configuración del SO.

Ya estamos listos para compilar

$ make -j8 CC=distcc

Esto nos bastaría para enviar a los demás equipos compilar nuestro programa. -j8 indica que podremos compilar en paralelo 8 archivos (debemos jugar con esto en función de los equipos que tengamos).

Ahora bien, este es el método de toda la vida, ahora disponemos de distcc-pump, lo que hace este sistema es que también es capaz de delegar el preprocesamiento a los demás ordenadores (antes estaba todo limitado al host principal), por otra parte, realiza una transmisión más rápida de todos los archivos necesarios para compilar desde tu ordenador hacia los demás ordenadores de la red.

Para utilizar distcc-pump la tarea es algo diferente (nota: dependiendo de la distribución el ejecutable es diferente, distcc-pump, pump, pupmpe… así que tendremos que buscarlo).

$ export DISTCC_POTENTIAL_HOSTS=’192.168.0.6 192.168.0.4 192.168.0.2 192.168.0.20′
$ distcc-pump make -j8 CC=distcc

Ahora es cuestión de montarnos un cluster para hacer nuestras compilaciones…

También podemos compilar a través de Internet, aunque tenemos que asegurarnos de que el tiempo de transmisión compensará con el tiempo de compilación.

Por último, podemos ver el estado de nuestra compilación ejecutando al mismo tiempo que se compila el programa distccmon-text o distccmon-gnome (este segundo tiene entorno gráfico); nos permiten ver el trabajo que está haciendo cada uno.

También podría interesarte...

There are 5 comments left Ir a comentario

  1. Pingback: Bitacoras.com /

  2. Pingback: BlogESfera.com /

  3. nikoi /
    Usando Google Chrome Google Chrome 10.0.648.133 en Ubuntu Linux Ubuntu Linux

    Muchas gracias !!! No tenie idea de la existencia de ese proyecto pero la verdad que LFS se haria mucho mas comodo asi ,sobre todo en maquinas viejas.
    Aunque hoy en dia ,en procesadores modernos no se si ganarias mucho …porque si le anyades la latencia de envio/recepcion … a lo mejor seria interesante hacer un test y comparar resultados para ver si tiene sentido usarlo en procesadores actuales (2-4 nucleos)

  4. Gaspar Fernández /
    Usando Mozilla Firefox Mozilla Firefox 3.6 en Linux Linux

    @nikoi
    Es verdad que el envío/recepción es pesado en ocasiones, y ahora mismo con un montón de núcleos la cosa ha cambiado mucho, pero aún así, creo que compilar una KDE completa, o incluso un servidor Apache o Xorg sería bastante más rápido con varias máquinas en paralelo. El caso es que hago una compilación de un archivo, y mientras voy enviando los datos a un ordenador de lo que tiene que compilar (el envío de datos es mucho menos pesado que una compilación, así que lo hacemos en paralelo y la compilación casi no se ve afectada).

    Hace poco lo probé con un pequeño proyecto que estaba haciendo, tardaba en compilar unos 8 segundos, en un quad-core, y si compilaba con el quad-core y una máquina de un núcleo con distcc, tardaba alrededor de 5 segundos; es una estimación después de muchas compilaciones cronometradas. Aunque normalmente, como mi ordenador es el de un núcleo, cuando trabajaba con él lo hacía al revés: sin distcc tardaba unos 30 segundos en compilar y con distcc, unos 10segundos.

    Yo creo que lo que no merece la pena si tienes una máquina más o menos potente, es una compilación a través de Internet, por ejemplo, si tienes contratado un servidor muy potente pero está en la otra punta del mundo, pero por red local (y por cable), tener varios ordenadores para compilaciones grandes sí que merece la pena, imagina un kernel completo compilado en menos de un minuto…

  5. Pingback: How To: Compilación Distribuida | Ubuntizados /

Leave a Reply