_dl_runtime_resolve: ¿cuándo se cargan los objetos compartidos en la memoria?

Tenemos un sistema de procesamiento de mensajes con demandas de alto rendimiento. Recientemente hemos notado que el primer mensaje tarda muchas veces más que los mensajes posteriores. A medida que esto pasa por nuestro sistema, se produce una gran cantidad de transformación y aumento de mensajes, en gran parte a través de una lib externa.

Acabo de describir este problema (usando callgrind), comparando una "ejecución" de un solo mensaje con una "ejecución" de muchos mensajes (proporcionando una línea de base de comparación).

La principal diferencia que veo es que la función "do_lookup_x" ocupa una gran cantidad de tiempo. Mirando las diversas llamadas a esta función, todas parecen ser llamadas por la función común: _dl_runtime_resolve. No estoy seguro de lo que hace esta función, pero para mí parece que es la primera vez que se utilizan las diversas bibliotecas compartidas, y luego el ld las carga en la memoria.

¿Es esta una suposición correcta? Que el binario no cargará las bibliotecas compartidas en la memoria hasta que estén preparadas para su uso, por lo tanto, veremos una desaceleración masiva en el primer mensaje, pero en ninguno de los siguientes.

¿Cómo hacemos para evitar esto?

Nota: Operamos en la escala de microsegundos.

Respuestas a la pregunta(2)

Su respuesta a la pregunta