Icecream
tagline: openSUSE sitesinden
Icecream'e giriş
Bu sayfa Icecream ile ilgili olan belgeleri ve en son haberleri bulundurmaktadır.
Icecream SUSE tarafından distcc fikri ve kaynak kodu üzerinde geliştirilmiştir. Distcc gibi, derleme işlemlerini (KDE) derleme ortamınızdan alır ve diğer bilgisayarlara dağıtarak derleme işleminin pararlel olarak gerçkelştirilmesini sağlar. Distcc'den farklı olarak Icecream merkezi sunucu kullanır, bu sunucu derleme dinamik olarak boş olan en hızlı sisteme aktarır. Bu özellik ise bilgisayarlar birden fazla kullanıcı tarafından paylaşılıyorsa yararlı olmaktadır.
Icecream'i edinmek için:
Sormak istediğiniz diğer sorular için firstname.lastname@example.org adresine e-posta mesajı yollayabilirsiniz.
Icecream nasıl kullanılır
Neler Gerekli:
- Üzerinde görev dağıtıcı/programlayıcı "scheduler" calışan bir bilgisayar ("./scheduler -d")
- Üzerinde daemon calışan birden fazla bilgisayar ("./iceccd -d")
Icecream'i kullanarak derleme yapmak istiyorsanız, $prefix/bin değişkeninin yolun (path) ilk girdisi olduğundan emin olun. Örnegin şu şekilde yapabilirsiniz:
export PATH=/opt/icecream/bin:$PATH
(İpucu: Bu satırı ~/.bashrc ya da /etc/profile dosyasına eklerseniz her seferinde yeniden tanımlamak zorunda kalmazsınız.)
Derleme işlemine başlamak için "make -j <sayı>" komutunu kullanın. Burda <sayı> paralel olarak calışmasını istediğiniz derleme süreçlerinin sayısını belirtir. Başlangıç değeri olarak mantıksal işlemcilerin sayısının iki katını alın. 15'den büyük değerlerde genellikle sorun yaratacağını unutmayın. Örnek:
make CC=icecc -j6
UYARI: Icecream'i farklı yapılandırmaya sahip bilgisayarların olduğu ortamlarda kullanmayın. Eğer kullanmak zorunda kalırsaniz da Scheduler'leri ve daemon'ları normal kullanıcı olarak çalıştırın! Ancak bu durumda ise ortamın güvenilir olduğunu kabul ederel işlem yapmakta olduğunuzu da unutmayın. (Bakınız Aşağısı).
Eğer ilginç sonuçlar görmek isterseniz "icemon" çalıştırın.
Farklı derleyici ortamlarında icecream kullanmak
Icecream daemonlarını aynı icecream ağında ve farklı ve uyumsuz olabilecek derleyici ortamları ile çalıştırıyorsanız, (Not: tüm daemonler root olarak çalıştırılmalıdır. Icecream gelecek sürümlerinde farklı ortamların ne zaman kullanılamayacağını ayır edebilecek duruma gelebilir. Şimdilik tüm ortamların aynı olduğunu kabul ediyoruz.) kullandığınız ortamı belirtmeniz gerekmektedir.
icecc --build-native
Yukarıdaki komut ile derleyici ortamının kurulması için gereken tüm dosyalrın bir arşivde toplanmasını sağlıyoruz. Oluşan dosya, "ddaea39ca1a7c88522b185eca04da2d8.tar.bz2" biçiminde standart ve rastgele üretilmiş bir isime sahip olacaktır. Kullanımının kolaylaştırmak için anlaşılır bisim isim seçip yeniden adlandırın. Örneğin, "i386-3.3.1.tar.bz2" gibi.
ICECC_VERSION=<derleyici_ortamına_ait_arşiv_dosyası>
Derleme işlemlerini yaptığınız kabuk ortamında yukarıdaki komut ile derleme işlemlerini gerçekleştiren daemonlara gereken ortam dosyalarının aktarılmasını sağlayabilirsiniz. Aktarma işlemi istemcilere kendi sanal kök ortamlarında derleme işlemini gerçekletirebilmeleri için gerekli olacak derleme ortamının kullanılmasını sağlayacaktır. Bunun gerçekleşebilmesi için de, icecream daemon'un root trafından çalıştırılmış olması gereklidir.
Eğer ICECC_VERSION değerini belirtmezseniz, istemciniz sistemde çalışan daemon tarafından belirlenen ortam değerlerini barındıran arşiv dosyasını kullanacaktır. Belirtmeniz durumunda ise uyumsuz gcc sürümlerini kullanılmayacağından emin olabilir ve bilgisayarızda farklı dağıtımları (veya tercih ettiğiniz farklı SUSE Linux sürümlerini :) ) kullanabilir ve başka kullanıcılar ile sisteminizi paylaşabilirsiniz.
Icecream ile diğer platformlar için derleme yapmak
SUSE çalışan ancak işlemcisi AMD veya Intel olmayan bazı sistemlerde derleme işlemi yapmak için icecream yukareıdaki gibi derleme ortamını tanımlayarak çapraz-derleme yapmanıza olanak vermektedir. ICECC_VERSION değişkeni şu şekilde <asıl_ortam_bilgisi_dosyası>(,<platform>:<çapraz_derleyici_dosyası>)*, tanımlanabilir. Örneğin:
/work/9.1-i386.tar.bz2,ia64:/work/9.1-cross-ia64.tar.bz2
iecc tarafından oluşturulmuş olan arşiv dosyalarının içeriğine bakarsanız, çapraz derleyici dosyalrının hazırlanmasının ne kadar basit olduğunu görebilirsiniz.
Icecream ile gömülü sistemler için çapraz derleme yapmak
ARM vb gömülü sistemler için derleme yaparken, hedef sistem için kodu hazırlayan ama kendi sisteminizde ardışık çalışan araçları kullanmanız gerekebilir. Bu durumlarda da icecream sunduğu olanaklardan yararlanabilirsiniz.
Sembolik bağlar oluşturup icecc derleme yapcağınız platforma ait olan derleyiciye bağlayıp (örneğin arm-linux-g++ ve arm-linux-gcc), bu sembolik bağların kendi araç dizinizin kullandığı $PATH değişkenine atanmış olduğundan emin olun. $ICECC_CC ve $ICECC_CXX ile icecream ayarlama ve derleme işlemleri için hengi derleyicileri kullanacağını tanımlamanız gereklidir. Örneğin, ICECC_CC=arm-linux-gcc ve ICECC_CXX=arm-linux-g++ şeklinde tanımlanız gerekecektir.
Sonraki adımda ise çapraz-derleme işlemi için icecc --build-native kullanarak bir tar.bz2 arşivi oluşturun ve sonucu kontrol edin.
Son adımda ise ICECC_VERSION değerini atayarak oluşturulmuş olan tar.bz2'e yönlendirin. Derleme işlemine başladığınızda tüm gerekli uygulamlar zincir biçiminde çalışarak işelmi tamamlayacaklardır.
Not:ICECC_VERSION ataması ile kodun oluşturulacağı dizini değil, işlemin hangi platform için gerçekleşeceğini belirttiğinizi unutmayın.
Icecream ile ccache birlikte kullanmak
ccache ile icecream birlikte kullanmanın en kolay yolu /opt/icream/bin dizine bağlı olan sembolik bağlar ve /opt/ccache/bin dizinine bazı ufak script dosyaları yerleştirmektir.
cat /opt/ccache/bin/g++:
#! /bin/sh export CCACHE_PATH=/opt/icecream/bin export PATH=/opt/icecream/bin:/usr/bin:$PATH ccache g++ "$@"
Böylece $PATH değişkenindeki /opt/icecream/bin dizinini /opt/ccache/bin ile kullanabilirsiniz ve icecream çağrıları ccache üzerinden gerçekleşecektir. ( ve Qt 62 sn'de derlenecektir :) )
Eğer günde 3 defa KDE baştan derlemiyorsanız bu durumda ccache kullanma zahmetine katlamaya gerek yoktur. ( derleme işlemi öncesinde işlemlerin preprocessor aşamasına göre daha fazla kaynak tamponlamakta ve daha çok disk alanı kullanmaktadır. Sık sık tamponlama değerinin %18 ulaşması nedeni ile bunu kullanmaya son verdim ).
Hata ayıklama
ICECC_DEBUG ortam değişkenini kullanarak icecream hata çıktısı verip vermemesini sağlayabilirsiniz. "debug" ile hata ayıklamayı aktif kılabilirsiniz. Diğer olası hata durumları için -v seçeneği ile kullanın. (Her kullanılan -v değeri daemon ve scheduler için hata duyarlılığını arttırmaktadır. Bu nedenle tüm hata mesajlarını görmek için -vvv seçeneğini kullanın.
Bazı değerler
Gerçekleştridiğim denemelere ait sayısal sonuçlar (STL C++ genetik algoritma)
- kendi bilgisayarımda g++ : 1.6sn
- hızlı bir sistemdeki g++ : 1.1sn
- kendi makinamı uzak sistem olarak kullanarak icecream ile: 1.9sn
- icecream ile hızlı sistemi kullanarak: 1.8s
Dikkatinizi çektiği gibi icecream işleyiş süresi oldukça uzun, ancak derleyici preprocessing sürecini hızlandırmak için derleme işlemi ile birlikte yapamıyor ve doaysının aktarılmadan önce bir kez daha oku/yaz sürecinden geçmesine neden oluyor.
Ancak diğer makina daha hızlı olsa da, kendi bilgisayarımda g++ kullanımı daha hızlı gerçekleşiyor. Eğer ağ üzerine çalışırken mdiğer makinalarda boşta ise bu durumda dağıtık işlemenin size sağlayacağı bir avantaj kalmıyor ve sadece süre uzamış oluyor. ( diğer bir ifadeyle makinanızın $DISTCC_HOSTS içinde yer alması anlamına geliyor). Bu durumda kendi bilgisayarımdaki icecream ile gerçekleşen derleme işlemi 1.7sn oluyor. (Süre farkı ise sadece 0.1sn oluyor)
Scheduler bu durumu değerlendirebildiği için, kendi bilgisayarınızı tercih edecektir, ancak ve ancak sistemniz boşta ise ve en hızlı sistemin %70'i kadar hızlı ise.
İlk derleme işlemi kendi sisteminizde gerçekleşirken, sıradaki diğer işlemler diğer bilgisayarlara paylaştırılacaktır. Eğer iki dosya derlemek durumundaysam, sonuçlar şu şekilde olacaktır:
- kendi makinamdaki g++ -j1 : 3.2s
- hızlı sistemdeki g++ -j1 : 2.2s
- icecream -j2 kullanarak kendi sistemimde: max(1.7,1.8)=1.8s
- (icecream -j2 kullanarak diğer sistemde: max(1.1,1.8)=1.8s)
Sayısal değerler aldatıcı olabiliyor. Sonuçlar derleme işleminin yapıldığı ağa bağlı olarak değişeceği için -j2 değerinin derleme süresini yarı yarıya azalttığını düşünme hatasına düşmeyin.
Icecream için en uygun ortam hangisidir?
Icecream sistem gereksinimi olarak özel bir donanım gerektirmemektedir, hangi sistemleri kullandığınıza bakılmaksızın ağdaki bilgisayarların bağlantılarının 10Mbit olması gibi zorunlulukları yoktur. Icecream girdi ve çıktı dosyalarını ( lzo ile ) sıkıştırarak aktardığını gözden kaçırmayın, örneğin her bir derleme işlemi için yaklaşık olarak ~1MBit gerekmektedir, bu durumda -j10 üzerindeki değerler için gecikmeler olması kaçınaılmazdır.
Çok sayıda sistem kullanılması ancak yoğun önemli boyutta paralel çalışma söz onusu olduğunda yararlı olacaktır, fakat kendi sisteminizin ( g++ işleminin başlatıldığı sistem ) de diğer sistemleri besleyecek kadar hızlı olması durumunda en hızlı sonuçları alacağınızıda unutmayın. Özellikle projeniz bir çok kolaylıkla derlenebilen dosyalarda oluşuyosa, preprocessing ve dosya G/Ç işlemlerini beslemek için yeterince hızlı olması gerekecektir.
Zamanlayıcı en hızlı makinaları kullanmaya çalışacaktır. Dolayısıyla da eklediğiniz eski sistemlerin kullanılması seyrek olarak gerçekleşecektir. Yinede işler ters gidebilir - zamanlayıcı derleme işlemlerinin en kadar zamanda biteceğini bilememektedir. Eğer iki hızlı ve 1 yavaş sistemniz varsa derleme işleminin sona ermesi için yavaş makinanın işini bitirmesini beklemek durumunda kalabilirsiniz.
Icecream için ağ kurulumu (firewall)
Icecream çalışması için gerekli portların kısa bir listesi:
- TCP/10245 daemon çalıştıran bilgisayarlar için (zorunlu)
- TCP/8765 scheduler çalıştıran bilgisayar için (sorunlu)
- TCP/8766 scheduler uzaktan erişim için gereken telnet bağlantısı (isteğe bağlı)
- UDP/8765 scheduler erişmek için gereken yayınadresi(isteğe bağlı)
SUSE 9.1 öncesi sistemlerdeki SuSEfirewall2 yayın yapılnadırmasının sorunlu olduğunudikkate almak gerekli. Dolayısıyla da daemon çalışrırıken -s seçenepinin kullanılması gereklidir. Eğer zamanlayıcıya ulaşılamıyorsa, USE_SCHEDULER=<suncu> icemon kullanın (yada bana çalışan bir yama yollayın :) )
distcc kullanıyorum, neden değiştireyim?
Eğer kendi evinizde ve kendinizin ve kardeişinizin bilgisayarını kullanıyorsanı, bu bilgisayarların her ikisinde de aynı Linux sürümü varsa o zaman distcc değiştirmeyin. (Bu satırları okuyan kişilerin %95'nin durumunun böyle olduğundan eminim). Ancak distcc tercih etmenizin uygun olmayacağı bir çok durum söz konusudur:
- Derleyicinizi sık sık değiştirerek derleme sürecini hızlandırmak istiyorsanız (Bkz ICECC_VERSION desteği)
- Elinizde güzel bir PPC dizüsüt var ve sadece eşinizin bilgisayarında Intel işlemci var (Farklı platformlar için derleme)
- Derleme işlemi sırasında hangi makianaların çalışmakta olduğunu bilemiyorsanız.
- En önemlisi: İş yerinizde iş arkadaşlarınızın kullandıkları bilgisayarları kullanıp Doom oynadıkları zamanlarda makinaları distcc ile meşgul ederep üzerine ek yük yüklüyorsanız (distcc, scheduler gibi bir özelliği yoktur)
- Hoş derleyci izleme araçlarını seviyorsanız :)
teambuilder kullanıyorum, neden değiştireyim?
Bu bölüm en kolay olanı: Kullandığınız lisansın süresi kısa zamanda sona erer. Ancak bu sizin için sorun olmuyorsa: teambuilder belgelerine göre kurulup çalışması için sistemde bir değişikliğe gere kyoktur. Bu ise ağ üzerindeki sistemlerin hepsinin özdeş olması durumunda geçerlidir. Eğer CVS edindiğiniz gcc sürümün denemek istiyorsanız, iş arakadaşlarınız yeterince ikna edici görünmek durumundasınız veya teambuilder monitor açtığınızda size değilde diğerlerine çalıştığını izleyeceksiniz.
Gentoo'da icecream kullanmak
- İşlemcinize özel belirlediğiniz ve /etc/make.conf dosyasında yer alan tüm CFLAGS satırlarını kaldırın. aKademy cluster yapılan denemelerde sadece "-O2" kullananımının daha iyi olduğu, aksi ahlde derleyici hataları olştuğu gözlenmiştir, özelliklede tüm işlemciler aynı değilse.
Dikkat, gcc terfi etmeniz durumunda da CFLAGS değiştirmeyi ihmal etmeyin.
- icecream'i emerge/ebuild ile kuracaksanız PREROOTPATH=/opt/icecream/bin emerge vs vs olarak kurun.
- gcc/glibc/binutils işlemciye özel değerler ile derleneceği için diğer sistemlerde çalışmaması olasıdır. Buy durumda en doğrusu gcc, glibc ve binutils seçenek belirtmeden derlemeniz olacaktır. gerekli dosyaları da arşive kopyalamanız gerekecektir. Örneğin; e.g. CFLAGS="-mcpu=i686 -O3 -fomit-frame-pointer -pipe" CXXFLAGS="$CFLAGS" ebuild /usr/portage/sys-devel/gcc-yourver.ebuild install ; cp /var/tmp/portage...