Ταχύτερα compile με ccache και distcc Βασίλης Στούμπος stoumpos@di.uoa.gr δαίμων, τεύχος 13 http://daemon.di.uoa.gr/daemon/issue13
Περίληψη Περιπτώσεις Χρήσης Compilation μεγάλων project Rebuild κατά το development Προσεγγίσεις Χρήση cache στον preprocessor Χρήση μηχανημάτων στο δίκτυο
Εγκατάσταση Πλατφόρμα Δοκιμές σε Debian GNU/Linux Εφαρμογή σε όλα τα UNIX-like λειτουργικά Ίσως Windows (mingw,...)./configure ; make ; make install... ccache http://ccache.samba.org/ distcc http://distcc.samba.org/
Σημείωση Πρέπει να υπάρχει ένα οργανωμένο build process Build Process Makefiles Autotools
Πολλαπλές Διεργασίες Πολλές διεργασίες για ένα compile Παράδειγματα: > make all [...] > make -j 3 all [...]
Hyper-threading Επεξεργαστής Pentium IV, 2.8GHz, hyperthreading Συνεχόμενες μεταγλωττίσεις: real user sys total clean 0.9 0.1 0.3 0.4 all 19.2 12.8 5.8 18.6 all -j 2 16.8 16.3 6.6 22.9 all -j 3 16.7 16.4 6.6 23.1 all -j 4 16.6 16.4 6.5 22.9 all -j 8 16.6 16.3 6.7 22.9 all -j 16 16.3 16.4 6.6 23.0 all -j 32 16.6 16.3 6.6 23.0
Hyper-threading Επεξεργαστής Pentium IV, 2.8GHz, hyperthreading Συνεχόμενες μεταγλωττίσεις: 25 22.5 20 17.5 Multi-Process Compile Times time [sec] 15 12.5 10 7.5 5 2.5 0 clean all all -j 2 all -j 3 all -j 4 all -j 8 all -j 16 all -j 32 processes real user sys total
Πολλαπλές Διεργασίες σε Δίκτυο Compile σε μηχανήματα στο δίκτυο Παράδειγμα χρήσης distcc: > export DISTCC_HOSTS='localhost @alastor @esperos' > export CC=distcc > make -j 8 all [...]
Ρυθμίσιες distcc Πρέπει να εκτελούνται οι κατάλληλοι δαίμονες: distccd --daemon Περιβάλλον remote authentication Λίστα μηχανήματων: localhost, τοπική εκτέλεση host, απλή tcp σύνδεση @host, σύνδεση ssh user@host, σύνδεση ssh Αρχεία /etc/distcc/hosts και ~/.distcc/hosts
Χρήση Δικτύου Δύο Pentium IV και ένας Pentium II. Συνεχόμενες μεταγλωττίσεις με distcc: real user sys total all 18.1 12.1 5.7 17.7 all -j 2 16.4 16.1 6.6 22.7 all -j 3 16.4 16.2 6.7 22.8 all -j 4 16.5 16.4 6.6 23.0 all -j 8 16.2 16.3 6.6 22.9 all -j 16 16.8 16.4 6.6 23.0 all -j 32 16.3 16.1 6.6 22.6
Χρήση Δικτύου Δύο Pentium IV και ένας Pentium II. Συνεχόμενες μεταγλωττίσεις με distcc: 25 22.5 20 17.5 distcc Compile Times time [sec] 15 12.5 10 7.5 5 2.5 0 all all -j 2 all -j 3 all -j 4 all -j 8 all -j 16 all -j 32 make options real user sys total
Preprocessor Cache Compile με λιγότερες εκτελέσεις του preprocessor Παράδειγμα χρήσης ccache: > make all CC=ccache [...] > ccache -s cache hit 336 cache miss 83 called for link 45 files in cache 166 cache size 1.6 Mbytes max cache size 976.6 Mbytes
Ρυθμίσεις ccache Στατιστικά Εμφάνιση: ccache -s Καθαρισμός: ccache -z Cache Καθαρισμός: ccache -c Άδειασμα: ccache -C Μεταβλητές CCACHE_DIR: κατάλογος cahce mount σαν tmpfs ~ 10-20% βελτίωση CCACHE_LOGFILE: αρχείο μετρήσεων Άλλα... ccache -h
Παράδειγμα ccache (1/2) > ccache -c Cleaned cache > ccache -C Cleared cache > ccache -z Statistics cleared > ccache -s cache hit 0 cache miss 0 files in cache 0 cache size 0 Kbytes max cache size 976.6 Mbytes > make all CC='ccache gcc' [...]
Παράδειγμα ccache (2/2) > ccache -s cache hit 0 cache miss 83 called for link 9 files in cache 166 cache size 1.6 Mbytes max cache size 976.6 Mbytes > make clean [...] > make CC='ccache gcc' [...] > ccache -s cache hit 83 cache miss 83 called for link 18 files in cache 166 cache size 1.6 Mbytes max cache size 976.6 Mbytes
Χρήση preprocessor cache Συνεχόμενες μεταγλωττίσεις με ccache: real user sys total all (1st) 19.3 12.8 6.1 18.9 all (2nd) 14.3 8.5 5.5 14.0 all (2nd) 14.3 8.5 5.5 14.0 all -j 3 13.5 10.5 6.5 17.0
Χρήση preprocessor cache Συνεχόμενες μεταγλωττίσεις με ccache: 20 18 16 14 ccache Compile Times time [sec] 12 10 8 6 4 2 0 all (1st) all (2nd) all (2nd) all -j 3 make options real user sys total
Συνδυασμός distcc και ccache Compile παράλληλα στο δίκτυο Κλήση preprocessor μόνο όταν είναι απαραίτητο Απαιτείται κοινή cache > export DISTCC_HOSTS='localhost @alastor @esperos' > export CCACHE_DIR=/Data/Cache/CCache > export CCACHE_LOGFILE=/Data/Cache/CCache.log > export CCACHE_PREFIX=distcc > export CC='ccache gcc' > make all -j8 [...]
Χρήση preprocessor cache και κόμβων δικτύου Συνεχόμενες μεταγλωττίσεις με distcc και ccache: real user sys total all 18.1 12.1 5.7 17.7 all -j 2 16.4 16.1 6.6 22.7 all -j 3 16.4 16.2 6.7 22.8 all -j 4 16.5 16.4 6.6 23.0 all -j 8 16.2 16.3 6.6 22.9 all -j 16 16.8 16.4 6.6 23.0 all -j 32 16.3 16.1 6.6 22.6
Χρήση preprocessor cache και κόμβων δικτύου Συνεχόμενες μεταγλωττίσεις με distcc και ccache: 25 22.5 20 17.5 distcc & ccache Compile Times time [sec] 15 12.5 10 7.5 5 2.5 0 alll all -j 2 all -j 3 all -j 4 all -j 8 all -j 16 all -j 32 make options real user sys total
Συμπεράσματα Μικρά, προσωπικά projects Πολύ χρήσιμο το ccache Διαφορά ~ 30-40% σε hyper-threading cpu Δεν δοκίμασα tmpfs για την cache Πολλοί προγραμματιστές Χρειάζεται ειδική ρύθμιση Κέρδος σε μεγάλα projects Πολύ μεγάλα projects Π.χ. kernel compile Δεν δοκίμασα κάτι Πολύ χρήσιμο το distcc Με ειδική ρύθμιση, το ccache βελτιώνει ακόμα περισσότερο το χρόνο
Ευχαριστώ Έπρεπε να είχα χρησιμοποιήσει latex/beamer, το openoffice έχει πολύ δρόμο να καλύψει...