Come velocizzare il tuo progetto utilizzando “build server farm”

Storia
Ecco dei progetti su cui ho lavorato con un laptop da 1.4GHz:

    • Progetto CRT TV basato su 8051, sorgente 100KB, Keil, compilazione 5 minuti.

    • Progetto LCD TV basato su 8051, sorgente 20MB, Keil e Cygwin, compilazione 45 minuti

    • Progetto LCD DTV basato su MIPS, sorgente 600MB~5GB, GCC e Cygwin, compilazione 1~4 ore.

Attualmente una compilazione completa per un progetto dell'8051 è piuttosto veloce. Comunque, la nostra società usa alcuni algoritmi di crittografia per proteggere il software IP (Proprietà Intellettuale - codice sorgente), per cui il make script deve decriptare i file sorgenti in memoria e poi li compila e crea i link tra i file object e i file ABS/HEX. Il tempo finale di compilazione aumenta drasticamente. L'ultimo progetto DTV basato sull’ultimo MIPS fu il caso peggiore che abbia mai sperimentato. Ho esitato a cambiare qualunque codice di quel progetto, perché anche una piccola variazione di un file header richiedeva una compilazione di circa 1~4 ore. Il tempo di compilazione era una grande pressione per me quando visitai il mio cliente per un supporto sul luogo. Ogni volta il cliente chiedeva un cambiamento nel progetto, mi ci volle molto tempo per compilarlo e testarlo. Il progetto fu ritardato, ma io non potevo recuperare in ogni modo. Tentai di trovare da solo una soluzione, e scoprii che alcuni computer (anche gli ultimi modelli) nel mio ufficio aziendali non venivano usati sempre.

Quindi ho settato connessioni VPN tra il mio laptop e questi desktop PC. Ho inserito il codice sorgente su questi PC, così posso fare il login a questi PC in remoto per cambiare il codice sorgente e fare la compilazione mentre il mio laptop può essere disponibile per lavori normali. Se ci sono richieste parallele di variazioni in ingresso, farò il login ad un PC diverso per effettuare la compilazione. Questa soluzione è piuttosto utile per gestione di richieste di variazione parallele. In ogni modo, il tempo di compilazione è ancora elevato. Credo che il tempo utilizzato per il processo di compilazione si verifichi anche in molte applicazioni incluso la simulazione VHDL e in studio medico.

Il distcc di Samba sembra una buona soluzione di sistema di compilazione distribuito. Esiste il supporto preliminare per altri compilatori ma l’attenzione principale è sul GCC. Fortunatamente, GCC è stato migrato su molti microcontrollori, incluso il popolare AVR, PIC18, ARM, MIPS, 68K, H8 e C166. Se si usano gli altri compilatori come 8051, si dovranno cercare soluzioni commerciali. (per essere onesti, non ci sono ancora riuscito).

distcc
distcc è un programma di compilazione distribuito per C, C++, il codice Objective C o Objective C++ attraverso i computer in una rete locale. L'assembler è supportato se necessario. Proprio perchè distcc invia sempre il codice analizzato ai server di compilazione, genera risultati identici come compilazione locale se i server di compilazione hanno installato lo stesso compiler con la macchina locale. distcc è in grado di funzionare indipendentemente su piattaforme diverse come Linux, UNIX, FreeBSD, Cygwin su Windows.

Permetteteci di illustrare l'uso di distcc sul sistema Debian/Ubuntu.

    1. Prima, installare distcc su client e server. Si può installare distcc attraverso tar ball, RPM (Red hat, Fedora) o emerge (Gentoo). Su Ubuntu, si dovrebbe usare apt-get come di seguito:
    •sudo apt-get install distcc

    2. Appena l’installazione è completata, si può trovare distcc(client), distccd(server daemon) e distccmon-text(monitor progresso di compilazione) nel percorso /usr/bin/ e la cartella di configurazione in ~ /.distcc dopo l’installazione.
    3. Poi, avviare distcc daemon su ogni server:
    • distccd-- daemon
    Si possono usare- le opzioni allow per limitare l’accesso.
    4. Se si vuole avviare distccd sullo startup, si può aggiungere distcc come processo al sysvinit di Linux.
    5. Per compilare un progetto l'interfaccia dovrebbe essere installata sul client PC:
    • export DISTCC_HOSTS="localhost fastest faster slow"

