点击右上角的“搜索”按钮,输入“tcp_send”:
您也可以在选择此 SVG 后或在SVG 链接上时键入 Ctrl-F 进行搜索。
火焰图现在有搜索功能!在右侧的大 tcp_send() 框架下,我们可以看到写入代码路径。但是左边那些小的 tcp_send() 是什么,在 tcp_recv msg () 上面?想想为什么会发生这种情况,然后单击突出显示的帧进行缩放并查看原因。
其他有趣的搜索词是“re?cv”、“spin”、“copy”和“xen”。这是学习 Linux 内核内部结构或任何软件内部结构的好方法。
与搜索匹配的样本数量以百分比形式显示在右下角(这不包括垂直重叠)。“tcp_send”存在于 59.3% 的样本中。我想起了Bill Joy的TCP-IP Digest 第 1 卷第 6 卷(1981 年 11 月)中的以下引用:
作为一个实验来研究由此产生的 TCP/IP 实现的性能… 11/750 的 CPU 已饱和,但 11/780 有大约 30% 的空闲时间。系统处理数据所花费的时间分布在处理以太网 (20%)、IP 数据包处理 (10%)、TCP 处理 (30%)、校验和 (25%) 和用户系统调用处理 (15 %), 没有单一的处理部分支配系统中的时间。
此类故障非常有用,因为它们可以量化绩效,并可用于确定工作的优先级,并估计变更的速度。但即使是在比尔·乔伊的电子邮件发送 30 多年后的今天,从传统的个人资料中计算出来也很费力。火焰图搜索使这变得更容易。
今年早些时候我做过 rxNetty vs Tomcat 分析,需要量化 CPU 配置文件中的函数。火焰图有很大帮助,但查找和添加不同的帧仍然有点耗时。我们中的一些人想要一种方法来搜索术语并获得匹配的百分比,从而产生了这个功能。Thorsten Lorenz 去年已经在他的web 火焰图界面中实现了搜索,因为它非常有用。
此处的实际火焰图来自 iperf 本地基准测试,该基准测试使用以下命令生成:
$ perf record -F 99 -a -g – sleep 30
$ perf script | gzip > out.perf01.gz
[…复制到本地机器…]
$ gzcat out.perf01.gz | ./stackcollapse-perf.pl |
sed ‘/cpu_idle/d;s/[未知];//g’ |
./flamegraph.pl --width 1000 --hash
–title “Linux 内核 CPU 火焰图(带搜索)” > flamegraph_search.svg
火焰图软件在github 上。我正在使用 sed(1) 删除 CPU 空闲堆栈,并删除“[未知]”帧,这些帧在我分析 iperf 的剥离和优化版本时存在。如果我还想查看用户级堆栈,我需要在没有 -fno-omit-frame-pointer 的情况下重建 iperf,或者使用 perf 的其他堆栈遍历器 (libunwind) 和 iperf debuginfo。我没有在这里,因为我只是对内核 CPU 配置文件感兴趣。
我最近还在 Netflix 技术博客上写了关于混合模式 Java 火焰图的文章。
转载翻译自: https://www.brendangregg.com