No consigo hacer funcionar distcc

Estoy intentando hacer funcionar distcc en un ordenador que tengo como servidor (al final le he tenido que meter gentoo :P) y no consigo que utilice el otro ordenador con distcc. El server es un pentium3 y el cliente un athlon-xp. Por lo que he leído, no necesito usar cross-compiling, porque ambos usan el mismo CHOST (i686).

Lo he configurado siguiendo la guía de gentoo sobre distcc, y ha quedado así:
En el server: (IP:192.168.0.10)
make.conf
CFLAGS="-O2 -march=pentium3 -pipe -fomit-frame-pointer"
CHOST="i686-pc-linux-gnu"
CXXFLAGS="${CFLAGS}"
MAKEOPTS="-j3"
FEATURES="ccache distcc"
CCACHE_DIR="var/tmp/ccache"
CCACHE_SIZE="2G"
...

# distcc-config --get-hosts
localhost 192.168.0.2

/etc/conf.d/distccd
...
DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.0.2"
#DISTCCD_OPTS="${DISTCCD_OPTS} --listen 192.168.0.2"
...

/etc/init.d/distccd restart
* Stopping distccd ... [ ok ]
* Starting distccd ... [ ok ]



En el cliente: (192.168.0.2)
No le he metido nada en el make.conf ni he usado "distcc-config --set-hosts" porque de momento sólo quiero usarlo para ayudar a compilar al server.

/etc/init.d/distccd restart
* Stopping distccd ... [ ok ]
* Starting distccd ... [ ok ]

/etc/conf.d/distccd
...
DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.0.10"
#DISTCCD_OPTS="${DISTCCD_OPTS} --listen 192.168.0.10"
...

El --listen, aunque pone que se recomienda usarlo no sé muy bien para que sirve, si lo dejo puesto no arranca el servicio, así que lo he quitado (lo recomendaba alguien en el foro de gentoo a otro que tampoco le arrancaba).


El caso es que si hago un emerge, distccmon-text no me devuelve nada (bueno, una línea en blanco) así que parece que no lo usa.

PD: He puesto lo de ccache porque he leído que según como lo pusieses en las FEATURES no usaba distcc, pero se supone que como lo tengo (primero ccache y luego distcc) debería funcionar.
No sé si me he dejado algo, si es así preguntad.

PD2: Perdón por el tocho.

Un saludo,
bastian.
Es muy posible que te esté funcionando, el distccmon-text necesita la variable DISTCC_DIR para saber de dónde leer la información.

Saludos.Ferdy
Efectivamente, parece que está funcionando. Antes de ver tu respuesta, he cambiado el log-level a debug y se ve como hace conexiones y ahora he probado usando la variable y efectivamente:
6022 Compile xmknod.tmp.server.6009.i 192.168.0.2[0]
6014 Compile localhost[0]
6019 Compile localhost[1]