Qui "fastest faster slow " sono i nomi di sistema dei server. L'ordine dei loro nomi è classificato secondo la loro potenza di elaborazione. Il localhost del PC client è ugualmente un server opzionale. In ordine, distcc osserva in $DISTCC_HOSTS, i file utente $DISTCC_DIR/hosts e i file principali system-wide. Se non si riesce a trovare nessuna lista principale (host list), distcc emette un avvertimento e compila localmente.

    6. Infine, si compila il progetto:
    • cd yourproject
    • make -j8 CC=distcc

L’opzione j di CC è un’opzione di compilazione parallela di GNU make, 8 file per ogni batch di compilazione distribuita. Anche se noi installiamo CC=distcc, ma distcc è un front-end di GCC, piuttosto che un reale compilatore.

    7. Ultimo, ma non meno importante, distcc offre le utility di monitor chiamate distccmon-text e distccmon-gnome per permettere al project owner di controllare lo stato di compilazione sui server.

Conclusione
distcc ha molte porte incluso Cygwin, Sharp Zaurus. Quindi si può usare come compilazione distribuita attraverso diverse piattaforme OS e piattaforme target. Sebbene questo strumento non sia del tutto nuovo, è piuttosto utile per installare un build pool per velocizzare la compilazione di grandi progetti. Questo perchè distcc trasferisce solamente i file preprocessati ai server e richiama gli object file per collegarli localmente, non sono necessari file header file nè le librerie per il trasferimento attraverso la rete. Teoricamente, è possibile usare distcc in un progetto 8051 con Keil, perché Keil genera anche file preprocessati. Richiede uno sforzo addizionale togliere il distcc per supportare Keil C51 su Cygwin.

Siccome distcc ha una porta per Sharp Zaurus, è possibile velocizzare lo sviluppo del software col GCC nativo per ARM attraverso la rete. Di certo noi non proponiamo affatto più di uno Sharp Zaurus. Possiamo avviare il sistema operativo Zaurus su QEMU su un PC x86, poi lanciare il compilatore nativo con distcc. Il GCC nativo per ARM è piuttosto utile per compilare dei pacchetti software che non furono disegnati per la compilazione incrociata (cross-compilation). Più in avantri tratterò questo tema in un altro blog.

Altri DBS
distcc
http://distcc.samba.org/

Cabie è Ambiente di compilazione ed integrazione automatizzato continuo ("Continuous Automated Build and Integration Environment "). Cabie è un sistema di compilazione con server di compilazione distribuiti per svilupparesoftware di compilazione su varie piattaforme hardware. Cabie supporta la "integrazione continua" (compila con ogni Cm cioé Subversion check-in) o "nightly builds", e test di regressione automatizzato.
http://www.yolinux.com/TUTORIALS/CabieBuildSystem.html

Electric Cloud il primo prodotto, ElectricAccelerator ,con speed-up make per Microsoft Visual Studio, e Apache Ant compila in parallelo avviandoli su un computer cluster.
http://www.electric-cloud.com/

XGE (Xoreax Grid Engine) è una infrastruttura di calcolo distribuito per il sistema operativo di Microsoft Windows sviluppata da Xoreax Software. È disponibile in un prodotto commerciale chiamato IncrediBuild.
http://www.xoreax.com/main.htm

Rant (per Java)
Rant sta per Remote Ant. È un sistema di compilazione distribuito che permette ad un ant buildfile di avviare compilazioni su altri sistemi e ricevere utili correzioni.
http://sourceforge.net/projects/remoteant/

SN-DBS abbattono i tempi di compilazione distribuendo il vostro codice di compilazione tra i Pc cooperando sulla propria rete locale. SN-DBS è disponibile gratuitamente per gli sviluppatori delle piattaforme PS2, PSP e PS3 registrate.
http://www.snsys.com/products/sn-dbs.asp

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend