Brendan D. Gregg(DTrace书籍的作者)有一个有趣的分析变体: “离线CPU”分析 (和离CPU火焰图 ; 幻灯片2013,P112-137 ),看看线程或应用程序被阻塞不是由CPU执行的,而是等待I / O,页面error handling程序或由于CPU资源不足而被取消预定):
这一次揭示了哪些代码path被阻塞,并在closuresCPU时等待,以及确切的时间。 这与传统的概要分析不同,后者通常以给定的时间间隔对线程的活动进行采样,并且(通常)只在线程正在CPU上执行时检查线程。
他还可以将“非CPU”configuration文件数据和“On-CPU”configuration文件组合在一起: http : //www.brendangregg.com/FlameGraphs/hotcoldflamegraphs.html
Gregg给出的例子是使用dtrace
,这在Linux操作系统中通常是不可用的。 但是也有一些类似的工具(ktap,systemtap,perf),而且我认为perf
具有最广泛的安装基础。 通常通过执行生成的CPU上的configuration文件(这些function在CPU上更频繁地执行)。
perf
分析工具? PS:在LISA13,p124的幻灯片中,有一个关于off-CPU火焰图的systemtap变体的链接:“ Yichun Zhang创build了这些,并且一直在Linux上使用SystemTap来收集configuration文件数据,参见:• http:// agentzh .org / misc / slides / off-cpu-flame-graphs.pdf “ ”(CloudFlare Beer Meeting于2013年8月23日)
我发表的perf技术[1]是一个高开销的解决方法,直到perf对BPF支持。
目前,在Linux上生成非CPU火焰图的成本最低的方法是使用4.6+内核(具有BPF堆栈跟踪支持)以及bcc / BPF。 我为它写了一个工具offcputime [2],它可以用“折叠输出”的-f选项运行,适合输入到flamegraph.pl中。 这个offcputime工具在内核内容中执行计时和堆栈计数,然后转储一个随后用符号打印的报告。
有一天,我预计perf本身也可以做到这一点:运行一个BPF程序,进行内核计数,并倾倒报告。
同时,我们可以使用bcc / BPF。 如果由于某种原因,你不能使用密件抄送,那么你现在就可以把这个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
Brendan Gregg发布了有关非cpu火焰图生成的说明: http ://www.brendangregg.com/blog/2015-02-26/linux-perf-off-cpu-flame-graph.html和https:// github。 COM / brendangregg / FlameGraph /问题/ 47#
非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
来自Gregg的stackcollapse.pl和flamegraph.pl用于绘制火焰图。
有使用从3.17内核和更新的perf选项…