Distcc - kompilacje rozproszone

Slackware FAQ - czyli baza pytań i odpowiedzi.

Moderatorzy: Moderatorzy, Administratorzy

ODPOWIEDZ
Awatar użytkownika
ahes
Użytkownik
Posty: 1047
Rejestracja: 2004-05-28, 10:44
Lokalizacja: Krakow
Kontakt:

Distcc - kompilacje rozproszone

Post autor: ahes »

Distcc - kompilacje rozproszone

Spis tresci:
1. O co chodzi?
2. Dobra, moge juz sobie zainstalowac?
3. No i jak to teraz odpalic?
4. Nie lubie zyc w niewiedzy, jak to dziala?
5. Fajnie, ale co z egzotycznymi zaleznosciami? Przeciez nie bede zawalal serwera dodatkowymi bibliotekami. Poza tym nie mam roota.
6. A jak ustawic te serwery?
7. No dobrze, ale co w przypadku gdy nie mamy dostepu do komputerow w sieci lokalnej tylko bezczynnie stojace serwery uczelniane?
8. Skad mam wiedziec ze faktycznie podczas kompilacji wykorzystywane sa serwery?[/size]
9. Wstep juz byl, kilka uwag tez. Czas na testy ?
10. Jakie wnioski?
11. Nie mam mocnego lacza, nie mam sieci lokalnej, ale mam dostep do naprawde mocnych maszyn, na ktorych kompilacja kernela trwa 3 min. Czy nie lepiej skompilowac tam, a pozniej przegrac na slaby komputer ?
12. To chyba wszystko juz wiem, jakies uwagi ?


1. O co chodzi?

To krotkie faq dotyczy wykorzystania wielu maszyn (lub co najmniej dwoch) do przyspieszenia procesu kompilacji stosujac oprogramowanie distcc. Wszelkie informacje dotyczace architektury i szczegolow dzialania distcc znajduja sie na stronie distcc.samba.org. Ponizej znajduje sie szybki wstep do korzystania z distcc, kilka uwag oraz testy porwnawcze.


2. Dobra, moge juz sobie zainstalowac?

Kompilacje pakietu nalezy przeprowadzic na kazdej maszynie, ktora bedziemy wykorzystywac. Sprowadza sie to do sciagniecia pakietu z wyzej wymienionej strony i wydania nastepujacych polecen.

Kod: Zaznacz cały

tar jxvf distcc-2.18.3.tar.bz2
cd distcc-2.18.3
./configure --prefix=/usr
make && make install
Jesli na maszynach zdalnych nie posiadamy konta root mozna utworzyc katalog distcc i podac go jako prefix przy konfiguracji pakietu.

Kod: Zaznacz cały

mkdir $HOME/distcc && ./configure --prefix=$HOME/distcc
make && make install
I nalezy jeszcze poszerzyc sciezke $PATH do binarek w distcc:

Kod: Zaznacz cały

export PATH=$PATH:$HOME/distcc/bin
Ostatnie polecenie warto dodac, w przypadku korzystania z powolki bash, do .bash_profile


3. No i jak to teraz odpalic?

Zanim omowie zasade dzialania najpierw krotki przyklad:

Kod: Zaznacz cały

0:ahes /tmp/linux-2.4.26# export DISTCC_HOSTS="localhost maszyna1 maszyn2 maszyna3" ; time make bzImage -j9 CC=distcc
a) time - wykorzystujemy go do badania wydajnosci. Po zakonczeniu kompilacji zwroci wynik podobny do tego:

Kod: Zaznacz cały

real    19m28.723s
user    18m14.040s
sys     0m50.680s
b) make bzImage - standardowe polecenie przy kompilacji jadra serii 2.4
c) -j9 - parametr przekazywany do make w celu rozlozenia kompilacji na 9 zadan wykonywanych rownolegle. Dokladniejsze informacje troche pozniej.
d) CC=distcc - naszym kompilatorem bedzie distcc


4. Nie lubie zyc w niewiedzy, jak to dziala?

Distcc nie jest sam w sobie kompilatorem. Jest raczej frontendem do kompilatora gcc. Na maszynach zdalnych nalezy odpalic demona distccd wydajac polecenie:

Kod: Zaznacz cały

