PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Gentoo Optimierungs howto



Stage
03.11.03, 12:11
0 Vorwort
Dieses Howto ist für Gentooneulinge und für diejenigen, denen die Einstellungen in der make.conf einige Kopfzerbrechen bereitet.
Man sollte sich stets an die Installationanleitung (http://www.gentoo.org/doc/de/handbook/handbook.xml) halten
Nachfolgende Anleitung sollte man beachten, wenn man bei Punkt 5.e und Punkt 6 des Installationshandbuchs angelangt ist.
Aber bevor es jetzt daran geht die make.conf fröhlich zu editieren, sollte man vorher eine vollständige mit Kommentaren und allen Optionen versehene Sampledatei kopieren. Dazu einfach folgenden Befehl nach dem entpacken des stage-archives ausführen (nur Stage1 Systeme).
copy /mnt/gentoo/etc/make.conf.example /mnt/gentoo/etc/make.confAchtung: bei Stage2 und 3 Systemen darf man nicht einfach die alte make.conf überschreiben, weil dadurch die CHOST Einstellung verändert werden kann, daher die ursprüngliche Einstellung aufschreiben und in die Sampledatei eintragen, erst danach kopieren.

1 CHOST
sollte so gewählt werden

386 --> CHOST="i386-pc-linux-gnu"
486 --> CHOST="i486-pc-linux-gnu"
586, Pentium, AMD K6 Serie, Winchip-C6 --> CHOST="i586-pc-linux-gnu"
Pentium Pro und neuer, AMD Athlon und neuer --> CHOST="i686-pc-linux-gnu"

ACHTUNG: Diese Einstellung bei einem Stage 2 und 3 System nicht verändern.

2 Kompilereinstellungen

2.1 CFLAGS
Die CFLAGS bestimmen das Kompilerverhalten des C-Kompilers.
Eine typische Zeile sieht so aus:
CFLAGS="-march=xxxxx -O2 -pipe"Wichtig bei -O3, das das der grosse Buchstabe o ist und nicht die Zahl NULL.

-O3 ist die höchste Optimierungstufe bei gcc (gnu C-Kompiler)
-O2 optimiert weniger als -O3, die Binaries werden auch nicht so gross (ist auch die Defaulteinstellung bei GNU-Projekten)
-Os schließt alle Optimierungen von -O2 ein, außer diejenigen, die das Binary grösser machen würden
-O1 Optimiert noch weniger als O2
-O0 deaktiviert die Optimierungen (sollte nicht verwendete werden)

Häufig hab ich auch gesehen das -march und -mcpu gleichzeitig verwendet werden. Das ist falsch.
-march optimiert den Code vollständig für den angegebenen Prozessor, so das dieser auf älteren CPU's nicht lauffähig ist.
-mcpu optimiert dementsprechend nicht ganz so gut, aber der Code bleibt auf älteren CPU's trotzdem lauffähig.

Folgende CPU Typen (x86) werden vom aktuellen stable gcc (3.3.4) unterstützt
i386, i486, i586, i686, pentium, pentium-mmx, pentiumpro, pentium2, pentium3, pentium4, k6, k6-2, k6-3, athlon, athlon-tbird, athlon-4, athlon-xp, athlon-mp, winchip-c6, winchip2 und c3

Hinweis: wer sich nicht sicher ist welchen CPU-Typ er hat, kann mit
cat /proc/cpuinfo einige Details in Erfahrung bringen

Wenn die CPU die SSE Befehlserweiterungen unterstützt können die mathematischen Operationen durch diese übernommen werden -mfpmath=sse

Achtung: Mir sind schon Pakete begegnet, die mit diesem Flag nicht erfolgereich kompiliert werden konnten.
hierzu ein Auszug aus der Manpage

The resulting code should be considerably faster in majority of cases and avoid the numerical
instability problems of 387 code, but may break some existing code that expects temporaries to be
80bit.
als eine weitere Option zum Optimieren ist -fomit-frame-pointer zu nennen. In den Manpages steht dazu, dass dieses bei sämtlichen -O*-Optimierungen aktiviert wird, wenn es mit Debugging nicht in Konflikt gerät. Bei x86-Architekturen scheint dies aber der Fall zu sein, also muss man es explizit mit angeben. Wer also später nicht vor hat Programme debuggen zu müssen, kann dies ohne Gefahr mit angeben, weil es einen guten Geschwindigkeitsvorteil bringt. Die Funktionen müssen dann nicht jedesmal, die Framepointer sichern, setzen bzw wiederherstellen.

-pipe ist dazu da den Kompileprozess zu beschleunigen

2.2 CXXFLAGS
die CXXFLAGS sollten genauso aussehen wie die CFlags

CXXFLAGS="${CFLAGS}"ACHTUNG: wenn man wie weiter oben beschrieben die Sampledatei kopiert hat, dann ist CXXFLAGS mit einem # versehen. Nicht vergessen dies wegzunehmen.

2.3 Sonstiges
Damit die CPU auch gut ausgelastet ist, empfiehlt es sich die MAKEOPTS weiter unten in make.conf zu setzen. Die Zahl hinter dem -j sollte so gewählt werden das sie der CPU-Anzahl+1 entspricht
Bei einem Singleprozessorsystem sollte das so aussehen
MAKEOPTS="-j2"
3 USE-Flags
eine Liste aller Flags und Beschreibungen findet man in

/usr/portage/profiles/use.desc
/usr/portage/profiles/use.local.desc
http://www.gentoo.org/dyn/use-index.xml

3.1 Funktionsweise
Jeder der schon einmal aus Quellcode ein Programm erstellt hat, wird festgestellt haben, daß man dem ./configure Script verschiedene Parameter übergeben kann. Einige dieser Parameter regeln welche Funktionalität das Programm haben soll. Und genau das machen die USE-Flags in vereinfachter Form.

3.2 welche USE-Flags?
Nun wird sich natürlich jeder fragen, was muss ich nun setzen, und was nicht. Diese Frage ist nicht leicht zu beantworten, weil es unzählige Konfigurationen gibt.
Es gibt aber einen Ansatz, wie man vermeidet, dass man etwas vergisst oder zu viel setzt.

3.2.1 Stage 1 + 2
Bevor es zum Bootstrappen kommt, müssen noch die USE-Flags eingestellt werden. Damit man nicht unnötig die lange Liste der Flags durchgeht und sich dadurch jede menge Arbeit macht, sollte man folgenden Trick versuchen.
Man gibt einfach mal
emerge -pv systemein. Keine Angst, dabei wird noch nichts an eurem System verändert. Aber man bekommt eine Liste der Pakete, die während des Bootstraps und anschließenden emerge system installiert werden. Es werden aber auch die unterstützten USE-Flags der Pakete angezeigt. Man erkennt, daß schon einige aktiviert sind (anhand des "+" vor dem Flag und der roten Einfärbung). Diese aktivierten Flags stammen aus /etc/make.profile/make.defaults (diese Datei NICHT verändern, sondern alles in /etc/make.conf eintragen).
Meist sind da Dinge dabei, die man nicht unbedingt will. Anstatt jetzt jedes einzelne Flag in der make.conf zu deaktivieren (indem man -FLAG bei USE="" einträgt) was man nicht braucht, kann man auch gleich
USE="-* x86"eintragen. Wenn man die make.conf jetzt abspeichert, und anschließend
emerge -pv systemausführt, sollten nun alle Flags deaktiviert sein. Dies möchte man aber nicht. Also schaut man anhand der Ausgabe was man brauchen kann und trägt diese in die make.conf ein. Hier ist zu beachten das durch Hinzunahme von Flags auch neue Pakete mit in die Installation aufgenommen werden können, deswegen muss man, nachdem alle Flags in der make.conf eingetragen sind, noch einmal mit emerge -pv system prüfen ob neue Pakete hinzugekommen sind und mit diesen natürlich eventuell neue Flags, die man noch aktivieren möchte.

Anmerkung: Man sollte zumindest nls und pam mit angeben, damit man später ein System hat, das verschiedene Sprachen und Zeichensätze unterstützt und durch PAM ein gutes Absicherungswerkzeug für den Rechner bereitstellt.
Besitzer einer CPU mit den Befehlserweiterungen 3dnow, mmx, sse sollten auch die zutreffenden Flags mit dazuschreiben: 3dnow mmx sse

Achtung! die Flags static, build, bootstrap, selinux, livecd nicht setzen, weil die für interne Sachen gedacht sind.
Anschliessend kann man wie im Handbuch beschrieben fortfahren.

3.2.2 Stage 3
Wenn man sich für eine Stage 3 Installation entschieden hat, oder nachdem emerge system fertig ist, kann man auch die gleiche Methode, wie unter 3.2.1 beschrieben bei den zu installierenden Paketen anwenden.

emerge -pv PAKETNAME

4 Zusatz

4.1 UFED - Use Flag Editor
Nachdem man nun ein lauffähiges System besitzt, kann man, das Tool ufed installieren (emerge app-portage/ufed).
Das ist eine auf NCurses bassierende GUI, mit der man eine Liste aller Flags erhält (global und local). Zusätzlich kann dieses auch Flags an- und abwählen, und die Ändererungen an der make.conf vornehmen. Natürlich kann man das auch alles wie bisher mit dem Editor erledigen ;)