Tanto leer y buscar por ahí por no haberme leído bien (más bien porque no sé cómo @*#* no las he visto) las 3 últimas líneas de la documentación, ains.
Gracias por la ayuda.

Por cierto, ¿qué valor aconsejas ponerle al MAKEOPTS? Pensaba que era el número de procesadores+1 (lo que la gente recomendaba por ahí) pero tanto la doc de gentoo sobre distcc como la del propio distcc recomiendan 2N o 2N+1.

Un saludo.
Depende de muchas cosas... por ejemplo de la prioridad con la que corra DISTCC. Pero piensa que con 4 procesos de compilación la máquina empieza a 'saturarse' y no da mejor rendimiento.

Yo en algunos sitios tengo entre 3 y 4 procesos por máquina (por micro) y en otros unos 2. Eso lo mejor es que lo compruebes tu. Simplemente haz pruebas y no lo subas mucho más allá de 4 o 5.

Saludos.Ferdy
Ok. Entonces tendría que poner digamos entre 5 y 7 en el server y entre 2 y 4 en el cliente. He estado haciendo pruebas y no consigo nada aceptable (de hecho creo que ahora me va peor), me he dado cuenta de que el segundo ordenador apenas recibe trabajos, está la cpu al 0%, cuando en el otro tiene picos de hasta 100%, por lo que algo no está haciendo bien, así que admito sugerencias.

No sé si será el paquete que estoy compilando (creo que está con wxGTK) los MAKEOPTS, o el DISTCC_NICENESS. Decir que tengo como hosts primero localhost (pentium3 a 700MHz) y luego el cliente (amd athlon-xp a 2GHz). Los puse en ese orden porque entendí por la doc de distcc que así estaba bien. De todas formas probé ayer poniendo sólo el amd y pasaba de mí, seguía usando el server.

Un saludo.
Depende mucho de los paquetes, pero distcc va usando los hosts en orden según los necesita. Yo en las máquinas que usan otras para compilar no tengo localhost (por razones obvias).

Con un comando como

DISTCC_DIR=/var/tmp/portage/.distcc watch --interval 1 distccmon-text


Puedes ver constantemente cómo van los nodos y ajustar el número de trabajos para cada uno.

Tambien tienes que pensar en cómo funciona distcc. Hay partes que no se pueden distribuir como el preprocesado y el enlazado, así que depende de la aplicación que uses se distribuirá bien o no.

Un ejemplo de un 'cluster' bien balanceado puede ser:

22062  Preprocess  diffcore-rename.c                              gendcc01[0]
22068  Preprocess  epoch.c                                        gendcc01[1]
21930  Compile     blob.c                                         gendcc02[0]
21956  Compile     ident.c                                        gendcc02[1]
22009  Compile     sha1_file.c                                    gendcc03[0]
22028  Compile     config.c                                       gendcc03[1]
22065  Preprocess  tree-diff.c                                    gendcc04[0]
22053  Compile     diffcore-pathspec.c                            gendcc04[1]                     
22071  Preprocess  cat-file.c                                     gendcc05[0]
22054  Compile     diffcore-pickaxe.c                             gendcc05[1]                     
22043  Compile     diff.c                                         gendcc06[0]
22051  Compile     diffcore-order.c                               gendcc06[1]
22070  Preprocess  sha1.c                                         gendcc07[1]


Y un ejemplo de uno en el que hay más enlazado que compilado

22548  Blocked                                                            [0]
22549  Blocked                                                            [0]
22510  Blocked                                                            [0]                     
22545  Blocked                                                            [0]
22497  Blocked                                                            [0]
22499  Blocked                                                            [0]
22500  Blocked                                                            [0]
22502  Blocked                                                            [0]
22503  Blocked                                                            [0]
22111  Compile     index-pack.c                                   gendcc02[0]
22537  Compile                                                   localhost[0]
22521  Compile                                                   localhost[1]
22543  Compile                                                   localhost[2]


Esos ejemplos están hechos con MAKEOPTS=-j15 en un 'cluster' de 8 nodos pero compartido. Si fuera exclusivo para que lo usara yo, probablemente estaríamos hablando de -j20 o -j25. Basándome simplemente en mi experiencia y en las máquinas que lo componen.

Saludos.Ferdy
Ferdy escribió:Esos ejemplos están hechos con MAKEOPTS=-j15 en un 'cluster' de 8 nodos pero compartido. Si fuera exclusivo para que lo usara yo, probablemente estaríamos hablando de -j20 o -j25. Basándome simplemente en mi experiencia y en las máquinas que lo componen


Por dios! [flipa] De que bichos estamos hablando? por que para meter -j20 o -j25....

Por curiosidad, esto al compilar volara, ¿no?

Salu2!
Gracias por la explicación y los ejemplos, y por el comando ese, es bastante más cómodo así. Voy a hacer mis pruebas a ver si le saco partida.

Un par de dudas, por dar un poco el coñazo.

1) Si tengo definido digamos -j8 pero resulta que tengo el segundo equipo apagado por el motivo que sea ¿será contraproducente tener tantos procesos? No hay una forma de definir esto en función del número de nodos?

2) Si le doy poca prioridad al distcc en el servidor, ¿significa que cederá más trabajos al otro equipo, o que esos trabajos se retrasarán (dado el caso) al tener menos prioridad frente a otros procesos del sistema?

\-\adEs, si has seguido la conversación verás que esos -j20 / -j25 se refieren a 8 equipos, y por tanto unos 3 procesos por equipo. ;)

Un saludo.
Si tengo definido digamos -j8 pero resulta que tengo el segundo equipo apagado por el motivo que sea ¿será contraproducente tener tantos procesos? No hay una forma de definir esto en función del número de nodos?


No va a ser contraproducente. Nosotros hemos tenido rachas de nodos que no contestan o están apagados y no se ha notado mucho... Acerca de definirlo en función del número de nodos, me temo que no.

Si le doy poca prioridad al distcc en el servidor, ¿significa que cederá más trabajos al otro equipo, o que esos trabajos se retrasarán (dado el caso) al tener menos prioridad frente a otros procesos del sistema?


Significa que los trabajos de compilación nunca bloquearán otras tareas del servidor.

Saludos.Ferdy
Ok, gracias por la aclaración, lo que habías dicho de que pudiera "saturarse" me había confundido. En tal caso la primera pregunta importa poco.

Un saludo.
9 respuestas