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

问题描述 投票:0回答:3

Brendan D. Gregg(DTrace 书的作者)有一个有趣的分析变体:“Off-CPU”分析(和 Off-CPU Flame Graphslides 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 示例转换为 Linux 中的
    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 profiling wait perf
3个回答
17
投票
我发布的 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 源代码中提供了更复杂的版本,如样本/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


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 演讲中解释了脱离 CPU 时间火焰图、此唤醒问题以及其他工作(

slidesyoutube)。

在这里,我将展示一种使用 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 内核及更新版本使用了性能选项...


0
投票
我想提一下,热点支持off-cpu 分析,请参阅:

https://github.com/KDAB/hotspot/#off-cpu-profiling

它依赖于 Linux 调度程序中的性能跟踪点,因此它在查找各种来源方面非常可靠,例如网络请求、磁盘文件 I/O,

© www.soinside.com 2019 - 2024. All rights reserved.