_dl_runtime_resolve - Когда общие объекты загружаются в память?
У нас есть система обработки сообщений с высокими требованиями к производительности. Недавно мы заметили, что первое сообщение занимает много раз дольше, чем последующие сообщения. По мере того, как это происходит в нашей системе, происходит множество трансформаций и расширений сообщений, большая часть которых выполняется посредством внешней библиотеки.
Я только что профилировал эту проблему (используя callgrind), сравнивая «прогон» только одного сообщения с «прогоном» многих сообщений (предоставляя базовый уровень сравнения).
Основное отличие, которое я вижу, заключается в том, что функция do_lookup_x отнимает огромное количество времени. Рассматривая различные вызовы этой функции, кажется, что все они вызываются общей функцией: _dl_runtime_resolve. Не уверен, что эта функция делает, но для меня это выглядит так, как будто в первый раз используются разные общие библиотеки, а затем они загружаются в память ld.
Это правильное предположение? Что двоичный файл не будет загружать разделяемые библиотеки в память до тех пор, пока они не будут подготовлены к использованию, поэтому мы увидим значительное замедление в первом сообщении, но ни в одном из последующих?
Как нам избежать этого?
Примечание: мы работаем в масштабе микросекунд.