[英]How to do wall-clock profiling with dtrace? Or, how to count process-not-running samples with profile provider?
[英]Get gprof to profile based on wall-clock time?
我的理解是默认情况下 gprof 会考虑 CPU 时间。 有没有办法让它根据挂钟时间进行配置?
我的程序执行大量磁盘 I/O,因此它使用的 CPU 时间仅代表实际执行时间的一小部分。 我需要知道磁盘 i/o 的哪些部分占用的时间最多。
您可以使用 google-perftools 中的分析器来测量挂钟时间。 要将 google profiler 切换到挂钟模式,请设置环境变量 CPUPROFILE_REALTIME=1。
您可以使用 strace 或 cachegrind 正确分析代码。 strace 将为您提供系统调用所花费时间的详细信息,cachegrind 将提供资源利用率的详细分析。
您可以使用带有 gcc 编译器的-finstrument-functions
选项来执行此操作。 这将获得在任何函数的入口/出口点调用的自定义函数,只需要提供几个函数回调( __cyg_profile_func_enter
和__cyg_profile_func_exit
)。
您可以通过查找 gcc 手册中的-finstrument-functions
选项找到更多详细信息。
Balau 的技术博客上也有一篇很好的文章,提供了端到端的概述/工作原理示例: 使用 GCC 跟踪和分析函数调用
更改 gprof 以进行挂钟分析非常容易。 唯一要替换的 8 个字符是:
ITIMER_PROF -> ITIMER_REAL
SIGPROF -> SIGALRM
在文件glibc/sysdeps/posix/profil.c
,函数__profil
,靠近对setitimer
和sigaction
的调用(更准确的__Setitimer
和__sigaction
)
更改后,任何使用 SIGALRM 的程序都将被破坏,任何没有阻塞系统调用重新启动代码的程序都可能给出错误的结果。
此外,您可以直接更改 glibc 二进制文件中的 int 值(请不要在系统范围内的libc.so
上执行此libc.so
,请制作单独的副本并将其提供给带有 LD_LIBRARY_PATH 的程序)
对于二进制补丁,ITIMER_PROF 为 2; ITIMER_REAL 为 0; SIGPROF 为 27 (0x1b); SIGALRM 是 14 (0x0e)。 有两个地方,在每个功能不断profil
的glibc。
另一种方法是编写 ptrace-debugger,它将在运行时更改 setitimer 和 sigaction 函数的参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.