4.2 Tutorial zum sauber halten des Systems und richtigen Installieren von maskierten Paketen
siehe: http://www.linuxforen.de/forums/showthread.php?t=140969

4.3 Tutorial zum manuellen Konfigurieren des Kernels 2.6.x
siehe: http://de.gentoo-wiki.com/Kernel_manuell_kompilieren

4.4 Emerge beschleunigen
siehe: http://de.gentoo-wiki.com/Emerge_beschleunigen
dazu siehe auch: http://de.gentoo-wiki.com/Arbeiten_mit_tmpfs

SeeksTheMoon
03.11.03, 13:10
wer hochoptimierte CFLAGS haben will, der kann sich hier bedienen:
http://www.freehackers.org/gentoo/gccflags/flag_gcc3opt.html
Die für den Athlon XP 2000+ funktionieren so auf jeden Fall (auch bei mir), ich konnte nur 1-2 für Normalsterbliche sehr exotische Programme nicht kompilieren (Crystalspace Engine und das zweite hab ich vergessen) und hab die Flags dafür runtergeschraubt.

Auf der Seite gibt es auch eine Liste mit "safe-flags", die also auf jeden Fall funktionieren.
Das sind die Optionen O3, pipe, fomit-frame-pointer. Für einen Athlon sieht das so aus:
CFLAGS="-march=athlon -O3 -pipe -fomit-frame-pointer"

Die Seite mit diesen Flags steht hier: http://www.freehackers.org/gentoo/gccflags/flag_gcc3.html

Stage
03.11.03, 16:29
Ich wurde darauf aufmerksam gemacht, dass im Gentooforum ein kleines Script zum anzeigen der kompatiblen CFlags existiert.
http://forums.gentoo.org/viewtopic.php?t=53602

Der einfachhalber hab ich das Script gleich mal als txt-Datei angehangen.
Datei auf dem Rechner abspeichern, dann den chmod setzen

chmod 744 cpuinfo.txt
und script starten

./cpuinfo.txt

spychodelics
14.09.04, 11:47
Die Seiten die SeeksTheMoon angegeben hat sind leider down, gab es dort fertige Dateien die zufällig noch jemand hat?

Brauche eine Optimierung für AMD Athlon XP 2400+ TB

dankend spychodelics