火焰图性能监测

准备工作——安装perf

我是在github的codespace上搞的,可以按下面的方式安装perf:

sudo apt install linux-tools-generic
sudo apt install linux-cloud-tools-azure

参考在WSL2中使用perf性能剖析工具

测试程序——简单的C程序

弄一个无限循环的C程序进行测试:

// main.c
#include<stdio.h>int add(int a, int b){ return a + b; }int sub(int a, int b){ return a - b; }int main(){while(1){sub(add(3, 4), 5);}return 0;
}

编译成可执行文件gcc main.c -o main并运行。
获取这个进程的pid,用htop命令查看一下./main对应的进程:
在这里插入图片描述
这里对应的pid是19647

监测并生成火焰图

使用perf程序进行监测:

sudo perf record -F 99 -p 19647 -a -g -- sleep 10 

这里将采样频率设置为99次/秒,最高好像是100次,为保证准确,一般设置为99次。

该命令会生成perf.data文件,记录了进程的函数调用情况,随后从github将FlameGraph克隆到本地,执行如下命令:

sudo perf script > out.perf
../FlameGraph/stackcollapse-perf.pl out.perf > out.folded
./FlameGraph/flamegraph.pl out.folded > "./flamegraph.svg"

生成的./flamegraph.svg可以在vscode中使用扩展SVG进行预览,右击./flamegraph.svg进行预览就出来了,还是很方便的。

生成火焰图如下:

我们的主要函数依然是main,add,sub,在编译的过程中,他们的名称可能改变,比如C++中可能会添加前缀或下划线什么的。其中add和sub函数占用最多的计算资源,两者的比例分别为24.69%和30.04%,采样次数分别为2,293,939,370次和3,494,949,460次,在以效率著称的C语言中这很明显。

后面我测了一下python,相同的代码,add和sub分别被改名为long_add和long_sub,而两者占用的时间比例仅为1.12%和1.22%!!!采样次数分别为111,111,110次和131,313,130次。这里采样的时间是相同的,均为10s。python做了挺多额外工作的,毕竟是解释型语言,python脚本并不直接作为程序,而是作为解释器的一部分(不过也可以用编译的方式来运行)。

python程序用perf生成的火焰图里面的名字会变得很奇怪,甚至不知道对应的是什么函数,用py-spy工具会好一些。这个工具很方便,通过pip install py-spy即可安装,然后通过py-spy record --pid 130526 -o out.svg 就可以直接生成火焰图,很便捷。

这里要注意以下采样次数的意思,类似于频率的意思,采样是每隔一小段时间观测一下,如果这次观测中监测到了sub函数,则sub函数的次数加一。sub(3,494,949,460 samples, 30.04%),表示在10s内遇到过这个函数3,494,949,460次。由于是隔一段时间采样一下,所以难免有遗漏,但在大量的采用中还是具有统计意义的。

这在add和sub函数之后还有一些冒尖的函数,放大左右两边冒尖的函数情况如下:
在这里插入图片描述
虽然我们的C测试程序主要是main,add,sub三个函数,但编译链接的过程中,会将其他相关的包链接到程序中,使程序中的符号增加。所以程序执行的过程中,还会涉及到其他的一些函数,比如上面的asm_sysvec_reschedule_ipi 用于处理系统调度的中断处理函数。它负责在特定的时间间隔内触发调度器,使得其他进程有机会运行。
exit_to_user_mode_prepare用于准备切换到用户模式的操作。在操作系统中,内核和用户模式之间的切换需要进行一些准备工作,这个函数就负责执行这些准备操作。

因为这个进程是开始一段时间后再监测的,所以有一些函数没有抓取到,通过readelf命令,我们可以看到main可执行文件中涉及到的所有符号:

$ readelf main -sSymbol table '.dynsym' contains 6 entries:Num:    Value          Size Type    Bind   Vis      Ndx Name0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 1: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTab2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.2.5 (2)3: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__4: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable5: 0000000000000000     0 FUNC    WEAK   DEFAULT  UND __cxa_finalize@GLIBC_2.2.5 (2)Symbol table '.symtab' contains 64 entries:Num:    Value          Size Type    Bind   Vis      Ndx Name0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 1: 0000000000000318     0 SECTION LOCAL  DEFAULT    1 2: 0000000000000338     0 SECTION LOCAL  DEFAULT    2 ...58: 0000000000004010     0 NOTYPE  GLOBAL DEFAULT   24 __bss_start59: 0000000000001157    37 FUNC    GLOBAL DEFAULT   14 main60: 0000000000004010     0 OBJECT  GLOBAL HIDDEN    23 __TMC_END__61: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable62: 0000000000001141    22 FUNC    GLOBAL DEFAULT   14 sub63: 0000000000000000     0 FUNC    WEAK   DEFAULT  UND __cxa_finalize@@GLIBC_2.2

如果要了解进程更详细的情况,还可以去/proc文件夹下面看看,每个进程都建立了对应的一个文件夹,文件夹名称对应进程的pid。
比如通过ll /proc/19647/cwd可以查看该进程的工作目录,通过ll /proc/19647/exe可以查看该进程对应的执行文件。

最后,为便于下次使用,我将生成火焰图的过程整理成脚本perf.sh,直接执行bash perf.sh pid就好了,生成的火焰图文件名为flamegraph_pid_$pid.svgperf.sh脚本内容如下:

