Linux CPU 性能分析工具火焰图(Flame Graphs)认知

news2024/12/23 12:29:42

写在前面


  • 博文内容为 《BPF Performance Tools》 读书笔记整理
  • 详细了解小伙伴可以访问作者官网:
  • https://www.brendangregg.com/flamegraphs.html
  • 有油管上分享的作者在USENIX ATC 2017 的视屏
  • 理解不足小伙伴帮忙指正

不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树


火焰图是什么?

火焰图(Flame Graph)是一种可视化工具,可以用于 CPU 性能剖析,可视化 CPU 中函数执行调用栈,可视化来自任何剖析器或跟踪器所记录的调用栈信息。。它由 Brendan Gregg 发明,并广泛用于性能分析和优化领域。

下图为一台部署了 OpenStack 环境的机器,作为 master 节点存在,运行命令 profile -af 30 > out.stacks01 生成的调用栈数据的火焰图可视化展示。

在这里插入图片描述

我们上面讲到了调用栈,对应没接触编码的小伙伴可能不太熟悉,那么调用栈又是什么

调用栈信息

调用栈信息,也称为栈回溯跟踪调用跟踪信息,是一串展示了代码流向的函数名字。例如,如果 func_a() 调用了func_b(),后者又调用了func_c(),那么那里的调用栈信息可以写成:

func_c
func_b
func_a

栈的底部(func_a)是起点,它之上的行显示了代码流向。换句话说,栈的顶部(func_c)是当前函数,向下移动则显示了它的派生关系:先是父亲函数,然后是祖父函数,依此类推。

实际的函数关系可能是这样

func_a(){
      func_b();
}
func_b(){
      func_c();
}

func_c(){
      print("当前执行到这里啦")
}

为什么需要火焰图对调用栈进行剖析

定时采样 方式收集调用栈信息,一般会收集数千个调用栈信息,每个调用都有几十或几百行那么长。为了使这样体量的数据易于分析,

  • Linux 的perf(1)剖析器将其样本摘要为调用树格式,显示每个分支所占的百分比
  • BCC 的profile(8)工具则采用了另外一种摘要方式:对每个独特的调用栈分别计数

使用这两种工具时,如果有某个调用栈占用大量CPU运行时间,那么此类问题可以很快被识别出来。不过对于许多其他分析场景,包括一些微小的性能回归测试(进行更改后是否出现性能下降),定位罪魁祸首可能需要研究数百页的剖析器输出。火焰图就是为了解决这个问题

火焰图怎么看?

下述输出显示了一个调用栈和对应的累计数,总计 10 个样本。举例来说

func_e
func_d
func_b
func_a
1

func_b
func_a
2

func_c
func_b
func_a
7

func_a()->func_b()->func_c()这个代码路径有 7 次采样。这个代码路径显示了fun_c()正在 CPU 上运行。而 func_a()->unc_b()这个代码路径,即 func_b() 正在 CPU 上运行,被采样了 2 次。然后一个以func_e()结束的调用栈被采样了 1 次。

对应的火焰图

在这里插入图片描述

火焰图具备以下特点:

每个方块代表了调用栈中的一个函数(一个“栈帧”)

Y轴 :显示了栈的深度(栈中帧的数量),顺序是底部代表根顶部代表叶子。从下往上看时,展示的是代码执行的方向;从上往下看时,则看到的是函数的调用层次关系

X轴: 包括了全部的采样样本的数量。要注意的一点是,和一般的图不同,火焰图从左到右并不代表时间流动的方向。火焰图从左到右只是按照字母顺序排列,目的是将位于栈中同一层的函数最大化地合并。和轴的函数栈帧一起看,图的原点在左下方(和一般的图一样),表示[0,a]区间。

X轴上方块的长度确实也有它的意义:方块的长度表示了该函数在剖析文件中出现次数的比重。较长的方块所对应的函数比较短的方块所对应的函数在采样样本中出现的次数多

