Distcc

Από Κοινότητα Ελεύθερου Λογισμικού ΕΜΠ
Μετάβαση σε: πλοήγηση, αναζήτηση

Ο distcc μας επιτρέπει να μοιράσουμε τη μεταγλώττιση κώδικα C, C++, Objective C ή Objective C++ σε πολλά μηχανήματα μέσω δικτύου. Ο παραγόμενος κώδικας δεν διαφέρει από μια τοπική μεταγλώττιση. Ο distcc:

  • χρησιμοποιεί τον compiler του συστήματος, για παράδειγμα τον gcc. Πρέπει να έχουμε εγκατεστημένη την ίδια έκδοση του σε όλα τα μηχανήματα που θα χρησιμοποιηθούν.
  • δεν απαιτεί οι υπολογιστές να μοιράζονται ένα σύστημα αρχείων ή να έχουν εγκατεστημένο το αναγκαίο σύνολο βιβλιοθηκών για τον κώδικα που μεταγλωττίζεται.
  • μπορεί να χρησιμοποιηθεί με διαφορετικά λειτουργικά συστήματα ή ακόμα και διαφορετικές αρχιτεκτονικές, αρκεί να είναι διαθέσιμος ο κατάλληλος cross compiler.

Τοπολογία

Όσα περιγράφονται εδώ έχουν δοκιμαστεί:

  • με ένα Pentium 4 (1.8GHz) desktop σε ρόλο client. Για αυτόν προορίζεται ο κώδικας που παράγουμε και σε αυτόν χρησιμοποιούμε το make. Έχει εγκατεστημένο Slackware 12 και το όνομά του είναι vbox.
  • με ένα Core 2 Duo laptop (T5500, 2 πυρήνες από 1.66GHz) σε ρόλο server. Ακούει στο όνομα oaxaca. Έχει εγκατεστημένο Debian testing AMD64 αλλά ο σκοπός είναι να παράγουμε 32bit κώδικα. Αντί για cross-compiler θα χρησιμοποιήσουμε ένα 32bit Slackware chroot.

Τα μηχανήματα θα μπορούσαν να είναι πολλά περισσότερα από 2. O distcc υπόσχεται σχεδόν γραμμική κλιμάκωση.

Εγκατάσταση

Chroot

Για τη δημιουργία του chroot περιβάλλοντος που αναφέρεται παραπάνω σε Slackware μπορείτε να ακολουθήσετε αυτό το howto. Πακετάρουμε το directory και το μεταφέρουμε στο Debian σύστημα, έστω στο directory /chroot. Με την εντολή # chroot /chroot σε ένα τερματικό η τρέχουσα διεργασία και οι υποδιεργασίες της βλέπουν ως / το /chroot και δεν ξέρουν τι υπάρχει στο υπόλοιπο σύστημα. Για τη δημιουργία chroot στο Debian μπορεί να χρησιμοποιηθεί το debootstrap, όπως περιγράφεται στο Debian Reference.

Για τη χρήση 32bit chroot σε x86_64 σύστημα πρέπει να είναι ενεργοποιημένη η επιλογή CONFIG_IA32_EMULATION του πυρήνα (Executable file formats / Emulations ---> IA32 Emulation στο menuconfig. Μην ανησυχείτε για αυτό αν χρησιμοποιείτε τον πυρήνα της διανομής σας.

Πακέτα

Σε όλα τα συστήματα, στην περίπτωσή μας στο vbox και στο chroot, εγκαθιστούμε το πακέτο του distcc. Στο vbox θα χρησιμοποιήσουμε τον client (distcc) και στο chroot τον daemon (distccd). Προφανώς πρέπει να είναι εγκατεστημένα και τα πακέτα του gcc (δεν πειράζει στο ένα σύστημα να έχουμε gcc 4.1.1 και στο άλλο 4.1.2, πειράζει να έχουμε στο ένα 4.1.x και στο άλλο 4.2.x).

Χρήση

Στον server

Στους servers (εδώ στο chroot) τρέχουμε τον distccd daemon ως εξής:

# distccd --daemon --allow 192.168.1.2

Η παράμετρος --daemon καθορίζει ότι ο distccd θα τρέξει αυτόνομα και όχι μέσω του inetd. Η παράμετρος --allow καθορίζει τη διεύθυνση ή το εύρος διευθύνσεων από την οποία δεχόμαστε αιτήσεις. Καλό είναι να δημιουργήσουμε έναν χρήστη για τον distccd, ενώ η χρηση του πρέπει να αποφεύγεται σε ανασφαλή δίκτυα. Ίσως η διανομή σας παρέχει και κάποιο init script για τον distccd.

Κατά την αποσφαλμάτωση μπορούμε να χρησιμοποιήσουμε σύνταξη της μορφής:

# distccd --daemon --allow 192.168.1.2 --no-detach --verbose

με την οποία ο distccd παραμένει στο foreground και εμφανίζει περισσότερα μηνύματα.

Για περισσότερες λεπτομέρειες σας παραπέμπουμε όπως πάντα στην αντίστοιχη man σελίδα ;-).

