PDA

View Full Version : Distcc: usare più pc in rete per compilare un grosso programma


Gimli[2BV!2B]
23-03-2008, 23:00
Non so se sono l'unico che non ne avevo ancora sentito parlare: distcc (http://distcc.samba.org/).

Il concetto è semplice: il make di un programma è costituito da una grande quantità di pezzetti da compilare singolarmente (*.c/*.cpp nei comuni programmi c/c++), ottenuto il codice oggetto di tutte le parti alla fine si procederà a linkare il tutto in un eseguibile. Perché non dare i singoli file da compilare a più pc in una rete?

Presupposto: il makefile del programma che vogliamo compilare in questo modo dev'essere strutturato in modo da permettere la compilazione concorrenziale, quella che di solito si attiva a forza con make --jobs=NUMERO.

Ora illustrerò i passi necessari per utilizzare questo demone in una distribuzione Debian based.


Installazione (da root):

apt-get install distcc distccmon-gnome -> considero una buona idea non mettere in avvio il demone, ma non nel modo impostato dall'installazione, quindi diciamo pure di sì quando ce lo chiede.



Impostazioni (tutto da root):

rcconf -> disabilitare l'avvio automatico del nostro nuovo demone.
nano /etc/default/distcc ->

ALLOWEDNETS: le reti a cui sarà consentita la comunicazione col demone;
LISTENER: l'indirizzo dell'interfaccia su cui porre in ascolto il demone;
ZEROCONF: scegliamo se usare zeroconf (http://it.wikipedia.org/wiki/Zeroconf), io ho a disposizione tre pc ed odio gli eccessivi automatismi, quindi l'ho disattivato.

Ecco per esempio il mio /etc/default/distcc:STARTDISTCC="true"
ALLOWEDNETS="127.0.0.1 192.168.0.0/16"
LISTENER="192.168.1.2"
NICE="10"
ZEROCONF="false"
nano /etc/distcc/hosts -> Questo passo dovrebbe essere necessario solo se decidete di non utilizzare zeroconf.
Se volete seguire la mia strada eliminate +zeroconf ed inserite localhost host1 host2 hostN (cioè i nomi o gli ip di tutti i pc che vorrete far compilare insieme).
Ad esempio il mio /etc/distcc/hosts è questo:localhost phoenix
Ripetere i passi precedenti su tutti i pc che si vogliono utilizzare.
Visto che alcuni comandi sono uguali per tutti vi ricordo che esiste un modo per inviarli contemporaneamente a più pc: clusterssh (http://www.debian-administration.org/articles/551) oppure "Manda le immissioni a tutte le sessioni" di Konsole (attivabile cliccando col destro su una delle linguette aperte), ma ci sono vari altri modi...



Utilizzo:

avviamo i demoni su tutti i pc (/etc/init.d/distcc start);
entriamo nella nostra cartella dei sorgenti ed esportiamo qualche variabile d'ambiente:PATH=/usr/lib/distcc/:$PATH
CONCURRENCY_LEVEL=4
export CONCURRENCY_LEVEL PATH

CONCURRENCY_LEVEL è importante: indica quante parti si potranno compilare al massimo contemporaneamente. Il valore che mi sembra ottimale è 2*(#hosts), ma se si hanno dei multicore in rete si può salire.
DISTCC_HOSTS: variabile aggiuntiva che permette di impostare gli hosts. Esempio DISTCC_HOSTS="localhost host1 host2 hostN"

distccmon-gnome -> questo programmino offre un'esplicativa rappresentazione grafica della ripartizione del lavoro in rete.


Ora qualsiasi make, make-kpkg, fakeroot make-kpkg eseguito su uno degli host configurati verrà distribuito in rete
(sempre se il make lo supporta e se si impostano le variabili d'ambiente, o se si salvano definitivamente...).

Spero che questa guidola possa risultare interessante e magari utile a qualcuno. Resto in attesa di eventuali segnalazioni di errori/obiezioni.

lotus03
24-03-2008, 11:01
molto interessante! soprattutto per un user gentoo!