distccd --daemon --allow 192.168.1.2
Opcja --allow jest niezbedna i pozwala okreslic hosty ktore moga sie laczyc z demonem. Distccd dziala standardowo na porcie 3632 wiec nalezy pamietac o ustawienia firewalla aby przepuszczal ruch tcp na wejsciu i wyjsciu dla tego ip. Oczywiscie mozna tez korzystac z distcc wykorzystujac protokol ssh, jednak bedzie to dzialac wolniej ze wzgledu na szyfrowanie danych.
Jako parametr dla opcji --allow mozna takze podac cala klase np. 192.168.0.0/24
Distccd dziala na serwerze jako demon wiec po uruchomieniu, bez obaw mozna sie wylogowac.
Oczywiscie na serwerze wymagany jest kompilator gcc, najlepiej w wersji identycznej lub zblizonej do naszej.


5. Fajnie, ale co z egzotycznymi zaleznosciami? Przeciez nie bede zawalal serwera dodatkowymi bibliotekami. Poza tym nie mam roota.

Wszystkie pliki naglowkowe oraz biblioteki sa pobierane z hosta. Nie ma koniecznosci niczego instalowac na serwerze. Maszyna czysto serwerowa moze nam pomoc w kompilacji programow korzystajacych z Xow.
Tak samo jest z flagami przekazywanymi do kompilatora $CCFLAGS. Sa one wykorzystywane przez kompilator zarowno na hoscie jak i na serwerze. Wiec jesli poswiecilismy sporo czasu na ich odpowiednie dopasowanie do architektury, to nie ma sie czym martwic. Wszystko bedzie tak jak nalezy.


6. A jak ustawic te serwery?

Aby distcc zaczal korzystac z serwerow z uruchomionym demonem trzeba ustawic zmienna $DISTCC_HOSTS na hoscie z ktorego uruchamiamy kompilacje. Mozna to zrobic na wiele sposobow. Wszystkie sa bardzo dobrze opisane w manualu do distcc, jednak najprostszym bedzie dodanie do pliku /etc/hosts wykorzystywane maszyny - powinien wygladac mniej wiecej tak:

Kod: Zaznacz cały

localhost	192.168.1.2
maszyna1	192.168.1.3
maszyna2	192.168.1.4
maszyna3	192.168.1.5
Jesli juz mamy wszystko przygotowane nalezy sie zastanowic ktore maszyny i w jaki sposob wykorzystac. Wspomniana wczeniej opcja -j dla polecenia make sluzy do podzialu kompilacji na wiele jednoczesnie wykonywanych zadan. Przyjmuje sie ze liczba zadan rowna sie dwukrotnej liczbie procesorow plus jeden czyli n=2*proc+1.
W naszym przypadku mamy lacznie 4 procesory czyli ustawiamy -j9
Istotna jest kolejnosc maszyn w zmiennej $DISTCC_HOSTS. Jesli lokalna maszyna (localhost) ma predkosc taktowania mniejsza niz 1/5 sumy czestotliwosci, a przy tym komputery polaczone sa siecia ethernet 100Mbit/s to nie powinnismy w ogole uwzgledniac localhost, poniewaz niekorzystnie to wplynie na predkosc kompilacji. Przewaznie pierwszy jest lokalhost a za nim najszybsza maszyna. Ale testujac wydajnosc mozna dosc do wniosku ze czasami lepiej localhost wpisac na drugim miejscu.
Powinnismy takze unikac wpisywania maszyn ktore sa znacznie slabsze niz pozostale. Wbrew pozorom wieksza ilosc komputerow nie wplynie na wzrost szybkosci lecz tylko ja pogorszy.
Teraz, przykladowo, aby w kompilacje zaangazowac dwa serwery i localhost wystarczy wydac polecenie:

Kod: Zaznacz cały

export DISTCC_HOSTS="localhost maszyna1 maszyna2"



7. No dobrze, ale co w przypadku gdy nie mamy dostepu do komputerow w sieci lokalnej tylko bezczynnie stojace serwery uczelniane?

W takim przypadku proponuje najpierw zmierzyc predkosc jaka jestesmy w stanie uzyskac. Polecam niewielki program ttcp ktory znajduje sie na ftp://ftp.man.szczecin.pl/disks/disk0/s ... tcp/ttcp.c
Po sciagnieciu nalezy skompilowac na hoscie i serwerze poleceniem:

Kod: Zaznacz cały

gcc -o ttcp ttcp.c
Ruch generowany przez distcc jest glownie ruchem wychodzacym wiec taki tez bedziemy badac.
Na serwerze odpalamy ttcp z opcja -r dzieki ktorej program bedzie oczekiwac na polaczenie. Na hoscie uruchamiamy