Στον client

Στον client η μεταβλητή περιβάλλοντος DISTCC_HOSTS καθορίζει τους servers που θα χρησιμοποιηθούν:

$ export DISTCC_HOSTS="192.168.1.2 localhost"

Η λίστα μπορεί να περιλαμβάνει ή όχι τον ίδιο τον client (localhost). Η σειρά έχει σημασία και το πρώτο σύστημα έχει την υψηλότερη προτεραιότητα. Καλό είναι δηλαδή τα γρηγορότερα συστήματα να εμφανίζονται πρώτα.

Αρκεί τώρα να χρησιμοποιήσουμε τoν distcc αντί για έναν τοπικό compiler με την ακόλουθη σύνταξη:

distcc <compiler> [compiler options]

Ο compiler μπορεί να παραλειφθεί αν είναι o gcc (και όχι, για παράδειγμα, ο g++) ενώ και τα compiler options είναι προαιρετικά.

Με το make

Τα configure scripts που βρίσκουμε συνήθως στα source tarballs διαβάζουν την μεταβλητή περιβάλλοντος CC που αντιστοιχεί στον C compiler και θέτουν την ομώνυμη μεταβλητή στο Makefile.

Είναι σύμβαση σε ένα σωστό Makefile να χρησιμοποιείται η μεταβλητή CC για τον C compiler. Αν αυτό ισχύει μπορούμε να καθορίσουμε ότι θα χρησιμοποιηθεί ο distcc ως εξής:

make -j6 CC=distcc

παρακάμπτουμε δηλαδή την προκαθορισμένη τιμή του CC. Η παράμετρος -j καθορίζει τον αριθμό των εργασιών που θα εκτελεστούν παράλληλα. Ένας εμπειρικός κανόνας είναι 2 επί τον αριθμό των διαθέσιμων επεξεργαστών ή πυρήνων. Προσέξτε ότι το CC το δίνουμε δεξιά από το make (δηλαδή ως παράμετρο γραμμής εντολών) και όχι αριστερά (δηλαδή ως μεταβλητή περιβάλλοντος γιατί θα είχε χαμηλότερη προτεραιότητα από την τιμή που καθορίζεται στο Makefile).

Παρακολούθηση

Με τα προγράμματα distccmon-text και distccmon-gnome μπορείτε κάθε στιγμή να δείτε τι μεταγλωττίζεται και σε ποιο μηχάνημα. Με ένα εργαλείο σαν το top ή το gnome-system-monitor μπορείτε να δείτε το ποσοστό χρήσης των CPU.

Δείξε μας τους αριθμούς

Το αγαπημένο μας benchmark είναι η μεταγλώττιση του Linux πυρήνα. Μεταγλωττίζουμε τον 2.6.22 με το ίδιο config, τοπικά στο vbox και με το distcc. Τα συμπεράσματα δικά σας ;-).

Τοπικά

$ make clean &>/dev/null && time { make &>/dev/null; }

real    13m43.313s
user    12m26.840s
sys     1m3.539s

Με distcc και συμμετοχή του localhost

$ make clean &>/dev/null && time { DISTCC_HOSTS="oaxaca localhost" make -j6 CC=distcc &>/dev/null; }

real    5m59.762s
user    4m44.973s
sys     1m4.755s

Με distcc χωρίς συμμετοχή του localhost

$ make clean &>/dev/null && time { DISTCC_HOSTS=oaxaca make -j4 CC=distcc &>/dev/null; }

real    4m38.197s
user    2m27.640s
sys     1m0.102s

Σύνδεσμοι