Kompilieren mit ccache und distcc
Getestet: Dieser Hinweis soll dir dabei helfen, zu entscheiden, ob dieser Artikel auf deinem System funktionieren wird oder nicht. Solltest du feststellen, dass dieser Artikel bei einer ungetestet Version funktioniert, kannst du das gerne hier korrigieren oder im Forum anmerken.
|
Ziel
Um das Kompilieren zu beschleunigen, kann ccache als Cache für die Object-Dateien verwendet werden, distcc verteilt den Buildprozess auf mehrere Rechner. So lässt sich das Kompilieren erheblich beschleunigen, wenn weitere Rechner mit nennenswert schneller CPU verfügbar sind.
Voraussetzungen
Für distcc benötigt man auf allen buildnodes (distcc-Server) die selbe minor-Version von GCC (4.X muss auf allen Systemen gleich sein), ansonsten kann es zu Fehlern kommen. distcc merkt das von selbst und baut das Paket dann lokal erneut.
Installation
root@debian:~# aptitude install ccache distcc
Auf den buildnodes wird ccache meines Wissens nach nicht verwendet und muss dort auch nicht installiert werden.
Konfiguration
distcc
/etc/default/distcc:
STARTDISTCC="true" # distcc-Dienst aktivieren
ALLOWEDNETS="192.168.1.0/24" # Hier euer Netzwerk eintragen
LISTENER="0.0.0.0" # Die lokale IP, auf der gelauscht werden soll, ggf eine externe IP. 0.0.0.0 lauscht auf allen interfaces.
NICE="10" # Priorität, 0 für Max, 20 für Min. Negative Werte sind nicht erlaubt.
JOBS="4" # Anzahl der Jobs, die die buildnode gleichzeitig annimmt. Richtwert und Minimum: Anzahl logischer CPUs x 2
ZEROCONF="false" # halbautomatische Konfiguration mit mDNS
/etc/distcc/hosts: (wird von der Umgebungsvariablen DISTCC_HOSTS oder ~/.distcc/hosts überschrieben, wenn vorhanden)
Eine Liste von Hosts (Name oder IP), getrennt durch Leerzeichen, welche als buildnodes fungieren sollen.
host1 host2 host3 host4
Der Rechner, der den Bauprozess startet, sollte dann die Summe der Jobs aller distcc-Hosts zu -j angeben (minimum) bzw. diese in CONCURRENCY_LEVEL speichern. Ein Beispiel hierzu ist weiter unten zu finden.
ccache
ccache benötigt kaum Konfiguration. Lediglich die Angabe, dass es beim Build verwendet werden soll, wird benötigt (siehe Beispiele).
Beispiele
Ein Script, das ich in ähnlicher Form einsetze, um einen Kernel zu kompilieren:
export DISTCC_HOSTS="192.168.1.100 192.168.1.101 192.168.1.102 localhost 192.168.1.103" # absteigend sortiert nach Leistung
export CCACHE_PREFIX="distcc"
export PATH="/usr/lib/ccache:$PATH"
# export CONCURRENCY_LEVEL=20 # für make-kpkg, falls verwendet
BUILD_TIME="/usr/bin/time"
BUILD_MAKE="make -j10"
# BUILD_MAKE="fakeroot make -j10" # Zum Kompilieren als nicht-root, Paket fakeroot wird benötigt
BUILD_TARGET="deb-pkg" # nur ein Beispiel, hier für den debian-Kernel.
BUILD_CLEAN="make clean"
$BUILD_TIME $BUILD_CLEAN && $BUILD_TIME $BUILD_MAKE $BUILD_TARGET
Um den Cache von ccache zu leeren, genügt ein
root@debian:~# ccache -C
Für Statistiken:
root@debian:~# ccache -s
Und um den distcc-Vorgang zu überwachen, gibts ein nettes (passives) GTK-Tool, distccmon-gnome.