13

可能重复:
在终止进程之前保存 gmon.out

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

  1. 在收到 SIGKILL 信号后将源代码更改为配置文件并记录此信息。这是迄今为止最糟糕的解决方案,可能会在测量中引入噪声。
  2. 也许有一种方法可以在服务器仍在运行时使用 gprof 来分析该服务器。
  3. 其他工具可以尝试吗?

编辑:服务器是多进程服务器。在 FreeBSD 7.2 上运行

我敢肯定,人们以前已经解决过这类问题。我没有找到关于 SO 或外部的有用信息。

我很欣赏人们的任何想法/解决方案。

谢谢一堆。

更新 1:

  1. gprof 似乎不适用于多进程服务器。当我在执行服务器后设法获得 gmon.out 时,只有父进程被检测,它实际上并没有做真正的工作!。
  2. oProfile 不支持我的服务器运行的 FreeBSD。由于各种原因,我不能(不允许)更改操作系统。
  3. Valgrind 网站没有 FreeBSD 的端口。但是有一些引用到 FreeBSD 的移植。我找不到 FreeBSD 端口源。

不知何故,我设法获得了 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 仅用于内核空间事件、检测等。

我可能是错的或没有足够的信息。请纠正我并提出您的想法。我非常感谢您的帮助。

更新 2:我认为提供有关我正在尝试分析的服务器的一些详细信息会很有帮助。

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

9 回答 9

5

虽然您当然应该在分析关键生产系统时采取预防措施,但使用oprofile或/和systemtap,它们可能已经包含在您的发行版中。

于 2011-03-03T21:24:27.017 回答
3

即使你让 gprof 为你服务,也有问题。

  • 它对任何系统调用或 I/O 都视而不见。它基于您永远不会进行不必要的挂起的假设。它只关注与 CPU 相关的问题。

  • 如果有任何递归,它就无法处理它。

  • 它给你的时间是基于不稳定的假设,例如每次调用例程都需要大约相同的时间。它不会为您提供行级信息。

测量是一回事,但如果你想找到做不必要的事情的“瓶颈”,无论是 CPU 还是 I/O,一个非常粗糙但有效的工具是lsstack(我认为在 SourceForge 上)。

另外,看看Zoom。它是适用于 Linux 的壁挂时间堆栈采样器。它提供了行级百分比,我相信它可以与正在运行的进程连接和分离。

于 2011-03-03T22:35:30.623 回答
3

您可以只使用PmcTools - FreeBSD 的类似 oProfile 的替代方案。

于 2011-03-10T19:01:49.567 回答
1

You can override the SIGTERM handler to call exit(0) which will cause gprof to generate the usual gmon.out.

于 2011-03-03T21:20:18.293 回答
0

这可能是PMP的情况

于 2011-03-18T03:44:42.753 回答
0

你可能想看看 Dyninst:http ://www.dyninst.org/

它是一个基于 ptrace() 的 API,用于在运行代码中动态添加和删除检测。您可以将其用于调试、分析等。

祝你好运。

于 2011-03-16T14:31:16.713 回答
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

于 2011-03-15T18:38:57.520 回答
0

我对这件事不太感兴趣,但不能用 DTrace 来做这件事吗?

FreeBSD 刚刚改进了对它的支持。 http://wiki.freebsd.org/DTrace/userland

于 2011-03-17T01:02:44.340 回答
0

通过一种方法(可能是通过套接字发送的命令)扩展您的服务器以顺利退出它,然后您就有了 gmon.out。还是我错过了什么,完全不可能让它退出而不杀死它?

于 2011-03-10T19:42:16.553 回答