如何配置在FreeBSD上运行的连续运行的服务器

时间:2011-03-03 21:12:39

标签: c profiling gprof

  

可能重复:
  Saving gmon.out before killing a process

我正在尝试在Linux环境中分析服务器(我可以使用的源代码.c代码)。该服务器像Web服务器一样连续运行。我正在尝试使用gprof来配置服务器。如果服务器自行退出,则会生成gmon.out文件。我可以使用gprof和gmon.out来理解配置文件数据。现在问题是,这台服务器正在连续运行,等待传入的套接字连接,请求等。如果我终止此服务器,则不会生成gmon.out。此时我看到以下选项。

  1. 将源代码更改为配置文件本身,并在收到SIGKILL信号后记录此信息。这是迄今为止最丑陋的解决方案,可能会在测量中引入噪声。
  2. 也许有一种方法可以在服务器仍在运行时使用gprof配置此服务器。
  3. 其他可以尝试的工具?
  4. 编辑:服务器是多进程服务器。在FreeBSD 7.2上运行

    我敢肯定,人们之前已经解决了这些问题。我没能在SO或外面找到有用的信息。

    我感谢人们的任何想法/解决方案。

    非常感谢。

    更新1:

    1. gprof似乎不适用于多进程服务器。当我在执行我的服务器之后设法获得gmon.out时,只有父进程被检测到实际上没有真正的工作!。
    2. oProfile不支持我的服务器运行的FreeBSD。由于种种原因,我不能(不允许)改变操作系统。
    3. Valgrind网站没有FreeBSD的端口。但是有一些对FreeBSD端口的引用。我找不到FreeBSD端口源代码。
    4. 不知怎的,我设法为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。我找到的所有链接都已经死了。

      1. 我在freebsd上安装了pstack,实现的pstack只提供堆栈跟踪。参考:http://sourceforge.net/projects/bsd-pstack/

      2. 我的理解是systemtap仅用于内核空间事件,仪器等。

      3. 我可能错了或信息不足。请纠正我并提出你的想法。非常感谢您的帮助。

        更新2 : 我认为提供一些有关我试图描述的服务器的详细信息会很有帮助。

        1. 是多服务器程序。 I / O绑定,是特定的mysql数据库。
        2. 没有线程涉及。每个子服务器进程只处理一个请求。服务器启动时会创建可配置的进程数。
        3. 我想在每个功能及其频率上花费时间。功能代码是CPU绑定和IO绑定的混合(我相信更多的IO)。
        4. 它在FreeBSD 7.2上运行
        5. 写在c。读取次数远远大于通过此服务器写入数据库的数量。

9 个答案:

答案 0 :(得分:5)

虽然您当然应该对关键生产系统进行分析,但是 使用oprofile或/和systemtap,它们可能已包含在您的发行版中。

答案 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

的情况