Kod: Zaznacz cały

dd if=/dev/zero | ttcp -t adres_serwera.pl
Odczekujemy ok 5 sekund po czym mozemy nacisnac ctrl+c przerywajac test. Na serwerze powinnismy zobaczyc wyniki podobne do ponizszych:

Kod: Zaznacz cały

ttcp-r: buflen=8192, nbuf=2048, align=16384/0, port=5001  tcp
ttcp-r: socket
ttcp-r: accept from 198.116.144.49
ttcp-r: 228624 bytes in 4.09 real seconds = 74.60 KB/sec +++
ttcp-r: 100 I/O calls, msec/call = 41.87, calls/sec = 24.46
ttcp-r: 0.0user 0.0sys 0:04real 0% 0i+0d 0maxrss 0+2pf 0+0csw
Interesuje nas czwarta linia. Widac ze niestety nie jest to polaczenie 100Mbit, ale powinnismy wyciagnac okolo 650kbit/sek, wiec nie jest tak zle. Przy slabych polaczeniach rzedu 256kbit/sek wydajnosc distcc jest naprawde cienka. Pozwala co prawda skrocic czas kompilacji do ~10-20% ale nigdy nie bedzie tak dobrze jak w przypadku ethernetu, gdzie mozna osiagnac nawet 89%.


8. Skad mam wiedziec ze faktycznie podczas kompilacji wykorzystywane sa serwery?

Istnieja dwa narzedzie w pakiecie distcc do sledzenia kompilacji: distccmon-text oraz distccmon-gnome.
Powyzsze monitory pokazuja nazwy maszyn, status, nazwy kompilowanych plikow oraz kilka innych informacji. Jak mozna sie domyslic pierwszy korzysta z trybu tekstowego, a drugi pracuje w srodowisku graficznym. Polecam zajrzec do manuala.


9. Wstep juz byl, kilka uwag tez. Czas na testy ?

Tak. Testy przeprowadzalem na swojej workstacji o nastepujacych parametrach:
Nazwa: localhost
Procesor: Pentium2 350MHz
Pamiec: 128MB RAM
System: Slackware current
Flagi:
CFLAGS="-Os -march=pentium2 -mmmx -fomit-frame-pointer -s -pipe -DNDEBUG -DG_DISABLE_ASSERT"
CXXFLAGS="-Os -march=pentium2 -mmmx -s -pipe -DNDEBUG -DG_DISABLE_ASSERT"
LDFLAGS="-s -z combreloc"

Kompilowalem jadro linux-2.4.26 z konfiguracja standardowa. Kompilacja nie obejmowala modulow, jedynie make bzImage. Distcc nie bedzie dzialac przy make dep!

Wyniki testow:

Kompilacja bez distcc, localhost pentium2 350MHz 19m28.723s
Kompilacja z maszyna 2GHz, lacze 650kbit/s 14m12.096s

Kompilacja bez distcc, duron900, 7m5.675s
Kompilacja duron900 + maszyna 2GHz, lacze ~1Mbit/s 5m5.531s

Kompilacja bez distcc, potwor 3,2GHz 2m54.298s
Kompilacja potwor 3,2GHz + maszyna 2GHz, lacze ~300kbit/s 2m54.590s

Ponizej znajduja sie testy przeprowadzone na dwoch maszynach Pentium4 3,2GHz 512M i 768M ramu - Pesephone i Demeter - polaczonych siecia 100Mbit. Wielkie podziekowania naleza sie Candy za udostepnienie tych niewyobrazalnych zasobow.

Persephone bez distcc, 2m54.298s
Persephone + Demeter, opcja -j4, 1m57.198s wzrost wydajnosci: 32,75%
Persephone + Demeter, opcja -j5, 1m45.012s wzrost wydajnosci: 38%
Persephone + Demeter, opcja -j6, 1m43.011s wzrost wydajnosci: 41%
Persephone + Demeter, opcja -j7, 1m42.290s wzrost wydajnosci: 41,3%

Dodatkowo postanowilem dodac jeszcze jedna maszyne 2GHz, ale juz nie polaczona lokalnie, lecz przez lacze ~1Mbit.

Persephone + Demeter + maszyna 2GHz, opcja -j7, 2m10.418s wzrost wydajnosci 25,28%


10. Jakie wnioski?

