我正在使用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->.“计算约44%的时间。除了这棵大树,在调用图中还有另一个独立的单节点树-- getaliasbyname_r,如图中所示,它没有调用,也没有被任何其他函数调用。我在googled上搜索了这个函数,并被引导到http://linux.die.net/man/3/getaliasbyname_r。但这没有多大帮助。我仍然不知道getaliasbyname_r()是如何被调用的,为什么要花费这么多的时间。这个问题现在有意义吗?
回答禤浩焯:谢谢你的答复。总运行时间约为28秒。分析器以100/秒的速度进行采样。总共有2800个样本。大约1500Fall在getaliasbyname_r()中,提出了一个由我编写的函数(捕获了大约450个示例)。
发布于 2013-03-05 22:21:24
如果您没有libc6的符号,则经常会发生此问题。getaliasbyname_r是从libc6导出的,但是许多内部函数不是,这些内部函数中有许多是由您的代码间接调用的,并且在二进制文件中出现在getaliasbyname_r之后。
因此,当分析器进行符号查找时,它将时间错误地归因于错误的函数。糟了。
解决方案是安装符号,然后再试一次。http://randomascii.wordpress.com/2013/01/08/symbols-on-linux-part-one-g-library-symbols/
发布于 2011-11-24 09:29:53
据我所知,getaliasbyname_r使用的是某种名为Name Service Switch的东西,它似乎是某种远程服务(有点像DNS)。
第二件事是,这里测量的时间似乎是内存时间,而不是实际的cpu使用情况。
所以我的猜测是,getaliasbyname_r只是等待来自某个网络服务的响应,这会占用大量时间,而cpu实际上大部分时间都处于空闲状态(在大多数操作系统中,最后一部分并不正确,因为cpu只处理其他任务,但是您的应用程序“卡在”getaliasbyname_r中,直到从NSS返回响应为止)。
https://stackoverflow.com/questions/8251653
复制相似问题