如何使用linux`perf`工具生成“Off-CPU”配置文件

时间:2014-04-16 02:51:39

标签: linux profiling wait perf

Brendan D. Gregg(DTrace书籍的作者)有一个有趣的分析变体:"Off-CPU" profiling(和Off-CPU Flame Graph; slides 2013, p112-137),以查看线程或应用程序被阻止的位置(不是由CPU执行,而是在等待I / O,页面故障处理程序或由于CPU资源而导致的计划外停止时间:)

  

这一次揭示了哪些代码路径在关闭CPU时被阻止和等待,以及确切地说多长时间。这与传统的分析不同,后者通常以给定的间隔对线程的活动进行采样,并且(通常)只检查线程是否在CPU上执行工作。

他还可以将Off-CPU配置文件数据和On-CPU配置文件组合在一起:http://www.brendangregg.com/FlameGraphs/hotcoldflamegraphs.html

Gregg给出的示例是使用dtrace创建的,这在Linux OS中通常不可用。但是我认为有一些类似的工具(ktap,systemtap,perf)和perf具有最广泛的安装基础。通常perf生成On-CPU配置文件(这些功能在CPU上更频繁地执行)。

  • 如何将Gregg的非CPU示例翻译成Linux中的perf分析工具?

PS:在slides from LISA13, p124中有一个关于off-CPU火焰图的systemtap变体的链接:" Yichun Zhang创建了这些变量,并且已经在Linux上使用它们和SystemTap来收集专业数据。请参阅:•http://agentzh.org/misc/slides/off-cpu-flame-graphs.pdf" " (2013年8月23日CloudFlare啤酒会议)

2 个答案:

答案 0 :(得分:6)

我发布的perf技术[1]是一个高开销的解决方法,直到perf为此提供BPF支持。

目前,在Linux上生成CPU外火焰图的最低成本方式是4.6+内核(具有BPF堆栈跟踪支持)和bcc / BPF。我为它编写了一个工具,offcputime [2],可以使用-f选项运行"折叠输出",适合输入flamegraph.pl。这个offcputime工具在内核内容中完成所有计时和堆栈计数,并转储一个报告,然后用符号打印。

有一天,我希望perf本身也可以这样做:运行一个BPF程序来执行内核计数和转储报告。

与此同时,我们可以使用bcc / BPF。如果出于某种原因你不能使用bcc,你现在可以使用offcputime程序并用C语言编写。在Linux源代码中可以使用更复杂的版本,例如samples / bpf / offwaketime *。借助Linux上的新BPF功能,如果有意愿,那就有办法了。

[1] http://www.brendangregg.com/blog/2015-02-26/linux-perf-off-cpu-flame-graph.html

[2] https://github.com/iovisor/bcc/blob/master/tools/offcputime_example.txt

答案 1 :(得分:2)

Brendan Gregg发表关于Off-cpu火焰图生成的说明: http://www.brendangregg.com/blog/2015-02-26/linux-perf-off-cpu-flame-graph.htmlhttps://github.com/brendangregg/FlameGraph/issues/47#

  

关闭CPU时间火焰图可以解决(比方说)60%的问题,其余部分需要走线程唤醒才能找到根本原因。我在LISA13关于火焰图的讨论(slidesyoutube)中解释了非CPU时间火焰图,这个唤醒问题和其他工作。

     

这里我将展示一种使用Linux perf_events进行非CPU时间火焰图的方法。

# perf record -e sched:sched_stat_sleep -e sched:sched_switch \
 -e sched:sched_process_exit -a -g -o perf.data.raw sleep 1
# perf inject -v -s -i perf.data.raw -o perf.data
# perf script -f comm,pid,tid,cpu,time,period,event,ip,sym,dso,trace | awk '
NF > 4 { exec = $1; period_ms = int($5 / 1000000) }
NF > 1 && NF <= 4 && period_ms > 0 { print $2 }
NF < 2 && period_ms > 0 { printf "%s\n%d\n\n", exec, period_ms }' | \
./stackcollapse.pl | \
./flamegraph.pl --countname=ms --title="Off-CPU Time Flame Graph" --colors=io > offcpu.svg

来自Gregg的stackcollapse.pl和flamegraph.pl用于绘制火焰图。

从3.17内核和更新的...中使用了perf选项。