我们有一个消息处理系统具有高性能的要求。最近,我们已经注意到的第一条消息需要许多时间更长,然后随后的消息。一堆转换和信息隆发生,因为这是通过我们的系统,它通过外部lib。

我只是分析这个问题(使用callgrind),比较"运行"一个消息"运行"许多消息(提供一个基准的对比)。

主要的差我看到的是"功能do_lookup_x"采取了大量的时间。看着各种呼吁,这一功能,它们似乎都是由公共职能:_dl_runtime_resolve.不确定什么这一功能,但对我来说这看起来像是第一次将各种共用图书馆,正在使用的,然后被装载在以记忆通过的ld。

这是一个正确的假设?二进制将不会载的共享图书馆,以存储直到他们正准备使用,因此我们将看到一个大规模的经济放缓的第一个消息,但没有后续的?

我们怎么去避免这样?

注:我们经营的微秒的规模。

有帮助吗?

解决方案

ld.so(8)手册页的环境部分:

   LD_BIND_NOW
          (libc5;  glibc since 2.1.1) If set to a non-empty string, causes
          the dynamic linker to resolve all  symbols  at  program  startup
          instead  of deferring function call resolution to the point when
          they are first referenced.  This is useful when using  a  debug-
          ger.

所以,LD_BIND_NOW=y ./timesensitiveapp

其他提示

作为一种替代 伊格纳西奥*巴斯克斯-艾布拉姆斯的运行时的建议, 你可以做同样的事情在的链接时间。当你的链接,共享图书馆,通过 -z now 标志的连接物。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top