我正在尝试在Linux环境中分析服务器(我可以使用的源代码.c代码)。该服务器像Web服务器一样连续运行。我正在尝试使用gprof来配置服务器。如果服务器自行退出,则会生成gmon.out文件。我可以使用gprof和gmon.out来理解配置文件数据。现在问题是,这台服务器正在连续运行,等待传入的套接字连接,请求等。如果我终止此服务器,则不会生成gmon.out。此时我看到以下选项。
编辑:服务器是多进程服务器。在FreeBSD 7.2上运行
我敢肯定,人们之前已经解决了这些问题。我没能在SO或外面找到有用的信息。
我感谢人们的任何想法/解决方案。
非常感谢。
更新1:
不知怎的,我设法为valgrind获取端口。当我运行make时,我得到以下错误。
=> valgrind-stable-352.tar.gz doesn't seem to exist in /usr/obj/ports/distfiles/.
=> Attempting to fetch from ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/.
fetch: ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/valgrind-stable-352.tar.gz: File unavailable (e.g., file not found, no access)
=> Attempting to fetch from http://www.rabson.org/.
fetch: http://www.rabson.org/valgrind-stable-352.tar.gz: No address record
=> Couldn't fetch it - please try to retrieve this
=> port manually into /usr/obj/ports/distfiles/ and try again.
*** Error code 1
我试图在网上找到valgrind-stable-352.tar.gz。我找到的所有链接都已经死了。
我在freebsd上安装了pstack,实现的pstack只提供堆栈跟踪。参考:http://sourceforge.net/projects/bsd-pstack/
我的理解是systemtap仅用于内核空间事件,仪器等。
我可能错了或信息不足。请纠正我并提出你的想法。非常感谢您的帮助。
更新2 : 我认为提供一些有关我试图描述的服务器的详细信息会很有帮助。
答案 0 :(得分:5)
答案 1 :(得分:3)
即使你得到gprof为你服务,也有问题。
任何系统调用或I / O都是盲目的。它是基于你永远不会做不必要的挂起的假设。它只关注受CPU限制的问题。
如果有任何递归,则无法处理。
它给你的时间是基于不稳定的假设,例如每次调用例程需要大约相同的时间。它没有为您提供行级信息。
衡量是一回事,但如果你想找到做不必要事情的“瓶颈”,无论是CPU还是I / O,一个非常粗略但有效的工具是lsstack
(我认为是在SourceForge上)
另外,请查看Zoom。它是适用于Linux的壁挂式堆栈采样器。它给出了行级百分比,我相信它可以在正在运行的进程中附加和分离。
答案 2 :(得分:3)
你可以使用PmcTools - FreeBSD的类似oProfile的替代方案。
答案 3 :(得分:1)
您可以覆盖SIGTERM处理程序以调用exit(0)
,这将导致gprof生成通常的gmon.out
。
答案 4 :(得分:0)
通过方法(通过套接字发送的命令)扩展您的服务器,以便顺利退出,并且您有gmon.out。或者我错过了一些东西,完全不可能让它退出而不杀死它?
答案 5 :(得分:0)
如果你能够尝试使用fedora / rhel linux盒进行开发测试,那么systemtap可以让你很好地了解你的服务器进程。例如,如果您希望在用户空间程序中对活动函数进行采样,那么相对简单的事情可能有所帮助:
# stap -e 'global fns; probe timer.profile {if (user_mode()) fns[usymdata(uaddr())] <<< 1 }' -d /bin/yourserver -d /lib/yourlibrary.so -d /lib/yourotherlibrary.so
^C
。报告可能看起来像
fns["memset /lib64/libc-2.12.so+0xa7d/0xb20"] @count=0x56 @min=0x1 @max=0x1 @sum=0x56 @avg=0x1
fns["memset /lib64/libc-2.12.so+0x560/0xb20"] @count=0x12 @min=0x1 @max=0x1 @sum=0x12 @avg=0x1
fns["__GI_strlen /lib64/libc-2.12.so+0x0/0x50"] @count=0x4 @min=0x1 @max=0x1 @sum=0x4 @avg=0x1
fns["gobble_file /bin/ls+0x729/0xc70"] @count=0x1 @min=0x1 @max=0x1 @sum=0x1 @avg=0x1
fns["getuser /bin/ls+0x1c/0xa0"] @count=0x1 @min=0x1 @max=0x1 @sum=0x1 @avg=0x1
fns["getuser /bin/ls+0x23/0xa0"] @count=0x1 @min=0x1 @max=0x1 @sum=0x1 @avg=0x1
答案 6 :(得分:0)
您可能希望查看Dyninst:http://www.dyninst.org/
它是一个基于ptrace()的API,用于动态添加和删除运行代码的工具。您可以将它用于调试,分析等。
祝你好运。答案 7 :(得分:0)
我对此事并不太了解,但是不能使用DTrace来做到这一点吗?
FreeBSD刚刚改进了对它的支持。 http://wiki.freebsd.org/DTrace/userland
答案 8 :(得分:0)
这可能是PMP
的情况