#!/bin/bash# Check if the number of arguments is correct
if [ $# -ne 1 ]; thenecho "Usage: $0 <pid>"exit 1
fipid=$1
mkdir -p temp# Check if FlameGraph folder exists
if [ ! -d "FlameGraph" ]; then# Clone FlameGraph repositorygit clone https://github.com/brendangregg/FlameGraph.git
ficd temp || exit
sudo perf record -F 99 -p $pid -a -g -- sleep 10 
sudo perf script > out.perf
current_time=$(date + "%Y%m%d%H%M%S")
mv perf.data "perf_pid_${pid}_$current_time.data"../FlameGraph/stackcollapse-perf.pl out.perf > out.folded
../FlameGraph/flamegraph.pl out.folded > "../flamegraph_pid_$pid.svg"

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络安全带你练爬虫-100练】第13练:文件的创建、写入

目录 目标&#xff1a;将数据写入到文件中 网络安全O 目标&#xff1a;将数据写入到文件中 开干 &#xff08;始于颜值&#xff09;打开一个&#xff0c;没有就会创建 with open(data.csv, modew, newline) as file: &#xff08;忠于才华&#xff09;开始写入数据 writer cs…

Pytorch:搭建卷积神经网络完成MNIST分类任务:

2023.7.18 MNIST百科&#xff1a; MNIST数据集简介与使用_bwqiang的博客-CSDN博客 数据集官网&#xff1a;MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges MNIST数据集获取并转换成图片格式&#xff1a; 数据集将按以图片和文件夹名为标签的…

SpringBoot 整合 RabbitMQ demo

Rabbit Windows安装教程 本文只做Demo案例的分享&#xff0c;具体只是需自行百度 一、生产者 1.application.properties 配置Rabbit的基本信息 #rabbit 主机IP spring.rabbitmq.host127.0.0.1 #rabbit 端口 spring.rabbitmq.port5672 #rabbit 账号 可自行创建 这里是默认的 …

排序算法的补充

建议先去看看我之前写的基础排序算法 补充一&#xff1a;快排中partition函数的三种实现形式 1.hoare法---与第2种方法类似 int Partition1(int*a,int left,int right) {int keyi left;while (left < right) {while (left < right && a[right] > a[keyi])…

Hadoop 之 HDFS 伪集群模式配置与使用(二)

HDFS 配置与使用 一.HDFS配置二.HDFS Shell1.默认配置说明2.shell 命令 三.Java 读写 HDFS1.Java 工程配置2.测试 一.HDFS配置 ## 基于上一篇文章进入 HADOOP_HOME 目录 cd $HADOOP_HOME/etc/hadoop ## 修改文件权限 chown -R root:root /usr/local/hadoop/hadoop-3.3.6/* ## …

C++-string类的模拟实现

本博客基于C官方文档当中给出的string类当中的主要功能实现&#xff0c;来作为参照&#xff0c;简单模拟实现 My-string 。 对于C当中的string类的介绍&#xff0c;在之前的几篇博客当中有说明&#xff0c;如有问题&#xff0c;请参照一下两个博客文章进行参考&#xff1a; (2…

ERROR: Invalid requirement: ‘==‘ 解决python报错

ERROR: Invalid requirement: 错误:无效的要求: 今天安装 selenium包时突然触发这个报错&#xff0c;这个错误通常出现在使用pip安装Python包时&#xff0c;报错的原因是需要注意的是前后没有空格&#xff0c;若是加空格就会出现上述报错。 例如&#xff1a; 安装指定版本的…

python与深度学习(一):ANN和手写数字识别

目录 1. 神经网络2. 线性回归3. 激活函数3.1 Sigmoid函数3.2 Relu函数3.3 Softmax函数 4. ANN(全连接网络)模型结构5. 误差函数5.1 均方差误差函数5.2 交叉熵误差函数 6. 手写数字识别实战6.1 工具说明6.2 导入相关库6.3 加载数据6.4 数据预处理6.5 数据处理6.6 构建网络模型6.…

nginx+lua+redis环境搭建(文末赋上脚本)

目录 需求背景 环境搭建后nginx和redis版本 系统环境 搭建步骤 配置服务器DNS 安装ntpdate同步一下系统时间 安装网络工具、编译工具及依赖库 创建软件包下载目录、nginx和redis安装目录 下载配置安装lua解释器LuaJIT 下载nginx NDK&#xff08;ngx_devel_kit&#xff09…

Vue3警告提示(Alert)

可自定义设置以下属性&#xff1a; 警告提示内容&#xff08;message&#xff09;&#xff0c;类型&#xff1a;string | slot&#xff0c;默认&#xff1a;‘’警告提示的辅助性文字介绍&#xff08;description&#xff09;&#xff0c;类型&#xff1a;string | slot&#…

libvirt 热迁移流程及参数介绍

01 热迁移基本原理 1.1 热迁移概念 热迁移也叫在线迁移&#xff0c;是指虚拟机在开机状态下&#xff0c;且不影响虚拟机内部业务正常运行的情况下&#xff0c;从一台宿主机迁移到另外一台宿主机上的过程。 1.2 虚拟机数据传输预拷贝和后拷贝 预拷贝(pre-copy)&#xff1a; …

Git及Tortoisegit使用教程,设置中文

一、到git官网下载GIT 官网 二、下载安装Tortoisegit及中文语言包,Tortoisegit及语言包 语言包下载地址 三、在电脑某个盘的文件里右键 提示未设置git.exe 路径不能继续, 于是去下载git GIT下载 安装Git时, 一直点击 Next > 不要停, 直到结束 此时再跳到TortoiseGit…