Przy kompilacji na slabej maszynie (350MHz) z serwerem 2GHz na slabym laczu 650kbit/s uzyskalismy wzrost wydajnosci o 26%
W drugim przypadku na laczu 1Mbit czas zmniejszyl sie o 28,5%. To nadal za malo.
Widac ze przy bardzo mocnej maszynie i slabym laczu nie ma zadnej roznicy w czasie kompilacji.
Jesli chodzi o testy na poteznych maszynach 3,2GHz to srednia wydajnosc ostatnich dwoch opcji przy wiekszej ilosci kompilacji byla niemal identyczna, wiec nie nalezy zyc w przekonaniu ze akurat z -j7 bedzie najszybciej. Wszystko zalezy tez od rodzaju procesora. Niestety nie mialem mozliwosci wyprobowac AMD.
Jak widac dodanie kolejnego komputera, ale z poza sieci lokalnej bardzo negatywnie wplynelo na czas kompilacji.


11. Nie mam mocnego lacza, nie mam sieci lokalnej, ale mam dostep do naprawde mocnych maszyn, na ktorych kompilacja kernela trwa 3 min. Czy nie lepiej skompilowac tam, a pozniej przegrac na slaby komputer?

Z testow widac, ze uruchamianie distcc bez sieci 100Mbit/s przynosi niewielkie zwiekszenie wydajnosci. Szybsze okazuje sie przeniesienie zrodel i skompilowanie ich na maszynie zdalnej. Dodajac wieksza ilosc komputerow na slabym laczu, zamiast skrocic, znacznie wydluzy czas kompilacji. Spowodowane to jest slaba przepustowoscia, a co za tym idzie, oczekiwaniem na wyslanie przez zapchana siec, czesci kodu na serwery zdalne.

Istnieje jednak alternatywa, ktora juz niedlugo wprowadze w zycie. Jesli dysponujemy mocnymi maszynami polaczonymi miedzy soba ethernetem 100Mbit/s i nie mamy ograniczen dyskowych to mozna zrobic srodowisko chrootowalne do budowy "systemu w systemie". Nie trzeba tego robic w przypadku posiadania konta administratora, poniewaz zawsze mozemy na czas kompilacji doinstalowac sobie potrzebne pakiety, szybko skompilowac (z wykorzystaniem distcc po ethernecie) pozadane oprogramowanie i przeslac na lokalny komputer.
Oczywiscie zamiast bawic sie z instalowaniem systemu w systemie, mozna takze skompilowac potrzebne biblioteki na serwerze i zainstalowac w katalogu $HOME/lib, a pozniej jedynie wskazac to miejsce konfiguratorowi.
Jednak stworzenie chrootowalnego srodowiska jest ciekawym wyzwaniem i bardzo przydatnym przy tworzeniu wlasnej dystrybucji linuksa, opierajac sie chociazby na Linux From Scratch.


12. To chyba wszystko juz wiem, jakies uwagi?

Nie zawsze distcc musi dzialac. Zdarzaja sie wadliwe pliki Makefile oraz istnieja programy, ktore ciezko lub wcale nie da sie skompilowac rownolegle. Prawdopodobnie (tak slyszalem od jednego uzytkownika Gentoo) nie mozna wykorzystac distcc do kompilacji OpenOffice, co (jesli to prawda) jest bardzo smutne. Wiadomo ze kompilacja tego pakietu biurowego to prawdziwy koszmar, a na slabych maszynach wyraznie i znaczaco zwieksza predkosc swojego dzialania.
Oczywiscie obowiazkowo nalezy przeczytac wszystkie manuale dostepne z pakietu distcc.
Istnieje mozliwosc zespolenia distcc z programem cachujacym ccache, ktory powinien przyspieszyc proces kompilacji. Jednak podczas kompilowania kernela zauwazylem wydluzenie czasu. Nie wiem jak sie zachowa w przypadku innych programow. Osobiscie nie uzywam. Wiecej informacji na ten temat znajduje sie w dokumentacji na stronie domowej projektu distcc.

To by bylo na tyle. Pozdrawiam.



Autor: ahes, ahes(na)lfa.pl

UPDATE(03.07.2006): Poprawione linki. (Podziękowania oSA)
Ostatnio zmieniony 2006-07-03, 15:52 przez ahes, łącznie zmieniany 11 razy.
[b][url=http://rootnode.net]rootnode.net[/url] :: Konta shellowe z piekła[/b]
ODPOWIEDZ