Das Software-Management von Gentoo Linux fußt auf dem Sourcecode der Programme. Damit eignet sich die Distribution im besonderen Maße für Performance-Experimente mit Compileroptionen. Teile von Gentoo lassen sich sogar mit der ICC übersetzen. Ein Praxistest.
Gentoo Linux [1],[2] verwaltet seine Software grundsätzlich anders als andere Distributionen. Der Administrator installiert keine kompilierten Programme als Deb- oder RPM-Pakete, sondern kompiliert Sourcen, wobei er auf einfache Weise zur Hardware passende Compilerflags setzt. Das versteht dieser Artikel als Einladung zu dem Experiment, die Sourcen von PostgreSQL mit verschiedenen Compilern optimiert zu übersetzen und die entstehenden Binarys einem Benchmark zu unterziehen.
Daniel Robbins hatte Gentoo 1999 gegründet. Robbins, der zwischenzeitlich auch bei Free BSD mitmischte, veröffentlichte im Jahr 2002 Gentoo 1.0. Diese Version besaß bereits ein Free-BSD-ähnliches Autobuild-System, das Programmequellen aus dem Internet holt und auf dem Zielsystem lokal kompiliert. In Anlehnung an den Free-BSD-Terminus “Ports” nannte Robbins die Gentoo-Paketdatenbank Portage.
Diese sortiert ihre Programmpakete in Kategorien [3]. Wählt der Nutzer eine aus, so zeigt eine Übersicht zunächst die nachgefragtesten Programmpakete. Erst die Auswahl von »category-full« in den »Links« listet alle Programmpakete der gewählten Kategorie. Ein »search« -Feld besitzt Portage auch. Die Abbildung 1 zeigt als Beispiel die verfügbare Versionen zum Paket »postgresql« .

