Salut, Lucrez la o aplicatie mareata (+500k linii) care pe o singura mashina se compileaza in +30 de minute. Fapt care imi permite sa scriu mesaje pe rlug ;-). Dorinta mea ar fi sa reduc timpul de compilare.
Ce am: - o cireada de servere Redhat cu nr variabil de CPUs fiecare, intre 4 si 24 - acces prin ssh la oricare Directorul de lucru e un Clearcase view (versioning system) disponibil pe toate severele. Pentru cine nu e familiar cu clearcase - e oarecum similar cu un NFS mount. Secventa de lucru e: - ssh catre unul din servere - rulat un script de setup pt clearcase Dupa asta codul din repository devine vizibil intr-un director predefinit de pe serverul remote (the "NFS mount"). Daca dintr-o alta consola efectuez ssh + setup catre un alt server voi vedea aceleasi fisiere ca pe primul server. Ce nu am: - root access nicaieri (nici pe statia mea de lucru) - posibilitatea de a instala librarii sau programe noi (din motive de securitate, stampile, audituri) As vrea sa emulez un distributed make folosind scripturi/utilitare standard. Mai concret, as vrea sa pot rula dintr-o consola un script fabulos de genul: "dmake -j <nr jigantic de CPUs> server1 server2 ..." In imaginatia mea acest dmake ar lansa "make -j <nr>" pe statia de lucru locala, insa substituind "gcc <parametri>" cu un wrapper care: - gaseste la fiecare invocare un server remote cu procesoare libere - lanseaza "something-like-ssh server_remote gcc <parametri>" - asteapta finalizarea gcc-ului de pe serverul remote Pasul #1 de load-balancing cred ca stiu sa il fac. Ce ma incurca este lansarea gcc-ului pe un server remote. Lansarea trebuie sa se intample dupa setup-ul de clearcase, care dureaza cateva secunde bune si deci trebuie facut doar o singura data pt fiecare server. Asadar, pt fiecare server remote am nevoie de: - ssh remote - clearcase_setup (remote) - in a loop (remote): while <read command from (tty, stdin, unix-socket ?) > ; do exec command ; done Iar pe statia local, wrapperul de gcc: - send command to chosen remote using (pipe, stdout, unix-socket, pidgeon ?) - wait for command completion - display stdout/stderr-ul procesului extern - return exit code of external process Am tot citit pagini de manual de la diverse utilitare standard (ssh,tmux,screen,socat) dar nu gasesc nimic care sa functioneze cum imi trebuie mie, sau nu stiu eu sa le folosesc. Dintre cele listate "socat" pare cel mai promitator, cu o incantatie de genul: socat UNIX-LISTEN:/tmp/mysocket_1 exec:'ssh server_1',pty,setsid,ctty urmat de echo "clearcase_setup.sh ; g++ a.cpp" | socat - UNIX:/tmp/mysocket_1 Insa nu stiu cum sa pastrez deschis canalul de comunicatie (cand se inchide socat-ul "local" moare si ala remote), deci nu pot trimite decat o singura linie de comanda. Eu nu stiu dinainte cate/care comenzi vreau sa trimit. Are cineva vreo sugestie cum sa purced ? Sau impusc tantarul cu tunul si exista deja o solutie evidenta si binecunoscuta a problemei de compilare distribuita ? Multumesc, Mihai _______________________________________________ RLUG mailing list RLUG@lists.lug.ro http://lists.lug.ro/mailman/listinfo/rlug_lists.lug.ro