Où sommes nous ?

Retour

DistCC - compilation distribuée

En savoir plus

La doc Gentoo

Certains programmes sont relativement lourds et peuvent prendre des heures sur des machines pas très puissantes. Heureusement, il existe plusieurs solutions et l'un d'entre elles est de compiler sur plusieurs machines en parallèle.

Quelques considérations

Même si Gcc permet de faire facilement des cross compilations, il est déconseillé de mixer les architectures (par exemple, du x86 avec du Sparc ou du PowerPC).

Installation (gentoo)

L'installation se fera par un classique

emerge distcc

Son fichier de configuration est /etc/conf.d/distccd. Il faut s'assurer :

Enfin, il faut que le démon soit démarré au boot

 rc-update add distccd default 

On peut évidemment le lancer à la main par un

 /etc/init.d/distccd start 

Sur la machine maitre

Une fois distcc installé, il faut configurer le maitre pour que les compilations se fassent en distribué. Ça se passe évidemment dans le fichier /etc/make.conf

Enfin, il faut indiquer la liste des machines participant à la compilation.

distcc-config --set-hosts " bidule.chez.moi chose.chez.moi localhost"

Actuellement, distcc ne fait pas de loadbalancing et alloue les tâches dans l'ordre de la liste fournie à distcc-config. Ici, chargera d'abord bidule, puis chose en enfin la machine locale. Si une machine n'est pas joignable, pas de problème, c'est la machine locale qui prendra le relais.

Monitoring

Si USE contient le flag gtk, on dispose d'un moniteur graphique : distccmon-gui. Comme son nom l'indique, il s'agit d'un monitor graphique de l'activité distcc.

Depuis un shell, on le lancera par la commande :

DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-gui &

Si c'est depuis un menu d'openbox, ça devient :

sh -c 'DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-gui'

Cas d'un client Ubuntu

Sous Ubuntu, le fichier de configuration est /etc/default/distcc. Il est important de vérifier :

Un autre problème est que gcc est invoqué par son nom complet, ce qui permet entre autre de s'assurer de n'avoir que des architectures identiques ... le problème est que Ubuntu est compilé pour des 486 et gentoo pour des 686. Le maitre étant sous Gentoo, i686-linux-gnu-gcc sera cherché sans succes, vu que le compilateur est présent sous le nom i486-linux-gnu-gcc ... La solution est d'ajouter dans le /etc/make.conf du maitre les lignes suivantes :

CC='gcc'
CXX='g++'

A nouveau, c'est extrêmement important de ne pas panacher les architectures (Sparc avec Intel par exemple) car maintenant, distcc n'a aucun moyen d'appeler un cross compilateur.

Compilation du kernel

Il est possible d'avoir une compilation collaborative en dehors de portage, par exemple pour compiler le kernel. Il suffit d'utiliser les lignes suivantes :

export DISTCC_HOSTS=$( cat /etc/distcc/hosts )
make CC="distcc" -j4

On n'oubliera pas non plus d'activer les options d'optimisation grâce en affectant la variable CFLAGS.

CFLAGS="-march=pentium4 -O2 -pipe -fomit-frame-pointer"

Avahi / zeroconf

L'un des problèmes lorsque l'on est dans un environnement domestique est que toutes les machines ne sont pas forcement allumée à un instant donné. Mais grâce à Avahi, ce sont les clients eux-mêmes qui annoncent leur existence, plus besoin d'avoir une liste statique de client.

Configurer distcc

La première chose est de compiler distcc avec le USE avahi.

Ensuite, placer dans le fichier /etc/distcc/hosts

+zeroconf

Les limitations

Et si un client est ignoré

On a tout configuré, toutes les machines ont la même architecture, mais une machine est ignorée ... c'est généralement, car elle n'a pas la même version de gcc que maître.

Pour s'en assurer, on peut utiliser le client "Avahi discovery". Les machines éligibles sont visibles dans la catégorie "Distributed Compiler" ont peu afficher leurs caractéristiques en cliquant sur leur nom. Celle qui nous intéresse ici est cc_version.

Mise à jour de Gcc

Gcc n'a pas de dépendance donc pour faire une mise à jour, il suffit de faire

emerge gcc

puis de sélectionner la nouvelle version

chose ~ # gcc-config -l
 [1] i686-pc-linux-gnu-4.5.4 *
 [2] i686-pc-linux-gnu-4.6.3
chose ~ # gcc-config 2
 * Switching native-compiler to i686-pc-linux-gnu-4.6.3 ...
>>> Regenerating /etc/ld.so.cache...                                                                                        [ ok ]

 * If you intend to use the gcc from the new profile in an already
 * running shell, please remember to do:

 *   . /etc/profile

chose ~ # . /etc/profile

en enfin il faut redémarrer distcc pour que la nouvelle version soit prise en compte.

/etc/init.d/distcc restart

Attention : assurez-vous que les compilations fonctionnent avant de purger l'ancien Gcc ... Il se peut que l'installation se passe bien mais que Gcc plante à cause d'une librairie manquante. On trouvera ces dépendances manquantes grâce à revdep-rebuild.

[ 48% ]  *   broken /usr/libexec/gcc/i686-pc-linux-gnu/4.6.3/cc1 (requires libmpc.so.3)
* broken /usr/libexec/gcc/i686-pc-linux-gnu/4.6.3/cc1plus (requires libmpc.so.3)
* broken /usr/libexec/gcc/i686-pc-linux-gnu/4.6.3/lto1 (requires libmpc.so.3)


Visitez :
La liste de nos voyages
Nos sorties Ski et rando
Copyright Laurent Faillie 2001-2017
N'oubliez pas d'entrer le mot de passe pour voir aussi les photos perso.
Contactez moi si vous souhaitez réutiliser ces photos et pour les obtenir avec une plus grande résolution.
Visites durant les 7 derniers jours Nombre de visites au total.

Vous pouvez laissez un commentaire sur cette page.