_dl_runtime_resolve - Quando os objetos compartilhados são carregados na memória?

Temos um sistema de processamento de mensagens com demandas de alto desempenho. Recentemente, notamos que a primeira mensagem leva muito mais tempo do que as mensagens subsequentes. Um monte de transformação e aumento de mensagens acontece à medida que passa pelo nosso sistema, grande parte disso feito por meio de lib externa.

Acabei de criar um perfil desse problema (usando o callgrind), comparando uma "execução" de apenas uma mensagem com uma "execução" de muitas mensagens (fornecendo uma linha de base de comparação).

A principal diferença que vejo é a função "do_lookup_x" ocupando uma quantidade enorme de tempo. Observando as várias chamadas para essa função, todas elas parecem ser chamadas pela função comum: _dl_runtime_resolve. Não tenho certeza do que essa função faz, mas para mim parece a primeira vez que as várias bibliotecas compartilhadas estão sendo usadas e, em seguida, são carregadas na memória pelo ld.

Será esta uma suposição correta? Que o binário não carregará as bibliotecas compartilhadas na memória até que elas estejam sendo preparadas para uso, portanto, veremos uma grande desaceleração na primeira mensagem, mas em nenhuma das subsequentes?

Como evitamos isso?

Nota: Operamos na escala de microssegundos.

questionAnswers(2)

yourAnswerToTheQuestion