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

Raspunde prin e-mail lui