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