功能性操作

鼠标悬浮特性

原始的火焰图软件生成的 SVG 文件内置了 JavaScript,可以被加载到浏览器中,用于实现实时交互。其中的一个特性是,当鼠标指针移动到相应的栈帧上时,会有一行信息显示出来,表明该栈帧在整个剖析文件中所占的比例

缩放

可以单击栈帧实现横向缩放’。这可将较窄的栈帧展开放大,这样就能看到它们的名字。类似一个数据可视化中下转操作

搜索

使用搜索按钮,或者按 Ctr1+F 组合键,允许输入搜索关键词,命中的会以洋红色高亮显示出来,同时显示搜索命中结果在所有堆栈中所占的百分比。这就使得计算特定代码区域在整个文件中所占的比例十分容易。

如何生成火焰图?

当前实验环境

┌──[root@vms99.liruilongs.github.io]-[~]
└─$hostnamectl
   Static hostname: vms99.liruilongs.github.io
         Icon name: computer-vm
           Chassis: vm
        Machine ID: ea70bf6266cb413c84266d4153276342
           Boot ID: e09f7f3829ca4df1bea57385262eb16b
    Virtualization: vmware
  Operating System: Rocky Linux 8.9 (Green Obsidian)
       CPE OS Name: cpe:/o:rocky:rocky:8:GA
            Kernel: Linux 4.18.0-513.9.1.el8_9.x86_64
      Architecture: x86-64
┌──[root@vms99.liruilongs.github.io]-[~]
└─$

某一内核函数调用采样

stackcount工具 是一个 BPF 工具,用于通过给定频率对函数的内核堆栈进行计数。这是在内核中使用eBPF映射来实现的。只有唯一的堆栈和它们的计数被复制到用户级进行打印。

┌──[root@vms99.liruilongs.github.io]-[~]
└─$stackcount -f -P  -D 10 ktime_get > out.txt

上面的命令的意思:

  • -f、–folded:输出折叠格式
  • -P、–perpid:对每个进程分别显示栈信息
  • -D DURATION、–duration DURATION:总共跟踪的秒数
  • ktime_get: 调用函数(Linux 内核空间的系统调用,获取时钟时间)
┌──[root@vms99.liruilongs.github.io]-[~]
└─$ls
anaconda-ks.cfg  date.log  output.txt  out.txt  set.sh  SHA256SUMS
┌──[root@vms99.liruilongs.github.io]-[~]
└─$wc out.txt
  220   440 53978 out.txt

生成对应的 堆栈数据之后需要通过工具(FlameGraph)转化为火焰图

项目地址:https://github.com/brendangregg/FlameGraph

克隆项目

┌──[root@vms99.liruilongs.github.io]-[~]
└─$git clone https://github.com/brendangregg/FlameGraph.git
正克隆到 'FlameGraph'...
remote: Enumerating objects: 1285, done.
remote: Counting objects: 100% (707/707), done.
remote: Compressing objects: 100% (146/146), done.
remote: Total 1285 (delta 584), reused 575 (delta 561), pack-reused 578
接收对象中: 100% (1285/1285), 1.92 MiB | 174.00 KiB/s, 完成.
处理 delta 中: 100% (761/761), 完成.
┌──[root@vms99.liruilongs.github.io]-[~]
└─$cd FlameGraph/

通过下面的命令生成对应的 火焰图 矢量图

┌──[root@vms99.liruilongs.github.io]-[~/FlameGraph]
└─$./flamegraph.pl  --hash --bgcolors=grey <  ../out.txt > out.svg
Can't locate open.pm in @INC (you may need to install the open module) (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5) at ./flamegraph.pl line 97.
BEGIN failed--compilation aborted at ./flamegraph.pl line 97.

可以看到报错了,这个错误消息表明在运行 ./flamegraph.pl 脚本时,Perl 解释器无法找到所需的 open.pm 模块。该模块可能没有正确安装或没有包含在 Perl 解释器的模块搜索路径中。

