17

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 操作系统中通常不可用。但也有一些类似的工具(ktap、systemtap、perf),而且perf我认为它们拥有最广泛的安装基础。通常perf生成 On-CPU 配置文件(哪些功能在 CPU 上执行得更频繁)。

  • 如何将 Gregg 的 Off-CPU 示例转换为perfLinux 中的分析工具?

PS:在来自 LISA13, p124的幻灯片中有指向 Off-CPU 火焰图的 systemtap 变体的链接:“张益春创建了这些,并一直在 Linux 上使用它们与 SystemTap 来收集配置文件数据。请参阅: • http://agentzh .org/misc/slides/off-cpu-flame-graphs.pdf ”(2013 年 8 月 23 日的 CloudFlare 啤酒会议)

4

2 回答 2

11

我发布的 perf 技术 [1] 是一种高开销的解决方法,直到 perf 支持 BPF 来执行此操作。

目前,在 Linux 上生成 off-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

于 2016-06-27T20:42:16.523 回答
4

Brendan Gregg 发表了关于 Off-cpu 火焰图生成的说明: http ://www.brendangregg.com/blog/2015-02-26/linux-perf-off-cpu-flame-graph.html 和https://github。 com/brendangregg/FlameGraph/issues/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 选项...

于 2015-02-28T17:18:19.053 回答