Distcc est un programme conçu pour distribuer les tâches de compilation entre plusieurs machines en réseau. Il est composé d'un serveur, distccd, et d'un programme client, distcc. Distcc, après une petite étape de configuration, peut fonctionner de façon transparente avec ccache, Portage et automake.
Utiliser distcc lors de l'installation de Gentoo
Si vous comptez utiliser distcc pour accélérer l'installation de Gentoo, veuillez consulter la section Utiliser distcc pour l'installation plus loin dans ce document.
Pour utiliser distcc, tous vos ordinateurs doivent utiliser la même version du compilateur GCC. Plusieurs versions 3.3.x avec différentes valeurs pour x fonctionneront, mais, si vous mélangez des versions 3.3.x et 3.2.x, vos programmes pourraient ne pas se compiler ou contenir des erreurs à l'exécution.
L'installation de distcc est vraiment simple. Il y a néanmoins quelques options que vous devriez connaître.
Distcc est fourni avec deux interfaces graphiques qui permettent la supervision des tâches que votre ordinateur envoie pour la compilation. Si vous utilisez Gnome, alors il vous suffit d'ajouter gnome à vos options USE. Cependant, si vous n'utilisez pas Gnome et que vous souhaitez néanmoins avoir un outil de supervision, alors vous pouvez ajouter gtk à vos options USE.
Exemple de code 2.1 : Installer distcc |
# emerge distcc distcc-config
|
Important : N'oubliez pas que vous devez installer distcc sur toutes les machines participantes. |
Configurer Portage pour qu'il utilise distcc
Configurer distcc est très simple avec Portage. Sur chaque ordinateur où vous voulez utiliser distcc, suivez simplement les étapes suivantes :
Exemple de code 2.2 : Intégrer distcc à Portage |
# emerge distcc # nano -w /etc/make.conf (Utiliser une valeur pour N qui correspond à votre environnment.) (Une valeur courante est 2 fois le nombre total de processeurs plus 1.) MAKEOPTS="-jN" (Ajouter distcc à la variable FEATURES.) FEATURES="distcc" |
Ensuite, vous devez définir quels sont les serveurs que vous voulez utiliser. Pour ce faire, vous pouvez utiliser la commande distcc-config pour créer la liste des serveurs. Voici un exemple de la définition de quelques serveurs qui pourraient se trouver dans votre liste :
Exemple de code 2.3 : Exemples de liste de serveurs |
192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.1/2 192.168.0.2 192.168.0.3/10 192.168.0.1:4000/2 192.168.0.2/1 192.168.0.3:3632/4 @192.168.0.1 @192.168.0.2:/usr/bin/distccd 192.168.0.3 (D'autres méthodes existent pour définir des serveurs.) (Veuillez consulter la page man pour plus d'informations.) Si vous voulez aussi compiler sur la machine locale, vous devez ajouter « localhost » à la liste des hôtes. Inversement, si vous ne voulez pas utiliser la machine locale (ce qui est souvent le cas), omettez-le de la liste. Sur une machine lente, utiliser le localhost peut même ralentir les choses. C'est une bonne idée de tester les performances de la configuration. |
Cela peut sembler compliqué, mais dans la plupart des cas, une variante de la ligne 1 ou 2 suffira.
Étant donné que la plupart des gens n'utiliseront pas les lignes 3 et 4, je vous prierai de vous référer à la documentation de distcc (man distcc) pour de plus amples d'informations, qui inclut d'être capable d'exécuter distcc sur une connexion SSH.
Un exemple d'utilisation de la commande pour ajouter des serveurs (pour la ligne 1) :
Exemple de code 2.4 : Exemple de commande pour ajouter des serveurs |
# /usr/bin/distcc-config --set-hosts "192.168.0.1 192.168.0.2 192.168.0.3"
|
Ensuite, modifiez le fichier /etc/conf.d/distccd en fonction de votre environnement et n'oubliez pas l'option --allow qui permet de n'autoriser l'accès qu'aux machines que vous connaissez. De plus, vous devriez utiliser l'option --listen pour indiquer au démon distcc sur quelle adresse IP il doit répondre aux demandes de compilation (surtout sur les systèmes qui ont plusieurs cartes réseau). Vous trouverez plus d'information dans le Distcc Security Design.
Important : Il est important d'utiliser --allow et --listen. Veuillez lire le manuel de distccd ou le document au sujet de la sécurité cité ci-dessus pour plus d'informations. |
Ensuite, lancez le démon distcc sur chaque machine :
Exemple de code 2.5 : Démarrer le démon distcc |
(Ajouter distccd au niveau d'exécution par défaut.) # rc-update add distccd default (Démarrer le démon distcc.) # /etc/init.d/distccd start |
Configurer distcc pour fonctionner avec automake
C'est encore plus simple que la mise en place avec Portage. Il vous suffit de modifier votre variable d'environnement PATH pour y insérer /usr/lib/distcc/bin avant le chemin où se trouve gcc (/usr/bin). Cependant, si vous utilisez ccache, prenez garde à mettre le chemin de distcc après celui de ccache, ce qui se fait de la façon suivante :
Exemple de code 2.6 : Configurer votre PATH |
# export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}" (Vous pouvez mettre ceci dans votre fichier ~/.bashrc ou équivalent pour que la variable PATH soit automatiquement configurée à chaque fois que vous vous connectez.) |
Ceci fait, au lieu de lancer make, vous devez utiliser make -jN (où N est un entier). Une valeur sûre pour N varie selon votre réseau et le type d'ordinateurs que vous utilisez pour compiler. Testez vos propres valeurs afin de trouver la plus appropriée.
3. La compilation croisée (« Cross-Compiling »)
La compilation croisée utilise un certain type d'architecture afin de générer des programmes pour un autre type d'architecture. Ceci peut être aussi simple que d'utiliser un Athlon (i686) pour générer des programmes pour un K6-2 (i586) ou d'utiliser une Sparc pour compiler un programme pour un ppc. Veuillez consulter notre Guide de compilation croisée avec DistCC pour plus d'informations.
4. Utiliser distcc pour l'installation (« bootstrap »)
Étape 1 : configurer votre nouvelle machine
Vous devez démarrer votre nouvelle machine avec le LiveCD de Gentoo et suivre toutes les étapes jusqu'au « bootstrap ». Vous trouverez quelques détails sur cette méthode qui n'est plus recommandée dans notre FAQ. Procédez ensuite à la petite installation préliminaire qui suit sur votre nouvelle machine.
Exemple de code 4.1 : Configuration préliminaire |
# nano -w /etc/make.conf (Ajouter distcc aux FEATURES.) FEATURES="distcc" (Ajouter l'option -jN à MAKEOPTS où N vaut le double du nombre de processeurs plus un.) MAKEOPTS="-jN" |
Installer distcc :
Exemple de code 4.2 : Installer distcc sur la nouvelle machine |
# USE='-*' emerge --nodeps sys-devel/distcc
|
Ensuite, utilisez la commande distcc-config --install pour configurer distcc :
Exemple de code 4.3 : Configuration finale de distcc |
(Remplacer les host1, host2... par les adresses IP des machines.) # /usr/bin/distcc-config --set-hosts "localhost host1 host2 host3 ..." Par exemple : /usr/bin/distcc-config --set-hosts "localhost 192.168.0.4 192.168.0.4 |
Distcc devrait maintenant être configuré pour le « bootstrap » ! Reprenez le guide officiel d'installation où vous l'avez laissé et n'oubliez pas d'exécuter à nouveau emerge pour distcc après la commande emerge system.
Note : Veuillez remarquer que distcc ne sera pas utilisé pour toutes les compilations pendant le « bootstrap » et le emerge system. Son utilisation a été volontairement désactivée dans certains paquets qui ne peuvent pas être compilés via distcc. |
Certains paquets n'utilisent pas Distcc
Parfois, vous noterez que vos compilations de paquets ne sont pas toutes distribuées (et en effet pas créées en parallèle). La raison est soit que le fichier make du paquet ne supporte pas la compilation en parallèle, soit que les développeurs des ebuilds ont désactivé la possibilité de génération en parallèle, car ces paquets sont connus pour poser des problèmes.
Cela veut dire que parfois distcc peut entraîner l'échec d'une compilation. Si cela se produit, veuillez le signaler via http://bugs.gentoo.org.
Mélange de diverses versions de GCC
Si vous avez différentes versions de GCC sur vos serveurs, d'étranges problèmes surviendront. La solution est de vous assurer que tous les serveurs ont la même version de gcc.
Des versions récentes de Portage utilisent ${CHOST}-gcc au lieu de gcc. Cela signifie que si vous utilisez des machines i686 avec d'autres telles que des i386 ou i586, vous recontrerez des problèmes. Une solution semble être d'utiliser export CC='gcc' CXX='c++' ou de le définir dans le fichier /etc/make.conf.
Important : Faire ceci redéfinit explicitement le comportement de Portage et cela pourrait donner des résultats étranges plus tard. Ne faites ceci que si vous mélangez des CHOST. |
Depuis GCC 4.3.0, le compilateur supporte le paramètre -march=native qui permet de détecter automatiquement le CPU et les optimisations qui valent la peine d'être activées pour le processeur sur lequel GCC s'exécute. C'est un problème pour distcc puisqu'il permet de produire du code optimisé pour différents processeurs (comme les AMD Athlon et les Intel Pentium). N'utilisez pas -march=native ou -mtune=native dans votre variable CFLAGS ou CXXFLAGS si vous compilez avec distcc.
Les outils de supervision distcc
Distcc est fourni avec deux outils de supervision. Une version qui fonctionne en mode texte est automatiquement installée ; elle s'appelle distccmon-text. À la première exécution, l'outil peut paraître déroutant mais il est en fait très simple d'utilisation. Si vous l'exécutez sans paramètre, il s'exécutera une seule fois. Cependant, si vous lui passez un nombre N en argument, il affichera les informations toutes les N secondes.
L'autre moniteur est seulement installé si vous utilisez gtk ou gnome dans vos options USE. Celui-ci est en mode graphique (comme vous l'aviez sans doute deviné), est basé sur la bibliothèque GTK+ et est vraiment joli. Pour Gentoo, ce moniteur se nomme distccmon-gui pour moins de confusion. Ailleurs, il est parfois appelé distccmon-gnome.
Exemple de code 6.1 : Démarrer la supervision |
# distccmon-text N (Ou) # distccmon-gui Pour surveiller l'activité de Portage : # DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-text N (Ou) # DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-gui |
Important : Si le répertoire de distcc est ailleurs sur votre système, définissez la variable DISTCC_DIR en conséquence. |
Ce document est protégé par la licence Creative Commons : Paternité - Partage des Conditions Initiales à l'Identique 2.5.