Kompilieren mit ccache und distcc

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen
Wiki ‹ Softwareentwicklung und paketierung ‹ Kompilieren mit ccache und distcc


Getestet.png 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

Für Debianpackage.png ccache und Debianpackage.png distcc:

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, Debianpackage.png distccmon-gnome.

Quellen