distcc ou la compilation multi-machines

Cet outil permet de lancer une compilation en parallelle sur plusieurs machines accélérant ainsi le traitement.

Dans cet exemple je vais compiler un php-4.3.3 sur une machine cliente nommée debip124

s'exécutant dans une vmware l'hote etant un win2000 equipe d'1 Go de RAM et d'un céléron 2.4

Le serveur est un PIII 650 portable HP6000 avec une connexion wifi !

L'install et l'utilisation sont simplissimes :

apt-get install distcc sur les 2 machines (qq dependances netbase, net-ping etc...)
Verifier que les versions de make, gcc sont identiques sur les 2 machines :


root@portable:~# dpkg -l gcc make
||/ Nom                                 Version                             Description
+++-===================================-===============================
ii  gcc                                 3.3.5-3                             The GNU C compiler
ii  make                                3.80-9                              The GNU version of the "make" utility.

debip124:/usr/local/php-4.3.3# dpkg -l gcc make
||/ Name                              Version                           Description
+++-=================================-=================================
ii  gcc                               3.3.5-3                           The GNU C compiler
ii  make                              3.80-9               The GNU version of the "make" utility.
debip124:/usr/local/php-4.3.3#    


On lance le demon sur le serveur par :
root@portable:~#distccd --allow 192.168.0.124 &

Cote client quelques definitions d'environnement :
debip124:/usr/local/php-4.3.3# export DISTCC_HOSTS='localhost portable'

Puis lancement de la compil par :
debip124:/usr/local/php-4.3.3# make -j2 CC=distcc 

Terminé, il n'y a plus qu'à faire des tests de perf. Voir en fin d'article :

Un extrait de ps ax cote serveur pendant la compil :

16001 ?        SNs    0:00 distccd --allow 192.168.0.124
16002 ?        SN     0:00 distccd --allow 192.168.0.124
16003 ?        SN     0:00 distccd --allow 192.168.0.124
16004 ?        SN     0:00 distccd --allow 192.168.0.124
16229 ?        SN     0:00 cc -g -O2 -c /tmp/distccd_b57fd938.i -o /tmp/distccd_b529d938.o
16230 ?        RN     0:00 /usr/lib/gcc-lib/i486-linux/3.3.5/cc1 -fpreprocessed /tmp/distccd_b57fd938.i -quiet -dumpbase distccd_b57fd938.i -auxbase-strip /tmp/distc
16231 ttyp2    R+     0:00 ps ax
Les logs cote serveur pendant la compil
Apr 15 13:28:11 portable distccd16003: (dcc_check_client) connection from ::ffff:192.168.0.124:2126
Apr 15 13:28:11 portable distccd16003: compile from libmysql.c to libmysql.o
Apr 15 13:28:11 portable distccd16003: (dcc_r_file_timed) 233902 bytes received in 0.082385s, rate 2773kB/s
Apr 15 13:28:15 portable distccd16003: (dcc_collect_child) cc times: user 3.131523s, system 0.090986s, 4983 minflt, 0 majflt
Apr 15 13:28:15 portable distccd16003: cc /usr/local/php-4.3.3/ext/mysql/libmysql/libmysql.c on localhost completed ok
Apr 15 13:28:15 portable distccd16003: job complete
Apr 15 13:28:15 portable distccd16004: (dcc_check_client) connection from ::ffff:192.168.0.124:2127
Apr 15 13:28:15 portable distccd16004: compile from my_malloc.c to my_malloc.o
Apr 15 13:28:15 portable distccd16004: (dcc_r_file_timed) 122685 bytes received in 0.044658s, rate 2683kB/s
Apr 15 13:28:15 portable distccd16004: (dcc_collect_child) cc times: user 0.297954s, system 0.030995s, 2505 minflt, 0 majflt
Apr 15 13:28:15 portable distccd16004: cc /usr/local/php-4.3.3/ext/mysql/libmysql/my_malloc.c on localhost completed ok
Apr 15 13:28:15 portable distccd16004: job complete
Verif du port d'ecoute :
root@portable:~# netstat -lnp|grep dist
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp6       0      0 :::3632                 :::*                    LISTEN     16001/distccd
J'ai relance une compil de php4 sur le portable cette fois :

Avec l'aide de l'autre machine : environ 2mn 30
Sans l'aide de l'autre machine : environ 5mn.