【发布时间】:2014-03-12 10:32:30
【问题描述】:
我一直在寻找一种方法来找出我的程序花费时间的地方。我阅读了perf tutorial 并尝试按照那里的描述分析睡眠时间。我编写了最简单的程序来分析:
#include <unistd.h>
int main() {
sleep(10);
return 0;
}
然后我用 perf 执行它:
$ sudo perf record -e sched:sched_stat_sleep -e sched:sched_switch -e sched:sched_process_exit -g -o ~/perf.data.raw ./a.out
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.013 MB /home/pablo/perf.data.raw (~578 samples) ]
$ sudo perf inject -v -s -i ~/perf.data.raw -o ~/perf.data
build id event received for [kernel.kallsyms]: d62870685909222126e7070d2bafdf029f7ed3b6
failed to write feature 2
$ sudo perf report --stdio --show-total-period -i ~/perf.data
Error:
The /home/pablo/perf.data file has no samples!
有人知道如何避免这些错误吗?他们的意思是什么? failed to write feature 2 看起来不太人性化...
更新:
$ uname -a
Linux debian 3.12-1-amd64 #1 SMP Debian 3.12.9-1 (2014-02-01) x86_64 GNU/Linux
【问题讨论】:
-
我不认为 perf 是正确的工具。它监控 CPU 使用情况,您的程序几乎不使用 CPU 时间。
-
@ugoren 这是一种用于分析睡眠时间的特殊模式,perf 仅查找调度程序切换事件,而不是 CPU 周期。
-
目前,您所指的教程具有误导性,您不会得到任何有用的东西。我认为 perf 目前不允许分析睡眠时间,report is filled。
-
@Hi-Angel 这个问题是在 2014 年提出的。现在我们有了 ebpf,所以我认为今天不需要有人需要 perf 睡眠时间分析......
-
@PavelDavydov 感谢您的提及,尽管有些链接确实会有所帮助。我认为您指的是密件抄送脚本和here's a usage example,无论是单独还是带有火焰图。