要解决这个问题,你可以尝试以下几个步骤:

检查模块安装:确保 open.pm 模块已经正确安装。你可以使用 CPAN 或其他 Perl 模块管理工具来安装该模块。

安装模块管理器

┌──[root@vms99.liruilongs.github.io]-[~/FlameGraph]
└─$yum install perl-CPAN -y

安装模块

┌──[root@vms99.liruilongs.github.io]-[~/FlameGraph]
└─$cpan open
Loading internal null logger. Install Log::Log4perl for logging messages

CPAN.pm requires configuration, but most of it can be done automatically.
If you answer 'no' below, you will enter an interactive dialog for each
configuration option instead.

Would you like to configure as much as possible automatically? [yes] yes
CPAN: HTTP::Tiny loaded ok (v0.074)
...............
http://www.cpan.org/modules/03modlist.data.gz
Reading '/root/.cpan/sources/modules/03modlist.data.gz'
DONE
Writing /root/.cpan/Metadata
Running install for module 'open'
The most recent version "1.13" of the module "open"
is part of the perl-5.38.2 distribution. To install that, you need to run
  force install open   --or--
  install P/PE/PEVANS/perl-5.38.2.tar.gz

安装完之后提示我们需要安装对应的 perl 版本

┌──[root@vms99.liruilongs.github.io]-[~/FlameGraph]
└─$perl -v

This is perl 5, version 26, subversion 3 (v5.26.3) built for x86_64-linux-thread-multi
(with 58 registered patches, see perl -V for more detail)

Copyright 1987-2018, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

┌──[root@vms99.liruilongs.github.io]-[~/FlameGraph]
└─$yum -y install  perl -y

升级 perl 版本之后,火焰图可以正常生成

┌──[root@vms99.liruilongs.github.io]-[~/FlameGraph]
└─$./flamegraph.pl  --hash --bgcolors=grey <  ../out.txt > out.svg
┌──[root@vms99.liruilongs.github.io]-[~/FlameGraph]
└─$

下面为生成到的火焰图

在这里插入图片描述

可以看到最下层为 swapper 调用系统时间函数对应每个 VCPU,当前系统为6核,都是swapper的调用

说明系统整体 CPU 利用率很低,大部分时间都在执行 swapper 代表的 idle 等待状态。

┌──[root@vms99.liruilongs.github.io]-[~]
└─$top
top - 17:56:14 up 1 day, 10:11,  2 users,  load average: 0.00, 0.00, 0.00
Tasks: 243 total,   1 running, 242 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu4  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu5  :  0.0 us,  1.0 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   6141.5 total,   4655.9 free,    405.9 used,   1079.7 buff/cache
MiB Swap:   2068.0 total,   2068.0 free,      0.0 used.   5465.6 avail Mem

在这里插入图片描述

单击其中一个核的调用,可以查看详细调用信息,更深的颜色代表占用时间更长的函数。更浅的颜色代表占用时间较短的函数。

在这里插入图片描述

swapper任务没有实质工作,它实际代表的就是 CPU 等待工作或空闲的时间。通过统计其 CPU 时间可以评估系统负载和 CPU 使用效率。它起到了监控和统计 CPU 的作用。

全局的采样

profile(8)是一个定时采样调用栈信息并且汇报调用栈出现频率信息的 BCC 工具。该工具可以同时记录几乎所有占用CPU的代码调用栈。该工具的额外消耗几乎可以忽略不计,因为该工具是定时采样,采样频率可以随时调整。

默认情况下,该工具以49Hz的频率同时采样所有CPU的用户态和内核态的调用栈

下面的命令将30秒的采样信息输出到out.stacks01文件中,并且在输出中标记内核函数(a),-f 以折叠的方式

┌──[root@liruilongs.github.io]-[~]
└─$profile -af 30 > out.stacks01

生成对应的火焰图

