View previous topic :: View next topic |
Author |
Message |
Coghan l33t
Joined: 25 Jul 2007 Posts: 789 Location: Gran Canaria (Spain)
|
Posted: Sat Jan 19, 2008 9:11 pm Post subject: [DISTCC]Dudas con MAKEOPTS (Solucionado) |
|
|
¿Alguien sabe por algún casual por qué sin usar distcc el handbook http://www.gentoo.org/doc/es/handbook/handbook-amd64.xml?part=1&chap=5#doc_chap4 recomienda usar en el make.conf la variable MAKEOPTS="-jN" poner la como el número de CPU+1 y cuando usas distcc según el manual http://www.gentoo.org/doc/es/distcc.xml#doc_chap2 recomienda poner (CPU*2)+1?
Si esto es correcto ¿puedo redirigir la compilación por distcc a localhost solamente y subir MAKEOPTS como dice el la guía distcc?. _________________ Salu2.
Alguien, muy acertadamente, dijo una vez wrote: | 'El buen informático es como un bibliotecario, no lo sabe todo, pero sabe donde buscarlo' |
Last edited by Coghan on Tue Aug 05, 2008 12:13 am; edited 3 times in total |
|
Back to top |
|
|
Inodoro_Pereyra Advocate
Joined: 03 Nov 2006 Posts: 2631 Location: En la otra punta del cable
|
Posted: Sun Jan 20, 2008 4:55 am Post subject: |
|
|
Redirigir la compilación a localhost y compilar sin distcc sería exactamente lo mismo. Todo dependerá de makeopts justamente...
Si hay otro microprocesador desocupado en tu red, makeopts = ( numero de CPUs implicados * 2 ) + 2 es la mejor combinación aparentemente, al menos en las pruebas que he hecho.
Si no hay ningún otro microprocesador desocupado en tu red, no vas a notar diferencia incrementando el numero de compilaciones en paralelo con makeopts e inclusive si le ponés un numero demasiado alto, por el contrario puede aumentar el tiempo de compilación.
Aún así, distcc no llega a ser tan eficiente como un buen chroot por red desde la pc "con los recursos" a la carpeta / exportada con NFS de la pc "sin recursos", en caso de que este sea tu problema.
Salud! _________________ Mi Blog.
Si no fuera por C, estaríamos escribiendo programas en BASI, PASAL y OBOL. |
|
Back to top |
|
|
i92guboj Bodhisattva
Joined: 30 Nov 2004 Posts: 10315 Location: Córdoba (Spain)
|
Posted: Sun Jan 20, 2008 7:58 am Post subject: |
|
|
Como ya dicen arriba, ese rodeo no te va a servir para nada.
Aumentando el valor de -j lo único que aumentas es el número de hilos que va a lanzar make a la hora de compilar cosas. Esto tiene básicamente estos efectos:
1.- Lanza más hilos, ocupando más memoria, por supuesto.
2.- Al haber más hilos ejecutándose, hay menos posibilidad de que se pierda tiempo de cpu. Cuando un hilo está haciendo entrada/salida, a veces tiene que esperar y la cpu se queda desaprovechada, pero si hay 100 hilos pues es más difícil que haya cpu desaprovechada en un momento dado.
3.- Como consecuancia de 1, puede que se llene la ram y se comience a hacer swap, por eso no hay que pasarse con el valor de -j. Si llegas a tocar swap entonces el daño será mayor que el beneficio.
Por lo demás, usar distcc para compilar en una sola máquina es superfluo y seguramente hasta ligeramente nocivo, y no tiene mucho sentido. Si lo que quieres es subir el valor de -j, lo puedes hacer tú directamente, no necesitas oscuros trucos, eso si, experimenta y vigila el uso de la ram. Las fórmulas que da el handbook son valores que normalmente son óptimos, pero no es algo que sea matemático. |
|
Back to top |
|
|
Coghan l33t
Joined: 25 Jul 2007 Posts: 789 Location: Gran Canaria (Spain)
|
Posted: Sun Jan 20, 2008 12:50 pm Post subject: |
|
|
Inodoro_Pereyra wrote: | Redirigir la compilación a localhost y compilar sin distcc sería exactamente lo mismo. Todo dependerá de makeopts justamente...
Si hay otro microprocesador desocupado en tu red, makeopts = ( numero de CPUs implicados * 2 ) + 2 es la mejor combinación aparentemente, al menos en las pruebas que he hecho.
Si no hay ningún otro microprocesador desocupado en tu red, no vas a notar diferencia incrementando el numero de compilaciones en paralelo con makeopts e inclusive si le ponés un numero demasiado alto, por el contrario puede aumentar el tiempo de compilación.
Aún así, distcc no llega a ser tan eficiente como un buen chroot por red desde la pc "con los recursos" a la carpeta / exportada con NFS de la pc "sin recursos", en caso de que este sea tu problema.
Salud! |
En mis prueba estoy usando un PC con un amd64 de doble núcleo haciendo de servidor distcc pero compilando para si mismo sin este, el cliente distcc es un portátil con un Amd Turion64 mono-núcleo con buenos recursos y uso distcc para distribuir la carga entre los dos ordenadores al compilar para el portátil. No quiero usar el portátil para ayudar al sobremesa, el solito ya se basta, sino al revés.
Si en el sobremesa tengo el MAKEOPTS="-j3" según recomienda el handbook (número de CPU+1 sin distcc), tres hilos simultáneos en mi caso, y en el portátil sin distcc "-j2", ¿porqué al usar distcc en el portátil he de poner "-j7" como dice la guía distcc o "-j8" como dices tú?, esto supondría 7 u 8 hilos paralelos entre los dos ordenadores, sin embargo sin distcc lo recomendado si los sumamos independiente no se recomienda más de "-j3" para uno y "-j2" para el otro, 5 hilos.
i92guboj wrote: | 1.- Lanza más hilos, ocupando más memoria, por supuesto.
2.- Al haber más hilos ejecutándose, hay menos posibilidad de que se pierda tiempo de cpu. Cuando un hilo está haciendo entrada/salida, a veces tiene que esperar y la cpu se queda desaprovechada, pero si hay 100 hilos pues es más difícil que haya cpu desaprovechada en un momento dado.
3.- Como consecuancia de 1, puede que se llene la ram y se comience a hacer swap, por eso no hay que pasarse con el valor de -j. Si llegas a tocar swap entonces el daño será mayor que el beneficio. |
Entonces, siguiendo tus consejos, aun usando distcc, para no cargar la CPU de ambos equipos entiendo que usar en el portátil MAKEOPTS="-j5" sería lo óptimo.
Por otro lado usando: Code: | DISTCC_DIR="/var/tmp/.distcc/" distccmon-gui | en la máquina cliente obtengo el estado de compilación de todos los hilos actuales de la compilación, sin embargo me interesa saber como controlar el uso que se está haciendo en el servidor desde él mismo. ¿Como podría hacerlo?.
En caso de que necesite compilar en ambas máquinas simultáneamente, ¿distcc es inteligente a la hora de no sobrecargar el servidor o por el contrario he de parar distcc?.
En caso de que necesite compilar con el portátil fuera de la red del servidor distcc, existe alguna manera de poner un MAKEOPTS dinámico para que se adapte a no tener distcc?. _________________ Salu2.
Alguien, muy acertadamente, dijo una vez wrote: | 'El buen informático es como un bibliotecario, no lo sabe todo, pero sabe donde buscarlo' |
|
|
Back to top |
|
|
Inodoro_Pereyra Advocate
Joined: 03 Nov 2006 Posts: 2631 Location: En la otra punta del cable
|
Posted: Mon Jan 21, 2008 5:23 pm Post subject: |
|
|
El valor que te sugiero para makeopts es resultado de mi experimentación simplemente donde armé una granja distcc de 5 pc todas diferentes en capacidad, midiendo tiempos de compilación con time.
Un valor mayor me incrementaba los tiempos de compilación pero las pc iban desde un athlon (k7) de 1200 hasta un athlon64 3500+ en su momento... Probablemente alguna de las pc me ralentizaba a las demás al incrementar el valor...
Vas a tener que jugar con este valor e ir probando que resultados obtenés... Hoy en día no lo uso mas, chroot me da mejores resultados.
Sobre tu otra pregunta, no la termino de entender, si ves todos los procesos de compilación desde el cliente y lo que necesitas ver es el estado en el server, un buen top o htop es lo que usaría yo.
No sé que tan inteligente es distcc cuando además se compile en local pero muy probablemente toda la carga la distribuyan el gcc y el kernel y a menos que hayas cambiado el niceness será lo mas parejo posible.
En el caso de que distcc no se pueda conectar con el server siempre compilará en local, un makeopts dinámico no se me ocurre como implementarlo... A ver que dice i92 que seguramente tiene la respuesta.
Salud! _________________ Mi Blog.
Si no fuera por C, estaríamos escribiendo programas en BASI, PASAL y OBOL. |
|
Back to top |
|
|
Coghan l33t
Joined: 25 Jul 2007 Posts: 789 Location: Gran Canaria (Spain)
|
Posted: Mon Jan 21, 2008 5:42 pm Post subject: |
|
|
Inodoro_Pereyra wrote: | Vas a tener que jugar con este valor e ir probando que resultados obtenés... Hoy en día no lo uso mas, chroot me da mejores resultados. |
Usar chroot vale si la maquina para la que compilas es lenta, pero en mi caso quiero usar las dos máquina rápidas para mejorar el tiempo de instalación.
Quote: | Sobre tu otra pregunta, no la termino de entender, si ves todos los procesos de compilación desde el cliente y lo que necesitas ver es el estado en el server, un buen top o htop es lo que usaría yo. |
Aquí lo que necesito es saber para que equipos/hilos está trabajando el servidor disctcc desde el mismo servidor, un top no me dirá quien manda el proceso.
Quote: | No sé que tan inteligente es distcc cuando además se compile en local pero muy probablemente toda la carga la distribuyan el gcc y el kernel y a menos que hayas cambiado el niceness será lo mas parejo posible. |
Siempre he entendido que hacer varios emerge en paralelo no es nada bueno, por eso me planteo que si distcc está trabando y quiero compilar en local sin distcc si no tendré resultados incorrectos o desmejora del rendimiento. Por eso quiero también saber como controlar lo de la pregunta de arriba.
Quote: | En el caso de que distcc no se pueda conectar con el server siempre compilará en local, un makeopts dinámico no se me ocurre como implementarlo... A ver que dice i92 que seguramente tiene la respuesta. |
Que compilará en local lo tengo claro, pero lo hará con el número de hilos que se configuró para distcc. Veamos que dice el maestro. _________________ Salu2.
Alguien, muy acertadamente, dijo una vez wrote: | 'El buen informático es como un bibliotecario, no lo sabe todo, pero sabe donde buscarlo' |
|
|
Back to top |
|
|
ColdWind Retired Dev
Joined: 08 Dec 2005 Posts: 119 Location: Valencia, Spain
|
Posted: Thu Jan 24, 2008 12:23 pm Post subject: |
|
|
Un MAKEOPTS "dinámico" se puede implementar en /etc/portage/bashrc.
AVISO: NADA que hagas en ese fichero está soportado oficialmente, y si rompes algo por esa via es probable que te digan que te vayas a llorar a otra parte.
La forma de implementarlo que me ocurre es bastante guarra y seria pillar la lista de hosts con distcc-config --get-hosts, hacer un ping a cada uno de ellos para obtener el número de hosts operativos y en función de eso exportar MAKEOPTS con el valor adecuado. El problema es que eso no tendría en cuenta el caso de que tu servidor esté online pero no esté corriendo distccd.
Conclusión, en lugar de un MAKEOPTS "dinámico" será mejor que uses MAKEOPTS="-j2" emerge blah cuando estés compilando únicamente en local. |
|
Back to top |
|
|
gringo Advocate
Joined: 27 Apr 2003 Posts: 3793
|
Posted: Thu Jan 24, 2008 1:48 pm Post subject: |
|
|
Las versiones de distcc que están en ~arch tienen un nuevo USE avahi, con lo que se consigue una detección automática de las máquinas implicadas y las compilaciones a distribuir se configuran automáticamente.
https://bugs.gentoo.org/show_bug.cgi?id=203874
Los chavales de bashrc-ng tb. tienen un módulo que hace mas o menos lo que dice ColdWind.
por si a alguien le resulta de utilidad ...
saluetes _________________ Error: Failing not supported by current locale |
|
Back to top |
|
|
Coghan l33t
Joined: 25 Jul 2007 Posts: 789 Location: Gran Canaria (Spain)
|
Posted: Thu Jan 24, 2008 3:26 pm Post subject: |
|
|
gringo wrote: | Las versiones de distcc que están en ~arch tienen un nuevo USE avahi, con lo que se consigue una detección automática de las máquinas implicadas y las compilaciones a distribuir se configuran automáticamente.
https://bugs.gentoo.org/show_bug.cgi?id=203874 |
¡Perfecto!, Muchas gracias @gringo.
Justamente eso es lo que estaba buscando, funciona genial, el solito detecta las máquinas de la red que tienen el demonio distccd trabajando y autodetecta el número de CPUs. La forma de hacerlo es la siguiente:
- Actualizar sys-devel/distcc desde ~amd64 o ~x86 con el USE avahi activado en todas las máquinas de la red.
- No olvidarse de etc-update, y revisar los cambios de /etc/conf.d/distccd y reiniciar el demonio distccd en todas las máquinas.
- Configurar los hosts de distcc de la siguiente manera en todos los clientes distcc:
Code: | sudo distcc-config --set-hosts +zeroconf |
Cambiar en /etc/make.conf la variable MAKEOPTS de todos los clientes distcc como sigue:
Code: | MAKEOPTS="-j 'distcc -j'" |
Para comprobar que funciona ejecuta: y te devolverá un número, este es el valor que asigna a MAKEOPTS.
Si quieres ver que servidores distcc están activos en tu red ejecuta Code: | distcc --show-hosts | y te devolverá la IP del servidor:puerto/hilos
En mi caso me pilla el valor 8 para un AMD Athlon(tm) 64 X2 Dual Core Processor 5200+ de doble núcleo. Desconozco en base a que criterio calcula el número de hilos, pero no tiene nada que ver con lo que recomienda los manuales que comentamos arriba.
EDITO: Había un error en make.conf debe ser como está ahora. _________________ Salu2.
Alguien, muy acertadamente, dijo una vez wrote: | 'El buen informático es como un bibliotecario, no lo sabe todo, pero sabe donde buscarlo' |
|
|
Back to top |
|
|
Stolz Moderator
Joined: 19 Oct 2003 Posts: 3028 Location: Hong Kong
|
Posted: Wed Jul 30, 2008 3:45 pm Post subject: |
|
|
Coghan wrote: | Cambiar en /etc/make.conf la variable MAKEOPTS de todos los clientes distcc como sigue:
Code: | MAKEOPTS="-j 'distcc -j'" |
|
Coghan, ¿te funciona así?
Al ver que los nuevos ebuilds de distcc soportan avahi me he puesto a buscar información como loco y he llegado a este hilo. Al ver la solución que propones se me han iluminado los ojos pero al probarla no me funciona. He probado con
Code: | MAKEOPTS="-j 'distcc -j'" | y con Code: | MAKEOPTS="-j `distcc -j`" | pero en ambos casos no se evalua MAKEOPTS sino que se pasa al make el valor literal que he puesto en make.conf y claro, protesta.
En el trabajo tengo bastantes ordenadores y en casa solo 2. Había pensado en poner en MAKEOPTS un valor alto para contemplar ambos casos pero así el consumo de ram cuando estoy en casa se dispara por lanzar tantos hilos en el mismo ordenador y no compensa usar distcc. Lo ideal y lo que me gustaría es que el valor de MAKEOPTS se calcule de forma dinámica y que siempre valga lo mismo que el comando 'distcc -j' para así detectar los cambios en los ordenadores disponibles en la red.
¿hay alguna forma de hacer que se evalue de forma integrada con emerge?
Saludozzzzzzz |
|
Back to top |
|
|
gringo Advocate
Joined: 27 Apr 2003 Posts: 3793
|
Posted: Wed Jul 30, 2008 4:48 pm Post subject: |
|
|
con avahi no te puedo ayudar, no lo uso. Lo probé y no distribuía tan agresivamente como a mi me gustaba asi que no me paré mucho en ver como funcionaba.
Como comenté arriba, los de bashrc-ng tienen un módulo que mas o menos hace lo que comentaba Coldwind, detecta a base a pings los hosts disponibles, no es un método que me guste y no tengo ni idea de si funciona con versiones recientes de portage. Prueba a ver ...
que por cierto, ya que se habla de este tema-> http://planet.gentoo.org/developers/zmedico/2008/07/23/portage_parallel_builds
saluetes _________________ Error: Failing not supported by current locale |
|
Back to top |
|
|
Inodoro_Pereyra Advocate
Joined: 03 Nov 2006 Posts: 2631 Location: En la otra punta del cable
|
Posted: Wed Jul 30, 2008 6:27 pm Post subject: |
|
|
http://planet.gentoo.org/developers/zmedico/2008/07/23/portage_parallel_builds wrote: | -keep-going
Continue as much as possible after an error. When an error
occurs, dependencies are recalculated for remaining packages
and any with unsatisfied dependencies are automatically
dropped. Also see the related --skipfirst option. |
Siempre me pregunté que tan dificil sería implementar algo semejante... Si les ha tomado tanto tiempo se ve que no era nada facil la cosa. Ya me puedo desprender de esos scripts que usaba para dejar compilando de noche
Gracias gringo! _________________ Mi Blog.
Si no fuera por C, estaríamos escribiendo programas en BASI, PASAL y OBOL. |
|
Back to top |
|
|
Coghan l33t
Joined: 25 Jul 2007 Posts: 789 Location: Gran Canaria (Spain)
|
Posted: Wed Jul 30, 2008 7:08 pm Post subject: |
|
|
Stolz wrote: | Coghan wrote: | Cambiar en /etc/make.conf la variable MAKEOPTS de todos los clientes distcc como sigue:
Code: | MAKEOPTS="-j 'distcc -j'" |
|
Coghan, ¿te funciona así? |
¡Vaya, que despiste!, no había corregido esto. Cuando hice las pruebas me dio mucho la lata el asunto, al final la línea la tengo de la siguiente manera: Code: | MAKEOPTS=" -j $(distcc -j)" |
Pero si no tengo la variable DISTCC_HOSTS exportada no funciona el invento y distcc se queja, lo solucioné añadiendo esta al make.conf antes de MAKEOPTS
Code: | export DISTCC_HOSTS="host1 host2 host3" |
Si un host esta fuera de línea no devolverá resultado y no sumará hilos al resultado final. _________________ Salu2.
Alguien, muy acertadamente, dijo una vez wrote: | 'El buen informático es como un bibliotecario, no lo sabe todo, pero sabe donde buscarlo' |
|
|
Back to top |
|
|
Coghan l33t
Joined: 25 Jul 2007 Posts: 789 Location: Gran Canaria (Spain)
|
Posted: Wed Jul 30, 2008 9:42 pm Post subject: |
|
|
Esto me ha obligado buscar más información porque este tema va cambiado de revisión en revisión, así que toca la lectura profunda de la última página man disponible:
http://distcc.googlecode.com/svn/trunk/doc/web/man/distcc_1.html
Esta habla sobre cargar la variable DISTCC_HOSTS, también comenta algo sobre poder asignar hilos a mano por host. aún no la he leído completa. _________________ Salu2.
Alguien, muy acertadamente, dijo una vez wrote: | 'El buen informático es como un bibliotecario, no lo sabe todo, pero sabe donde buscarlo' |
|
|
Back to top |
|
|
Stolz Moderator
Joined: 19 Oct 2003 Posts: 3028 Location: Hong Kong
|
Posted: Thu Jul 31, 2008 10:42 am Post subject: |
|
|
Gracias por las respuestas y por los enlaces. Las nuevas features de Portage 'se salen'
No se por qué pero no me ha funcionado modificando make.conf con
Code: | MAKEOPTS=" -j $(distcc -j)" | incluso poniendo DISTCC_HOSTS (con y sin export).
Al final lo he conseguido con un alias. Tal vez no sea lo más elegante pero hace justo lo que quiero, usar un valor de MAKEOPTS dinámico en función de los ordenadores de la red que estén disponibles para compilar en ese instante:
Code: | alias emerge="sed -i s/^MAKEOPTS.*/MAKEOPTS=\"-j`distcc -j`\"/ /etc/make.conf;emerge" |
Saludozzzzzzz |
|
Back to top |
|
|
gringo Advocate
Joined: 27 Apr 2003 Posts: 3793
|
Posted: Thu Jul 31, 2008 11:03 am Post subject: |
|
|
Quote: | Gracias por las respuestas y por los enlaces. Las nuevas features de Portage 'se salen' |
pues hay mas -> http://planet.gentoo.org/developers/zmedico/2008/07/31/live_rebuild_package_set
Quote: | No se por qué pero no me ha funcionado modificando make.conf |
estoy hablando de memoria, pero si mal no recuerdo no cambié para nada el MAKE_OPTS cuando jugueteé con avahi/ distcc, tan sólo añadí +zeroconf a mi /etc/distcc/hosts, configuré distcc para que usara avahi y reinicié distcc en las máquinas implicadas.
Normalmente sé las máquinas a las que puedo distribuir, así que simplemente tengo un valor -j alto en mi make.conf y para paquetes que sé que no compilan con distcc ( o si sé que no tengo mas máquinas disponibles), simplemente tengo un alias en mi bashrc :
Code: | alias ncemerge="FEATURES="-distcc" MAKE_OPTS="-j2" emerge -av" |
y con eso me apaño.
saluetes _________________ Error: Failing not supported by current locale |
|
Back to top |
|
|
Inodoro_Pereyra Advocate
Joined: 03 Nov 2006 Posts: 2631 Location: En la otra punta del cable
|
Posted: Fri Aug 01, 2008 3:45 am Post subject: |
|
|
Zack Medico wrote: | I've implemented new @live-rebuild and @module-rebuild package sets, and added them to the default sets.conf file for the next sys-apps/portage release |
Este Zack me lee el pensamiento!
Gracias gringo. (una vez mas)
Salud! _________________ Mi Blog.
Si no fuera por C, estaríamos escribiendo programas en BASI, PASAL y OBOL. |
|
Back to top |
|
|
gringo Advocate
Joined: 27 Apr 2003 Posts: 3793
|
Posted: Mon Aug 04, 2008 2:22 pm Post subject: |
|
|
um, el caso es que a través del planet de gentoo ( concretamente este artículo ) me entero de que existe una nueva versión en desarollo de distcc. Acudo a su web, entro en su man y (entre otras cosas) leo un par de cosas interesantes :
Quote: | [...]The major improvement in distcc 3.0 is the inclusion of "pump" mode. In "pump" mode, distcc sends source file with their included header files to the compilation servers, which now carry out both preprocessing and compilation. As a result, distcc-pump can distribute files up to 10 times faster to compilation servers than distcc.
distcc-pump is easily deployed through a wrapper script around an existing build command, such as 'make'. It is currently best suited for cross compilation, which is less demanding of include directory configurations[...]
[...]Another alternative if you're using pump mode is to set the DISTCC_POTENTIAL_HOSTS environment variable; in that case, the pump script will use "lsdistcc" to set DISTCC_HOSTS, automatically eliminating hosts that are down or inaccessible or that don't have distccd running.[...] |
como mola !
http://code.google.com/p/distcc/
saluetes _________________ Error: Failing not supported by current locale |
|
Back to top |
|
|
Inodoro_Pereyra Advocate
Joined: 03 Nov 2006 Posts: 2631 Location: En la otra punta del cable
|
Posted: Mon Aug 04, 2008 5:06 pm Post subject: |
|
|
Que hacés cuando no vas por la red leyendo manuales y changelogs gringo?
Me pregunto como irá sobre internet... Uso distcc sobre una conexión con 64KB de upstream y me va bastante bien, me imagino que en modo pump debe consumir mas ancho de banda... Habrá que probar, gracias!
Salud! _________________ Mi Blog.
Si no fuera por C, estaríamos escribiendo programas en BASI, PASAL y OBOL. |
|
Back to top |
|
|
Coghan l33t
Joined: 25 Jul 2007 Posts: 789 Location: Gran Canaria (Spain)
|
Posted: Tue Aug 05, 2008 12:02 am Post subject: |
|
|
La idea es conseguir un MAKEOPTS dinámico según los servidores distcc activos en la red local.
Hasta que la versión 3 de distcc esté disponible (gracias gringo por la info), esto es lo que he ido descubriendo hasta ahora con las versiones actuales de portage:
- +zeroconf Solo consigo que autodetecte el servicio distccd en la máquina local, no he conseguido que detecte el servicio ejecutado en otra PC de la red local, he revisado tanto puertos TCP/3632 (distccd) como UDP/5353 (zeroconf), como resolución dns inversa, pero sin conseguir resultados. Por lo tanto decidí no usar esta opción en el DISTCC_HOSTS, pero como USE de sys-devel/distcc debe estar activa para tener la opción 'distcc -j'
- DISTCC_HOSTS Debe estar definida como variable de entorno global, no funciona si la ponemos en /etc/make.conf, la podéis poner en vuestro .bashrc como en el de root, yo lo he puesto en /etc/env.d/02distcc. Colocar aquí la lista de todos los hosts que tenéis ejecutando el demonio distccd, recomiendo ponerlo del modo hosts:3632/4 (equipo:puerto/hilos), si no especificáis los hilos al realizar un distcc -j este asignará unos valores que desde mi punto de vista no son reales, como esto es muy subjetivo depende de cada uno como quiera configurarlo. Yo estoy usando 2 hilos por procesador bajo distcc y el recomendado por el manual distcc de Gentoo, procesadores+1.
- SCRIPT: He puesto el siguiente script makeopts.sh bajo /usr/local/bin, este directorio también está bajo mi PATH. Primero detecta si tienes distcc habilitado en tu make.conf, si no es así omite la búsqueda de servidores distcc y ejecuta emerge de la manera tradicional, para esto es importante tener en nuestro make.conf la variable MAKEOPTS="-jN" normal cuando no usamos distcc.
El siguiente paso es detectar los hosts que hemos configurado antes en nuestra variable DISCTCC_HOSTS, incluso tiene en cuenta si aquí hemos puesto además del hosts el puerto y los hilos y el resto de opciones que puedes configurar en esta variable, luego comprueba uno a uno si el servicio está levantado mediante nmap al puerto 3632, si alguno no está activo no lo tiene en cuenta en la configuración final.
finalmente pasa la variable DISTCC_HOST final para lanzar emerge con el MAKEOPTS adecuado. Estás variables no se mantienen de forma global por lo tanto se calcularán en cada emerge que se realice.
Code: | #!/bin/bash
# Llocaliza servidores distcc activos en la red local para
# poder asignar a nuestra variable MAKEOPTS en
# /etc/make.conf un valor dinámico.
TEMPHOSTS=""
. /etc/make.conf
if [ `echo ${FEATURES} | grep -q -e distcc ; echo $?` == 0 ] && [ `echo ${FEATURES} | grep -q -e -distcc ; echo $?` != 0 ]; then
for DHOSTS in ${DISTCC_HOSTS}; do
HOST=${DHOSTS#*@}
HOST=${HOST%:*}
HOST=${HOST%/*}
NMAP=$(nmap -p3632 -PN -n ${HOST} | grep open)
if [ -n "$NMAP" ];then
TEMPHOSTS="${TEMPHOSTS} ${DHOSTS}"
fi
done
DISTCC_HOSTS="${TEMPHOSTS}"
MAKEOPTS="-j$(distcc -j)" emerge $@
else
emerge $@
fi
|
ALIAS Finalmente he creado el siguiente alias en mi $HOME/.bashrc
Code: | alias emerge='makeopts.sh $@' |
Ahora al hacer un emerge --info |grep MAKEOPTS obtendréis resultados diferentes en función de si tenéis distcc activado y/o los demonios distccd activos en todas las máquinas de la red local.
Creo que no se me queda nada atrás, si encontráis una manera mejor de hacerlo os agradecería que lo comentarais. _________________ Salu2.
Alguien, muy acertadamente, dijo una vez wrote: | 'El buen informático es como un bibliotecario, no lo sabe todo, pero sabe donde buscarlo' |
Last edited by Coghan on Wed Aug 06, 2008 12:20 pm; edited 2 times in total |
|
Back to top |
|
|
gringo Advocate
Joined: 27 Apr 2003 Posts: 3793
|
Posted: Tue Aug 05, 2008 7:32 am Post subject: |
|
|
se me olvidó decir ayer que en el paquete del nuevo distcc, en la carpeta contrib, está el siguiente script ( entre otros) :
Code: | #! /bin/sh
# make-j script from Alexandre Oliva <aoliva@redhat.com> for use with distcc
# Tests which machines are up, and runs Make with concurrency set
# appropriately.
hostlist=$DISTCC_HOSTS
distcc_port=4200
DISTCC_HOSTS=
count=0
for h in $hostlist; do
echo trying $h... >&2
if test "x$h" = xlocalhost || nc -z $h $distcc_port; then
echo added $h... >&2
DISTCC_HOSTS=`echo $DISTCC_HOSTS $h` # remove leading blank
count=`expr $count + 1`
fi
done
export DISTCC_HOSTS
exec make -j $count ${1+"$@"} |
requiere netcat como se puede ver y sería bastante fácil incluir / combinar esto en el script de Coghan si a alguien le interesa.
cuando tenga un segundo escribiré un ebuild para la nueva versión, no lo he mirado mucho, pero parece que simplemente con renombrar el ebuild y retocar/añadir dos cosillas debería estar.
saluetes _________________ Error: Failing not supported by current locale |
|
Back to top |
|
|
Coghan l33t
Joined: 25 Jul 2007 Posts: 789 Location: Gran Canaria (Spain)
|
Posted: Wed Aug 06, 2008 2:01 am Post subject: |
|
|
gringo wrote: | requiere netcat como se puede ver y sería bastante fácil incluir / combinar esto en el script de Coghan si a alguien le interesa. |
Te he tomado la palabra y he combinado la parte de netcat y añadidos algunos cambios más. No me gusta como este script calcula el número de hilos, solo suma un hilo por cada servicio activo, no tiene en cuenta que pueden haber varios procesadores, por lo que sigo con la idea de configurar el número de hilos a mano a la hora de definir cada hosts con máquina:puerto/Nhilos.
- Ya no es necesario tener la variable DISTCC_HOSTS cargada en el entorno, ahora lee la lista con el comando distcc-config --get-hosts que previamente habremos configurado con distcc-config --set-hosts "hosts1 hosts2", según reza el manual de la documentación de Gentoo (para seguir con la norma). Aquí hay que tener en cuenta al cambiar los hosts, reiniciar el demonio distccd y volver a reiniciar la consola de lo contrario no se harán patentes los cambios.
- Ahora el script detecta el puerto, si lo hemos definido con 'distcc-config' o usa el puerto por defecto si no, para comprobar si el servicio está activo.
- También detecta si no existe ningún servidor distccd activo en la lista de hosts y en este caso usa el MAKEOPTS por defecto para el PC local que hemos definido en nuestro make.conf.
- He añadido dos formas de detectar si el puerto que usa distccd está abierto con nmap y con netcat. He visto que si ningún hosts está caído, netcat es más rápido en responder, pero en caso contrario nmap gana. Cuando son pocos servidores este tiempo es insignificante, pero si tienes una buena batería de estos puede demorar considerablemente. Dejo a la elección de cada uno cual prefiere, solo hay que descomentar la línea adecuada.
- Además detecta si algunos de los servidores utiliza distcc a través de ssh, se conecta a este servidor y comprueba si el servicio se está ejecutando. Para que no os pida la contraseña el servidor ssh cada vez, así como los parámetros de la conexión, hay que configurar las opciones en ~/.ssh/
Podéis utilizar para ello este manual
- Como nota final no olvidar poner el alias emerge='makeopts.sh $@' en el .bashrc del root también, si no al lanzar emerge con sudo el invento no funcionará.
Code: | #!/bin/bash
# Localiza servidores distcc activos en la red local para
# poder asignar a nuestra variable MAKEOPTS en
# /etc/make.conf un valor dinámico.
TEMPHOSTS=""
#HOSTSLIST=$(distcc-config --get-hosts)
HOSTSLIST=$(distcc --show-hosts | xargs)
. /etc/make.conf
if [ `echo ${FEATURES} | grep -q -e distcc ; echo $?` == 0 ] && [ `echo ${FEATURES} | grep -q -e -distcc ; echo $?` != 0 ]; then
for DHOSTS in ${HOSTSLIST}; do
HOST=${DHOSTS#*@}; HOST=${HOST%:*}; HOST=${HOST%/*}
DPORT=${DHOSTS#*:}; DPORT=${DPORT%/*}
if [ `echo ${DHOSTS} |grep -q -e @ ; echo $?` == 0 ]; then
SHOST=${DHOSTS%:*}; SHOST=${SHOST%/*}
SSH=$(ssh ${SHOST} ps -A |grep distccd)
if [ -n "${SSH}" ]; then
TEMPHOSTS="${TEMPHOSTS} ${DHOSTS}"
fi
else
calc=("$DPORT"/"$DPORT")
if [ $calc != 1 ]; then DPORT=3632; fi
if nc -z $HOST $DPORT ;then
TEMPHOSTS="${TEMPHOSTS} ${DHOSTS}"
fi
fi
done
if [ -n "${TEMPHOSTS}" ]; then
DISTCC_HOSTS="${TEMPHOSTS}" MAKEOPTS="-j$(distcc -j)" emerge $@
else
DISTCC_HOSTS="" emerge $@
fi
else
emerge $@
fi
|
Si detectáis algún error en alguna de las combinaciones agradezco que lo comentéis.
EDITO:He modificado el script para descartar definitivamente nmap, cuando la máquina está apagada o tiene habilitado el rechazo de paquetes ICMP, nmap se queda a la espera con la opción -PN y sin la opción el resultado puede ser falso. También he cambiado la forma final de lanzar emerge debido a que si la variable DISTCC_HOSTS está cargada en el entorno esta tiene preferencia.
EDITO:Modificada la variable HOSTSLIST para que funcione con avahi. Aporte de Stolz _________________ Salu2.
Alguien, muy acertadamente, dijo una vez wrote: | 'El buen informático es como un bibliotecario, no lo sabe todo, pero sabe donde buscarlo' |
Last edited by Coghan on Mon Nov 03, 2008 8:01 pm; edited 6 times in total |
|
Back to top |
|
|
Stolz Moderator
Joined: 19 Oct 2003 Posts: 3028 Location: Hong Kong
|
Posted: Wed Aug 06, 2008 10:30 am Post subject: |
|
|
A mi la opción zeroconf sí me funciona y me puedo olvidar DISTCC_HOSTS. Me dio problemas porque no había compilado avahi con USE="dbus". Por si es un problema de red, si usas IPtables puedes configurarlo para que guarde en el log del sistema los paquetes que está rechazando para ver si detectas el problema:
iptables -N LOGDROP
iptables -A LOGDROP -j LOG
iptables -A LOGDROP -j DROP
Espero que sirva de algo |
|
Back to top |
|
|
gringo Advocate
Joined: 27 Apr 2003 Posts: 3793
|
Posted: Wed Aug 06, 2008 11:27 am Post subject: |
|
|
Quote: | Me pregunto como irá sobre internet... Uso distcc sobre una conexión con 64KB de upstream y me va bastante bien, me imagino que en modo pump debe consumir mas ancho de banda... Habrá que probar, gracias! |
si, es de esperar que en modo pump consuma algo mas, igual habilitando la compresión se reduce algo pero no creo que sea gran cosa.
Una idea interesante sería crear una especie "red de compilación distribuida para usuarios gentoo", una idea que ya surgió hace bastante tiempo pero que nunca llegó a ver la luz.
En principio haciéndolo sobre ssh, capando y tuneando distcc un poco y creando un listado actualizado de máquinas implicadas debería estar. Alguien se anima ?
@Coghan - buen trabajo
el ebuild va a tener que hacerlo alguien que controle del tema, no me di cuenta en su momento que gentoo parchea distcc con bastantes cosillas y portar alguno de ellos no es moco de pavo. No lo he mirao mucho tampoco, este fin de semana quiero mirarlo con un poco mas de calma, pero toca esperar me temo.
saluetes _________________ Error: Failing not supported by current locale |
|
Back to top |
|
|
Coghan l33t
Joined: 25 Jul 2007 Posts: 789 Location: Gran Canaria (Spain)
|
Posted: Wed Aug 06, 2008 1:03 pm Post subject: |
|
|
Stolz wrote: | A mi la opción zeroconf sí me funciona y me puedo olvidar DISTCC_HOSTS. Me dio problemas porque no había compilado avahi con USE="dbus". Por si es un problema de red, si usas IPtables puedes configurarlo para que guarde en el log del sistema los paquetes que está rechazando para ver si detectas el problema:
iptables -N LOGDROP
iptables -A LOGDROP -j LOG
iptables -A LOGDROP -j DROP
Espero que sirva de algo |
Sigue igual, ya tenía dbus en la USE de avahi en las dos máquinas con las que estoy probando, también había desactivado las iptables para hacer las pruebas y solo me detecta la ip de la interface local, además me sigue sin gustar como asigna los hilos pues me lanza 4 hilos para un procesador mononúcleo.
Otro falta que le veo a +zeroconf en que no tendrá en cuenta los equipos fuera de la red local y los que funcionen distccd bajo ssh.
Por otro lado tengo estos permisos en el directorio /etc/distcc d-wxrwS--t, ¿son correctos?.
gringo wrote: | Una idea interesante sería crear una especie "red de compilación distribuida para usuarios gentoo", una idea que ya surgió hace bastante tiempo pero que nunca llegó a ver la luz.
En principio haciéndolo sobre ssh, capando y tuneando distcc un poco y creando un listado actualizado de máquinas implicadas debería estar. Alguien se anima ? |
Parece algo utópico y muy complejo de mantener, habría que crear diferentes ramas de compilación para cada arquitectura y cada versión de gcc, aparte de implementar algún control de límites de uso por temas de seguridad, con lo que consume recursos la compilación no creo a nadie le guste la merma en su equipo.
Quote: | @Coghan - buen trabajo |
Gracias, jeje. No soy programador, es mi "ToDo" personal, pero esto me vale para hacer mis prácticas en bash. _________________ Salu2.
Alguien, muy acertadamente, dijo una vez wrote: | 'El buen informático es como un bibliotecario, no lo sabe todo, pero sabe donde buscarlo' |
|
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|