Brendan D. Gregg(DTrace 书的作者)有一个有趣的分析变体:“Off-CPU”分析(和 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 操作系统中通常不可用。但还有一些类似的工具(ktap、systemtap、perf)和 perf
,我认为它拥有最广泛的安装基础。通常 perf
生成 On-CPU 配置文件(哪些功能在 CPU 上更频繁地执行)。
perf
分析工具?PS:在 LISA13、第 124 页的幻灯片中,有指向 Off-CPU 火焰图的 systemtap 变体的链接:“Yichun 张创建了这些,并一直在 Linux 上通过 SystemTap 使用它们来收集配置文件数据。请参阅: • http://agentzh.org/misc/slides/off-cpu-flame-graphs.pdf“”(2013 年 8 月 23 日举行的 CloudFlare 啤酒会议)
目前,在 Linux 上生成脱离 CPU 火焰图的最低成本方法是在 4.6+ 内核(具有 BPF 堆栈跟踪支持)和 bcc/BPF 上。我为它编写了一个工具,offcputime[2],它可以使用“折叠输出”的 -f 选项运行,适合输入到 Flamegraph.pl 中。这个 offcputime 工具对内核内容中的所有内容进行计时和堆栈计数,并转储一份报告,然后用符号打印该报告。
有一天,我希望 perf 本身也能够做到这一点:运行一个 BPF 程序来进行内核内计数,并转储报告。
同时,我们可以使用bcc/BPF。如果由于某种原因您无法使用 bcc,您现在可以使用该 offcputime 程序并用 C 语言编写它。Linux 源代码中提供了更复杂的版本,如样本/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
http://www.brendangregg.com/blog/2015-02-26/linux-perf-off-cpu-flame-graph.html 和https://github.com/brendangregg/FlameGraph/issues/47#
Off-CPU 时间火焰图可以解决(比如说)60% 的问题,其余问题则需要遍历线程唤醒来查找根本原因。我在有关火焰图的 LISA13 演讲中解释了脱离 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 内核及更新版本使用了性能选项...