View Single Post
Old 24-03-2008, 00:00   #1
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
Distcc: usare più pc in rete per compilare un grosso programma

Non so se sono l'unico che non ne avevo ancora sentito parlare: distcc.

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, io ho a disposizione tre pc ed odio gli eccessivi automatismi, quindi l'ho disattivato.
    Ecco per esempio il mio /etc/default/distcc:
    Codice:
    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:
    Codice:
    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 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:
  1. avviamo i demoni su tutti i pc (/etc/init.d/distcc start);
  2. entriamo nella nostra cartella dei sorgenti ed esportiamo qualche variabile d'ambiente:
    Codice:
    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"
  3. 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.
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso