我正在使用google-perftools
来分析用C ++编写并用g ++ 4.5.2编译的程序。 pprof
告诉我getaliasbyname_r()
占用了cpu时间的56%! getaliasbyname_r()
到底是做什么的?为什么需要这么多的CPU时间?有没有办法缓解这个问题?谢谢。
赞美标志是:-O3 -DNDEBUG -Wall -Wno-deprecated -Wno-sign-compare
。系统:ubuntu 11.04。
很抱歉没有提出问题。我没有在我的代码中直接使用getaliasbyname_r()。在分析工具“pprof”生成的调用图中,我可以看到树“ start - > _libc_start_main - > main - > ...”计算大约44%的cputime 。除了这棵大树之外,调用图中还有另一个ioslated单节点树--- getaliasbyname_r。如图中所示,它没有调用,也没有被任何其他函数调用。我用Google搜索了这个函数,并被引导到http://linux.die.net/man/3/getaliasbyname_r。但这没有多大帮助。我仍然不知道如何调用getaliasbyname_r()以及为什么花了这么多cputime。这个问题现在有意义吗?
回复阿德里安:谢谢你的回复。总运行时间约为28秒。剖面仪以100 /秒的速率进行采样。所以总共有2800个样本。大约1500落在getaliasbyname_r()中,得出了我写的函数(捕获了大约450个样本)。
答案 0 :(得分:3)
如果您没有libc6的符号,则经常会出现此问题。 getaliasbyname_r是从libc6导出的,但很多内部函数都没有,并且许多内部函数都是由代码间接调用的,并出现在二进制文件中的getaliasbyname_r之后。
因此,当探查器进行符号查找时,它会将时间错误归因于错误的功能。糟糕。
解决方法是安装符号,然后重试。 http://randomascii.wordpress.com/2013/01/08/symbols-on-linux-part-one-g-library-symbols/
答案 1 :(得分:0)
根据我的发现,getaliasbyname_r
使用名为Name Service Switch
的东西,这似乎是一些远程服务(有点像DNS
)。
第二件事是,这里测量的时间似乎是壁挂时间而不是实际的CPU使用率。
所以我的猜测是getaliasbyname_r
只是等待来自某个网络服务的响应,这会占用大量的时间而且cpu实际上大部分时间处于空闲状态(最后一部分并非在大多数情况下都是如此)作为cpu的操作系统只会处理其他任务,但是您的应用程序“卡在”getaliasbyname_r
中,直到NSS
回复。