2010-09-21 5 views
4

Y a-t-il une raison particulière pour laquelle la phase de liaison lors de la construction d'un projet avec distcc est effectuée localement plutôt que d'être envoyée à d'autres ordinateurs pour être compilée? La lecture des pages blanches distcc n'a pas donné de réponse claire mais je suppose que le temps passé à lier les fichiers objets n'est pas très significatif par rapport à la compilation. Des pensées?Phase de liaison dans distcc

Répondre

6

Le fonctionnement de distcc consiste à pré-traiter localement les fichiers d'entrée jusqu'à ce qu'une seule unité de traduction de fichier soit créée. Ce fichier est ensuite envoyé sur le réseau et compilé. À ce stade, le serveur distcc distant n'a besoin que d'un compilateur, il n'a même pas besoin des fichiers d'en-tête pour le projet. La sortie de la compilation est ensuite ramenée au client et stockée localement en tant que fichier objet. Notez que cela signifie que non seulement la liaison, mais aussi le prétraitement est effectué localement. Cette division du travail est commune à d'autres outils de construction, comme ccache (le prétraitement est toujours effectué, puis il essaie de résoudre l'entrée avec des résultats précédemment mis en cache et si réussit renvoie le binaire sans recompiler). Si vous deviez implémenter un éditeur de liens distribué, vous devez soit vous assurer que tous les hôtes du réseau ont exactement la même configuration, soit vous devez envoyer toutes les entrées requises pour l'opération en un seul lot. Cela impliquerait que la compilation distribuée produise un ensemble de fichiers objets, et tous ces fichiers objets devraient être poussés sur le réseau pour qu'un système distant lie et renvoie le fichier lié. Notez que cela peut nécessiter des bibliothèques système référencées et présentes dans le chemin de l'éditeur de liens, mais non présentes dans la ligne de commande de l'éditeur de liens, de sorte qu'un 'pré-lien' devrait déterminer quel ensemble de bibliothèques doit être envoyé. Même si cela est possible, le système local doit deviner/calculer toutes les dépendances réelles et les envoyer avec un impact important sur le trafic réseau, ce qui peut ralentir le processus, car le coût d'envoi peut être plus élevé que le coût de la connexion. le coût d'obtention des dépendances n'est pas lui-même presque aussi cher que la liaison.

Le projet sur lequel je travaille actuellement a un seul exécutable lié statiquement de plus de 100M. Les bibliothèques statiques varient en taille mais si un système distribué considère que l'exécutable final doit être lié à distance, il nécessitera probablement trois à cinq fois plus de trafic réseau que l'exécutable final (modèles, inlines ... tout cela apparaît dans tous unités de traduction qui les incluent, donc il y aurait plusieurs copies volant autour du réseau).

+0

Merci, cela efface certaines choses. La complexité ajoutée et la surcharge du réseau ne valent probablement pas la mise en œuvre d'un éditeur de liens distribué, et cela pourrait en fait ralentir le processus dans son ensemble. – Matthew

+0

Désolé d'utiliser un ancien thread, mais si les nœuds étaient en fait homogènes, cela rendrait-il possible une liaison distribuée? Connaissez-vous des outils qui existent? Changeriez-vous quelque chose dans votre réponse pour refléter les changements qui sont survenus au cours des six dernières années? – ffledgling

+1

@ffledgling: Je ne suis pas conscient de l'existence d'un éditeur de liens distribué, et pour être honnête, je ne pense pas que cette opération soit facilement répartie sur différentes machines, car la sortie est un fichier unique et chaque nouveau fichier objet ajouté au binary peut affecter le traitement de toutes les autres bibliothèques (plus tard dans la ligne de liaison). –

2

Lier, presque par définition, nécessite que vous ayez tous les fichiers objets à un endroit. Puisque distcc supprime les fichiers objets sur l'ordinateur qui a appelé distcc en premier lieu, la machine locale est le meilleur endroit pour effectuer le lien car les objets sont déjà présents. En outre, la liaison à distance deviendrait particulièrement poilue une fois que vous commencer à jeter des bibliothèques dans le mélange. Si la machine distante a lié votre programme à sa version locale d'une bibliothèque, vous avez ouvert des problèmes potentiels lorsque le binaire lié est renvoyé à la machine locale.

2

La raison pour laquelle la compliation peut être envoyée à d'autres machines est que chaque fichier source est compilé indépendamment des autres. En termes simples, pour chaque fichier d'entrée .c, il existe un fichier de sortie .o issu de l'étape de compilation. Cela peut être fait sur autant de machines différentes que vous le souhaitez. D'autre part, la liaison recueille tous les fichiers .o et crée un binaire de sortie. Il n'y a pas vraiment beaucoup à distribuer là-bas.

+1

Cela est vrai, mais n'y a-t-il pas des cas où le projet que vous voulez construire se termine avec plusieurs assemblages (exes, dll)? Dans ce cas, le temps de construction global ne bénéficierait-il pas de la distribution du processus de liaison? – Matthew

+0

Dépend de ce que vous devez faire pour réellement effectuer un lien distribué.A ce jour, distcc n'a pas besoin que les serveurs distants aient * * n'importe quoi * en commun (mais la version du compilateur) avec les clients. Le client effectue une pré-procédure (en supprimant la dépendance sur les variables de construction et les en-têtes) et envoie un seul fichier prétraité sur le réseau. Le fichier est autonome et le système distant peut le compiler sans nécessiter d'autre fichier. Pour ne pas augmenter les exigences, le compilateur devrait envoyer tous les fichiers objets et les bibliothèques sur le réseau, puis récupérer l'objet lié. –

Questions connexes