┌──[root@liruilongs.github.io]-[~]
└─$cd FlameGraph/
┌──[root@liruilongs.github.io]-[~/FlameGraph]
└─$./flamegraph.pl  < ../out.stacks01  > outs.svg

指定时间的所以的调用栈信息

在这里插入图片描述

查看haproxy 相关的调用栈信息

在这里插入图片描述

查看容器运行时相关的调用栈信息

在这里插入图片描述

博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知 😃


https://www.brendangregg.com/flamegraphs.html

《BPF Performance Tools》


© 2018-2024 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1453055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Day-01-01

项目准备 项目介绍 1. 业务功能 本项目包括了用户端、机构端、运营端。 2. 技术选型 各层简要说明&#xff1a; 环境配置 1. 版本信息 在开发过程中&#xff0c;个人使用gitee作为版本控制工具。 2. 虚拟机安装说明 根据所提供资料&#xff0c;虚拟机IP地址已设置为192.1…

OpenAI Sora出炉,视频鉴赏,详细介绍,小白看过来~~立即尝试Sora,开启您的AI视频创作之旅吧!

OpenAI最新推出的视频创作的颠覆性产品&#xff1a;Sora&#xff0c;它开启了该行业的新纪元&#xff0c;吊打目前一众视频制作工具。 无论是专业人士还是爱好者&#xff0c;都可以轻松创作出高质量的视频内容。 Sora同样是一个根据文本指令创建逼真而富有想象力的场景的人工智…

图表示学习 Graph Representation Learning chapter2 背景知识和传统方法

图表示学习 Graph Representation Learning chapter2 背景知识和传统方法 2.1 图统计和核方法2.1.1 节点层次的统计和特征节点的度 节点中心度聚类系数Closed Triangles, Ego Graphs, and Motifs 图层次的特征和图的核节点袋Weisfieler–Lehman核Graphlets和基于路径的方法 邻域…

Flex布局简介及微信小程序视图层View详解

目录 一、Flex布局简介 什么是flex布局&#xff1f; flex属性 基本语法和常用属性 Flex 布局技巧 二、视图层View View简介 微信小程序View视图层 WXML 数据绑定 列表渲染 条件渲染 模板 WXSS 样式导入 内联样式 选择器 全局样式与局部样式 WXS 示例 注意事项…

阅读笔记(SOFT COMPUTING 2018)Seam elimination based on Curvelet for image stitching

参考文献&#xff1a; Wang Z, Yang Z. Seam elimination based on Curvelet for image stitching[J]. Soft Computing, 2018: 1-16. 注&#xff1a;SOFT COMPUTING 大类学科小类学科Top期刊综述期刊工程技术 3区 COMPUTER SCIENCE, ARTIFICIAL INTELLIGENCE 计算机&#xf…

二次元风格404页面源码

大气二次元风格带背景音乐404页面模板 蓝奏云&#xff1a;https://wfr.lanzout.com/ivaYi1odtjhe

中科院一区论文复现,改进蜣螂算法,Fuch映射+反向学习+自适应步长+随机差分变异,MATLAB代码...

本期文章复现一篇发表于2024年来自中科院一区TOP顶刊《Energy》的改进蜣螂算法。 论文引用如下&#xff1a; Li Y, Sun K, Yao Q, et al. A dual-optimization wind speed forecasting model based on deep learning and improved dung beetle optimization algorithm[J]. Ener…

Docker容器运行

1、通过--name参数显示地为容器命名&#xff0c;例如:docker run --name “my_http_server” -d httpd 2、容器重命名可以使用docker rename。 3、两种进入容器的方法&#xff1a; 3.1、Docker attach 例如&#xff1a; 每间隔一秒打印”Hello World”。 Sudo docker run…

高程 | 类与对象(c++)

