2

google-perftools用来分析我用 C++ 编写并用 g++4.5.2 编译的程序。pprof告诉我getaliasbyname_r()占用了56%的cpu时间!到底是做什么的getaliasbyname_r()?为什么需要这么多cpu时间?有没有办法缓解这个问题?谢谢。编译标志是:-O3 -DNDEBUG -Wall -Wno-deprecated -Wno-sign-compare. 系统:ubuntu 11.04。

很抱歉没有把问题说清楚。我没有在我的代码中直接使用 getaliasbyname_r() 。在分析工具“pprof”生成的调用图中,我可以看到树“ start--> _libc_start_main-->main-->...”占 cputime 的大约 44%。除了这棵大树,调用图中还有另一棵孤立的单节点树——getaliasbyname_r。如图所示,它没有调用,也没有被任何其他函数调用。我用谷歌搜索了这个功能并被引导到http://linux.die.net/man/3/getaliasbyname_r。但这并没有太大帮助。我仍然不知道如何调用 getaliasbyname_r() 以及为什么需要这么多 cputime。这个问题现在有意义吗?

回复阿德里安:谢谢您的回复。总运行时间约为 28 秒。分析器以 100/秒的速率采样。所以总共有大约2800个样本。getaliasbyname_r() 中掉了大约 1500 个,想出了一个我写的函数(捕获了大约 450 个样本)。

4

2 回答 2

3

如果您没有 libc6 的符号,则通常会发生此问题。getaliasbyname_r 是从 libc6 导出的,但许多内部函数不是,而且这些内部函数中有许多是由您的代码间接调用的,并且出现在二进制文件中 getaliasbyname_r 之后。

因此,当分析器进行符号查找时,它会将时间错误地归因于错误的函数。哎呀。

解决方案是安装符号,然后重试。 http://randomascii.wordpress.com/2013/01/08/symbols-on-linux-part-one-g-library-symbols/

于 2013-03-05T22:21:24.163 回答
0

从我能找到的getaliasbyname_r用途来看,Name Service Switch它似乎是一些远程服务(有点像DNS)。

第二件事是这里测量的时间似乎是 ba walltime 而不是实际的 cpu 使用情况。

所以我的猜测是,它getaliasbyname_r只是等待来自某些网络服务的响应,这会消耗很多时间,并且 cpu 实际上大部分时间都是空闲的(最后一部分在大多数操作系统中并不正确,因为 cpu 只会照顾其他任务,但您的应用程序被“卡住”,getaliasbyname_r直到从NSS) 返回响应。

于 2011-11-24T09:29:53.253 回答