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

osg*_*sgx 13 linux profiling wait perf

Brendan D. Gregg(DTrace书的作者)有一个有趣的分析变体:"Off-CPU"分析(和Off-CPU Flame Graph ; 幻灯片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示例翻译perf成Linux中的分析工具?

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

Bre*_*egg 7

我发布的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


osg*_*sgx 5

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#

Off-CPU 时间火焰图可以解决(比如说)60% 的问题,其余问题则需要遍历线程唤醒来查找根本原因。我在关于火焰图的 LISA13 演讲(幻灯片youtube )中解释了脱离 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
Run Code Online (Sandbox Code Playgroud)

Gregg 的 stackcollapse.pl 和 Flamegraph.pl 用于绘制火焰图。

3.17 内核及更新版本使用了 perf 选项...

  • 我的意思是 1) 如果加速可以节省 X 分之一的时间,那么两次曝光所需的平均样本数是 2/X,而不是数千。(Gregg 给出了 2000x 的示例,节省了 X=0.9995 的时间 - *两个甚至一个* 样本就可以解决问题。) 2) 如果采取并总结数千个(如火焰图或任何其他总结),则洞察力丢失了,它准确地告诉您加速比是多少,并且您*不能错过任何*。3)可能有更好的方法——让我们看看它是什么。 (2认同)