_dl_runtime_resolve - Когда общие объекты загружаются в память?

У нас есть система обработки сообщений с высокими требованиями к производительности. Недавно мы заметили, что первое сообщение занимает много раз дольше, чем последующие сообщения. По мере того, как это происходит в нашей системе, происходит множество трансформаций и расширений сообщений, большая часть которых выполняется посредством внешней библиотеки.

Я только что профилировал эту проблему (используя callgrind), сравнивая «прогон» только одного сообщения с «прогоном» многих сообщений (предоставляя базовый уровень сравнения).

Основное отличие, которое я вижу, заключается в том, что функция do_lookup_x отнимает огромное количество времени. Рассматривая различные вызовы этой функции, кажется, что все они вызываются общей функцией: _dl_runtime_resolve. Не уверен, что эта функция делает, но для меня это выглядит так, как будто в первый раз используются разные общие библиотеки, а затем они загружаются в память ld.

Это правильное предположение? Что двоичный файл не будет загружать разделяемые библиотеки в память до тех пор, пока они не будут подготовлены к использованию, поэтому мы увидим значительное замедление в первом сообщении, но ни в одном из последующих?

Как нам избежать этого?

Примечание: мы работаем в масштабе микросекунд.

Ответы на вопрос(2)

Ваш ответ на вопрос