Abbildung 1: Stabile Programmversionen erhalten in Portage ein »+«. Die Tilde »~« kennzeichnet den Status Unstable. Als Vorgabe installiert der Gentoo-Paketmanager nur die jeweils neueste als stabil gekennzeichnete Version eines Programms.
Emerge und Ebuilds
Die Gentoo-Maintainer liefern zu jedem Programm Paketbeschreibungen, genannt Ebuilds. Diese Dateien beinhalten Informationen über den Paketnamen, die Programmversion, den Status des Pakets (stabil, instabil), die erlaubten Rechnerarchitekturen, Abhängigkeiten zu anderen Programmen und so weiter. Zurzeit (April 2011) verfügt Gentoo über 27 201 Ebuilds zu 14 605 Paketen in 154 Kategorien.
Die Mehrheit der Ebuilds sind Bash-Skripte, die das System mit Informationen zur Kompilierung und Installation der Quellen versorgen. Ebuilds enthalten somit im Unterschied zu »src.rpm« -Paketen nicht den eigentlichen Sourcecode, sondern die URL zum Download.
Für die Installation der Sourcen dient Gentoos Paketmanager-Frontend »emerge« . Der Emerge-Prozess durchläuft nacheinander mehrere Stufen, die in den Ebuilds als Funktionen eingetragen sind. Die Hauptphasen im Installationsprozess jedes Programms spiegeln die Teile »setup« , »unpack« , »compile« , »test« und »install« wider. Vor diesen Phasen führt der Installationsprozess gegebenenfalls die »/etc/portage/bashrc« aus.
Das Ebuild zu PostgreSQL, zu finden in der Kategorie »dev-db« , zeigt auszugsweise Listing 1. Hier dient »emake« als Wrapper innerhalb der Compile-Phase. Es ruft »make« mit den Optionen »-C« (Verzeichniswechsel) sowie »-j1« (nur einen Prozessor-Thread nutzen) auf. Make bedient sich des installierten »gcc« . Globale Compilerflags setzt der Anwender in der Datei »/etc/make.conf« , zum Beispiel »-march=core2« für die Intel-CPU Core2Duo.
Listing 1
PostgreSQL-Ebuild (Auszug)
01 src_compile() { 02 local bd 03 for bd in . contrib $(use xml && echo contrib/xml2); do 04 PATH="${EROOT%/}/usr/$(get_libdir)/postgresql-${SLOT}/bin:${PATH}" \ 05 emake -C $bd -j1 || die "emake in $bd failed" 06 done 07 }
PostgreSQL kompiliert und installiert der Administrator durch
USE="perl python tcl" LINGUAS="de" emerge-v postgresql-server
Der Paketmanager wertet die Angaben im zugehörigen Ebuild aus, stellt dabei Abhängigkeiten fest und installiert darum das Paket »postgresql-base« . Die »USE« -Angaben stellen optionale »./configure« -Parameter dar, »LINGUAS« wählt neben der englischen die deutsche Sprachunterstützung aus. Weitere Hinweise gibt der Kasten “PostgreSQL installieren”.
PostgreSQL installieren
Vor dem »emerge« -Befehl setzt der Gentoo-Admin nach Bedarf seine Configure-Optionen, zum Beispiel: »USE=”perl python tcl” LINGUAS=”de”« . Nach der PostgreSQL-Installation führt er folgende Schritte aus:
- In »/etc/conf.d/postgresql-server-9.0« gegebenenfalls »locale« auf »de_DE.UTF-8« setzen,
- »emerge –config =dev-db/postgresql-server-9.0.3« ausführen sowie
- »/var/lib/postgresql/9.0/data/postgresql.conf« passend zum eigenen Anforderungsprofil modifizieren, zum Beispiel:
temp_buffers = 8MB work_mem = 1MB maintenance_work_mem = 16MB checkpoint_segments = 12 autovacuum = off
Die letzte Zeile ist nötig für alle, die beabsichtigen Benchmarks laufen zu lassen – so wie in diesem Artikel geschehen.
Jetzt richtet Root noch ein Passwort für den Benutzer »postgres« ein. Der Befehl »/usr/lib64/postgresql-9.0/bin/postgres -D /var/lib/postgresql/9.0/data« startet schließlich die Datenbank.
Testlauf mit der GCC
Die Basis für die folgenden Optimierungsexperimente stellte ein Intel-E6300-Core-2-Duo-System mit 2 GByte RAM und einem unmodifizierten Gentoo-64-Bit-Kernel im Server-Profil, den »genkernel all« übersetzt hatte. Vor der PostgreSQL-Installation brachten »emerge –sync« , »emerge portage« sowie »emerge -uND world« , »dispatch-conf« , »emerge –depclean« das System auf den neuesten Stand.
Sämtliche Pakete waren anfangs mit der GCC 4.4.5 übersetzt. In diesem Zustand erfolgten die ersten Performancemessungen am PostgreSQL-Server, um eine Vergleichsgrundlage zu erhalten. Als Benchmark diente »pgbench« , den PostgreSQL per se im Gepäck hat. Vor der Messung legt ein »createdb dbtest && pgbench -i -s 100 dbtest« die Datenbank »dbtest« an, initialisiert und füllt sie mit 10 Millionen Tupeln (»-s« beinhaltet den Skalierungsfaktor 100).
pgbench -t 100 -c 10 -M prepared dbtest
startet den Benchmark. Der Prozess vollführt bei jeder der simulierten zehn Verbindungen (Connections) je 100 nicht-triviale (»-M« ) Transaktionen. Im Ergebnis erscheinen unter anderem die gemessenen Transaktionen pro Sekunde (tps).
ICC in Gentoo einrichten
Als alternativer Closed-Source-Compiler soll hier Intels Compiler-Collection dienen, für die mehrere Ebuilds vorliegen. Ein »emerge -v icc« installiert die Version 10.0.026, die für den nicht-kommerziellen Gebrauch kostenfrei ist [4]. Die Lizenzen von Intels “C++ Composer XE for Linux” decken auch die älteren in Portage aufgeführten ICC-Versionen ab. Die per E-Mail von Intel erhaltene Lizenzdatei mit Endung ».lic« speichert der Anwender unter dem manuell anzulegendem Verzeichnis »/opt/intel/licenses/« .
Nun muss er in die Datei »/opt/intel/cce/10.0.026/bin/icc.cfg« die Zeile »-idirafter /usr/include/linux« aufnehmen. Andernfalls tritt beim Kompilieren von Programmen, die die Datei »limits.h« inkludieren, ein »catastrophical error« auf. Auch ist es erforderlich, die Gentoo-Datei »/etc/make.conf« mit Umgebungsvariablen für die ICC erweitern: »ICCCFLAGS=”-O2 -xT -ip”« . Das »-xT« veranlasst die ICC Code zu erzeugen, der die SSSE3-Einheit des Core 2 Duo heranzieht. Zum Abschluss führt der Admin »env-update« sowie »source /etc/profile« aus, um die Umgebungsvariablen an die neuen Gegebenheiten anzupassen.
Lost in Compilation
Dem ersten Impuls, Gentoo nun komplett per »emerge world« mit ICC zu übersetzen, sollte man nicht nachkommen. Denn die Quellen der Bash, von Sed, Binutils, GCC, Glibc, Ncurses, Libstdc++-v3, Zlib oder Procps enthalten GCC-spezifischen Code. Als Lösung bietet sich an, den Paketmanager über eine manuell anzulegende und mit ausführbaren Rechten versehene Datei »/etc/portage/bashrc« zu beeinflussen. Der Installationsprozess führt in der genannten Datei vorhandenen Code in jeder Ebuilds-Stufe aus. Auf [5] gibt es entsprechende Code-Beispiele.
Für diesen Artikel reicht es aber, nur die Software mit dem ICC zu übersetzen, die der Benchmark vermessen soll. Der Administrator hinterlegt dazu die mit der ICC zu kompilierenden Programme ohne Versionsnummern, jedoch einschließlich ihrer Portage-Kategorie in der Datei »/etc/portage/bashrc/package.icc« :
dev-db/postgresql-base dev-db/postgresql-server
Bei allen anderen Programmen nutzt der Installationsprozess GCC weiter. Um die PostgreSQL-GCC-Binarys aus dem System zu kicken, deinstalliert der Admin jetzt »postgresql-base« sowie »postgresql-server« und installiert sie gleich wieder. Nun übersetzt die ICC die Datenbank.
Um noch einen weiteren Benchmark-Vergleichswert zu erheben, installierten die Tester in der Folge noch die in Portage eingetragene, als instabil gekennzeichnete ICC-Version 11.1.072-r1 (Abbildung 2). Der Befehl »autounmask >= dev-lang/icc-11.1.072-r1« kennzeichnet die instabile Version intern als installierbar und ermöglicht so das Ausprobieren. Die Sourcen haben übrigens eine beachtliche Größe: 770 MByte. (Inoffizielle 12er-Versionen der ICC für Gentoo gibt es übrigens auch bereits [6].)
Egal, ob man Programmpakete mit der stabilen oder der instabilen ICC kompiliert, linkt der Compiler den Code dynamisch gegen ICC-Bibliotheken. Das will dann beachtet sein, wenn der Administrator die ICC wieder deinstalliert: Denn nun finden die Binarys ihre Bibliotheken nicht mehr – das Neuübersetzen mit der GCC steht somit an.
Benchmark-Ergebnisse
Die im Rahmen dieses Artikels durchgeführten Benchmarks zeigen recht unterschiedliche Ergebnisse (Abbildung 3). Zur Bildung eines aussagekräftigen Mittelwerts dienten die jeweils zehn besten Ergebnisse der einzelnen Durchläufe. Die ICC 10.0.026 zeitigte im Mittelwert eine 25 bis 29 Prozent schnelleren Code als die GCC, im Einzelfall sogar deutlich mehr. Die ICC 11.0.072-r1 erreichte im Mittelwert nur rund 10 Prozent mehr Durchsatz als die GCC und fällt somit im Vergleich zum älteren Bruder stark ab.

Abbildung 3: Die bei PostgreSQL-Benchmark zur Mittelwertbildung herangezogenen Einzelwerte der beiden Intel-Compiler liegen durchgehend über dem erreichbaren Durchsatz der GCC. Insbesondere das Kompilat der stabilen ICC-Version überzeugt.
Die Ergebnisse zeigen natürlich nur eine Tendenz auf und sind nicht auf jeden Einzelfall übertragbar – das Spielen mit Compilerflags, das Optimieren auf andere CPUs und ein Tuning der PostgreSQL-Konfiguration führten sicher zu anderen Ergebnissen. Andererseits fällt der Gewinn der stabilen ICC-Version so deutlich aus, dass er Beachtung verdient.
Fazit
Gentoo verfolgt mit dem Herunterladen der Sourcen und deren anschließendes Kompilieren einen gänzlich anderen Ansatz als der Linux-Mainstream mit seinen Deb- oder RPM-Binärpaketen. Der erfahrene Gentoo-Anwender wählt dabei die Compilervorgaben genau passend zu seiner Hardware aus. Ob das Ganze in der Praxis vor- oder nachteilig ist, mag jeder selbst entscheiden. Zumindest zum Testen der Wirksamkeit von Compilern eignet sich Gentoo Linux offenbar prima. Auch weil das Portage-System die Möglichkeit einräumt, nur einzelne Programmpakete zum Übersetzen mit einem alternativen Compiler auszuwählen.
Im Rahmen dieses Artikels geschah das für einen PostgreSQL-Server. Der gemessene Geschwindigkeitsvorteil von rund 25 Prozent ist so relevant, dass bei einer Datenbank, deren Antwortzeiten unter Last anschwellen, das Neukompilieren mit der ICC die Investition in neue Hardware hinauszögern kann. So betrachtet, sind Testläufe mit variierten Compilerflags und alternativen Übersetzern keine Spielerei, sondern helfen Kosten zu sparen. Das gilt tendenziell für alle Serverapplikationen. Die auf auf Desktopsystemen erzielbare Performancesteigerung wird zwar auch in dieser Größenordnung ausfallen, jedoch spüren PC-Anwender einen Geschwindigkeitsgewinn subjektiv erst ab rund 30 Prozent.
Infos
- Gentoo-Projekt: http://www.gentoo.org
- Deutschsprachiges Gentoo-Portal: http://www.gentoo.de
- Gentoo-Software-Kategorien: http://packages.gentoo.org/categories/
- Intel-Compiler zum nicht-kommerziellen Gebrauch: http://software.intel.com/en-us/articles/non-commercial-software-development/
- Anleitung zur ICC-Konfiguration auf Gentoo-Systemen: http://www.gentoo-wiki.info/HOWTO_ICC_and_Portage
- Inoffizielles Portage-Archiv mit Ebuilds zu den ICC-Versionen 12.X: http://gpo.zugaina.org/dev-lang/icc