文章目录 &#x1f4da;面向对象程序设计的基本特点&#x1f407;抽象——概括问题&#xff0c;抽出公共性质并加以描述。&#x1f407;封装——将抽象所得数据和行为相结合&#xff0c;形成一个有机的整体&#xff0c;形成“类”。&#x1f407;继承——在原有类特性的基础上&…

小白必看,总结前端所有主流的构建工具,webpack / vite / roollup / esbuild,包含源码,建议关注+收藏

前言 本篇文章旨在总结前端常见的构建工具&#xff0c;构建工具是前端工程化中的重要的组成部分。 在实际项目中&#xff0c;我们初始化项目&#xff0c;一般是使用脚手架命令一键生成的&#xff0c;比如说使用 create-vue 初始化 vue 项目的时候&#xff0c;就会默认使用 vi…

高效宣讲管理:Java+SpringBoot实战

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Stable Diffusion 模型下载:Beautiful Realistic Asians(美丽真实的亚洲人)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 Beautiful Realistic Asians&#xff08;BRA&#xff09;模型是由作者自己训练…

流程结构

章节目录&#xff1a; 一、选择结构1.1 if 语句1.2 if...else 语句1.3 嵌套 if1.4 if...else if...else1.5 三目运算符1.6 switch 语句 二、循环结构2.1 while 语句2.2 do...while 语句2.3 for 语句2.4 嵌套循环 三、跳转语句3.1 break 语句3.2 continue 语句3.3 goto 语句 四、…

OpenAI 发布 Sora,可快速生成视频

作者&#xff1a;苍何&#xff0c;前大厂高级 Java 工程师&#xff0c;阿里云专家博主&#xff0c;CSDN 2023 年 实力新星&#xff0c;土木转码&#xff0c;现任部门技术 leader&#xff0c;专注于互联网技术分享&#xff0c;职场经验分享。 &#x1f525;热门文章推荐&#xf…

点亮代码之灯,程序员的夜与电脑

在科技的海洋里&#xff0c;程序员是那些驾驶着代码船只&#xff0c;穿梭于虚拟世界的探险家。他们手中的键盘是航行的舵&#xff0c;而那台始终不愿关闭的电脑&#xff0c;便是他们眼中永不熄灭的灯塔。有人说&#xff0c;程序员不喜欢关电脑&#xff0c;这究竟是为什么呢&…

Rust 学习笔记 - 注释全解

前言 和其他编程语言一样&#xff0c;Rust 也提供了代码注释的功能&#xff0c;注释用于解释代码的作用和目的&#xff0c;帮助开发者理解代码的行为&#xff0c;编译器在编译时会忽略它们。 单行注释 单行注释以两个斜杠 (//) 开始&#xff0c;只影响它们后面直到行末的内容…

阿里云服务器租用价格 2024年新版活动报价及租用收费标准

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

模拟电子技术——同相比例运算放大电路、反向运算比例放大电路、反向加法器电路、差分减法器电路

文章目录 一、同相比例运算放大电路什么是比例运算放大电路线性区与非线性区电压跟随器 二、反向运算比例放大电路什么是反比例运算放大器电路及特点 三、反向加法器电路什么是反向加法器电路及特点及参数计算电路及特点及参数计算 四、差分减法器电路什么是差动减法器 总结 提…

备战蓝桥杯---图论之建图基础

话不多说&#xff0c;直接看题&#xff1a; 首先&#xff0c;这个不是按照字典序的顺序&#xff0c;而是以只要1先做&#xff0c;在满足后让2先做。。。。 就是让数字小的放前面做拓扑排序。 我们可以先做1&#xff0c;看看它的前驱。 举个例子&#xff1a; 我们肯定要把1放…

BIOS and UEFI

BIOS : Basic Input/Output System UEFI: Unified Extensible Firmware Interface Notes: 1. 两者都是主板上的firmware. 2. 两者的作用都包括开机后检查硬件&#xff0c;从硬盘上寻找bootloader(用于加载操作系统&#xff0c;例如GRUB). # 操作系统的启动过程&#xff1a…