Autor Thema: [Tipp] Prelinking beschleunigt Programmstart  (Gelesen 1808 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline Bitpicker

  • /dev/gamemaster
  • Famous Hero
  • ******
  • Beiträge: 3.506
  • Geschlecht: Männlich
  • Username: bitpicker
    • Nyboria - the dark side of role-playing
[Tipp] Prelinking beschleunigt Programmstart
« am: 13.10.2007 | 12:13 »
Dieser Tipp ist mit etwas Vorsicht zu genießen, weil er einen gewissen Eingriff in das System darstellt, der womöglich zu Problemen führen kann. Das Resultat ist aber womöglich eine Verkürzung der Ladezeiten besonders größerer Programme sowie mehr freier Arbeitsspeicher.

Bei einem Linux-System sind die meisten Programme als dynamische Binaries kompiliert. Das bedeutet, dass die Bibliotheken, die das Programm zur Ausführung benötigt, nicht Bestandteil des Programms selbst sein müssen. Im Rahmen einer Distribution bedeutet das, dass Bibliothek A automatisch zur Sammlung der vorhandenen Bibliotheken zählt und installiert wird; wenn Anwendungen X, Y und Z A benötigen, muss A nicht in alle drei Anwendungen einkompiliert werden, sondern wird zur Laufzeit einmal von einem Programm, das 'Linker' genannt wird, zur Verfügung gestellt. Bei einem System aus statischen Binaries müssten die Programme X, Y und Z jeweils ihre eigene, einkompilierte Version von A mitbringen, die jeweils beim Programmstart mitgeladen wird und deshalb sowohl Ladezeit als auch Festplatten- und Arbeitsspeicher verschlingt. Wenn alle drei Programm gleichzeitig laufen, laufen auch drei Versionen von Bibliothek A.

Prelinking geht nun noch einen Schritt weiter und sorgt dafür, dass das Linking schon vor dem Aufruf der Programme geschieht; dadurch fällt die Arbeit des Linkers weg, der sonst jedes Mal die Binary analysieren müsste, und der Ladevorgang beschleunigt sich.

Auf Ubuntu-Versionen vor Feisty soll dies spürbare Auswirkungen haben; Feisty benutzt anscheinend einen anderen Prozess fürs Linken, der Prelinking unnötig macht (vgl. http://ubuntuforums.org/showthread.php?t=74197 - hier gibt es auch eine interessante Diskussion zum Thema). Eine weitere kurze Anleitung für die Installation von Prelinking unter Ubuntu gibt es hier: http://bin-false.org/?p=10

Verschiedene Distributionen haben Prelinking vielleicht bereits eingerichtet, andere nicht. Deshalb gebe ich hier keine Anleitung, wie man Prelinking aktiviert, das müsst ihr für eure Distribution selber herausfinden. Meine Distribution ist Gentoo, ich musste Prelink nur emergen und ausführen, einen Guide gibt es hier: http://www.gentoo.org/doc/en/prelink-howto.xml

Ob Prelink bei euch bereits installiert ist, lässt sich (als Root) einfach herausfinden:

which prelink

Wenn die ausführbare Datei gefunden wird, ist Prelink installiert, aber das heißt nicht unbedingt, dass es auch benutzt wird. Ihr solltet überprüfen, ob es auch einen aktiven Prelink-Cronjob gibt.

Bei mir hatte Prelinking den Effekt, dass manche Programme (z.B. Open Office, Gimp) spürbar schneller starten, selbst der Bootvorgang hat sich verkürzt. Leider habe ich vorher keine genauen Messungen vorgenommen, aber es ist durchaus mehr als ein Placebo-Effekt. Vor allem fällt mir aber auf, dass ich nach dem Booten satte 40 MB mehr freien Arbeitsspeicher habe, seit ich das System auf Prelinking umgestellt habe, auch wenn mir noch nicht ganz klar ist, warum das so ist, da das System auch vorher schon aus dynamischen Binaries bestand. Genauer gesagt, nach dem kompletten Aufbau des X-Servers mit den automatisch gestarteten Programmen waren bisher von 786 MB RAM exakt 600 MB frei, jetzt sind es 641 MB. Die Auslagerung bleibt in beiden Fällen inaktiv.

Probleme habe ich bisher keine beobachtet.

Robin
Wie heißt das Zauberwort? -- sudo

(Avatar von brunocb, http://tux.crystalxp.net/)

Darkwalker

  • Gast
Re: [Tipp] Prelinking beschleunigt Programmstart
« Antwort #1 am: 13.10.2007 | 13:48 »
Aus dem Überfliegen der Beschreibung hat der Pinguin einen "DLL-Linker" der keinerlei Hilfsdaten führt sondern jedesmal beim start eines Programs die Binary durchsucht und die entsprechenden Dynamically Linked Libraries raussucht/einfügt(1). Dabei muss das Programm sich ggf. auf Infos des Compilers verlassen (ist ja nur GCC) und bindet alles ein was etwa per #include eingebunden wurde, auch wenn es nicht benutzt wird

Prelinking führt diesen Vorgang beim Installieren des Programms einmal durch und speichert Daten über diesen Lauf im Programm ab, vermutlich Links/Prüfinformationen. Da dieser Vorgang nach den Beschreibungen etwas länger dauert (und auch dauern darf) prüft er ggf. etwas genauer (ähnlich wie der statische Linklauf) und siebt Libraries aus die zwar referenziert aber nicht benutzt werden.

Ich vermute ein Vergleich der Programme wird ein etwas größeres Programm bei Pre-Linking gegenüber DLL's finden, die etwas genauere Prüfung was einzubinden ist auf der anderen Seite sorgt aber dafür das gelegentlich eine unnötige DLL nicht eingebunden wird und somit etwas weniger Speicher verbraten wird.

Wechsel an den Bibos bedingen ein neues Pre-Linking.




(1) DLL - Dynamically Linked Libraries sind ein paar Jahre älter als Microsoft

Offline Bitpicker

  • /dev/gamemaster
  • Famous Hero
  • ******
  • Beiträge: 3.506
  • Geschlecht: Männlich
  • Username: bitpicker
    • Nyboria - the dark side of role-playing
Re: [Tipp] Prelinking beschleunigt Programmstart
« Antwort #2 am: 13.10.2007 | 15:20 »
Das mit den referenzierten, aber nicht benutzten Libraries leuchtet mir ein. Ich habe die Frage, warum ich jetzt 40 MB mehr freies RAM habe, auch im Gentoo-Forum gestellt, mal sehen, was da noch gesagt wird.

Nur eine Kleinigkeit: Prelinking funktioniert nicht nur bei neu zu installierenden Programmen, sondern auch und vor allem bei bereits installierten; deshalb auch der Cronjob, damit auch später installierte Programme in den Genuss kommen.

Edit: habe eben mal in die manpage geschaut, hätte ich auch früher mal machen können. Ich habe prelink mit -amR ausgeführt, und der Parameter m für 'conserve memory' sorgt dafür, dass Bibliotheken im gleichen virtuellen Adressraum landen können, sofern sie nicht gleichzeitig gebraucht werden.

Robin
« Letzte Änderung: 13.10.2007 | 15:40 von Bitpicker »
Wie heißt das Zauberwort? -- sudo

(Avatar von brunocb, http://tux.crystalxp.net/)