_dl_runtime_resolve - Wann werden die freigegebenen Objekte in den Speicher geladen?

Wir haben ein Nachrichtenverarbeitungssystem mit hohen Leistungsanforderungen. Kürzlich ist uns aufgefallen, dass die erste Nachricht um ein Vielfaches länger dauert als nachfolgende Nachrichten. Eine Reihe von Transformationen und Nachrichtenerweiterungen finden statt, während dies unser System durchläuft, wobei ein Großteil davon über die externe Bibliothek erfolgt.

Ich habe gerade dieses Problem analysiert (mithilfe von Callgrind) und einen "Lauf" von nur einer Nachricht mit einem "Lauf" von vielen Nachrichten verglichen (als Vergleichsbasis).

Der Hauptunterschied, den ich sehe, ist die Funktion "do_lookup_x", die sehr viel Zeit in Anspruch nimmt. Betrachtet man die verschiedenen Aufrufe dieser Funktion, so scheinen sie alle von der gemeinsamen Funktion _dl_runtime_resolve aufgerufen zu werden. Ich bin mir nicht sicher, was diese Funktion bewirkt, aber für mich sieht es so aus, als würden die verschiedenen gemeinsam genutzten Bibliotheken zum ersten Mal verwendet und dann vom ld in den Speicher geladen.

Ist das eine richtige Annahme? Dass die Binärdatei die gemeinsam genutzten Bibliotheken erst dann in den Speicher lädt, wenn sie für die Verwendung vorbereitet wurden. Daher wird die erste Nachricht massiv langsamer, aber keine der folgenden?

Wie können wir das vermeiden?

Hinweis: Wir arbeiten im Mikrosekundenbereich.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage