火焰图性能监测

news2024/11/28 8:30:43

准备工作——安装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程序用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 -s

Symbol table '.dynsym' contains 6 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTab
     2: 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_registerTMCloneTable
     5: 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 Name
     0: 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_start
    59: 0000000000001157    37 FUNC    GLOBAL DEFAULT   14 main
    60: 0000000000004010     0 OBJECT  GLOBAL HIDDEN    23 __TMC_END__
    61: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable
    62: 0000000000001141    22 FUNC    GLOBAL DEFAULT   14 sub
    63: 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 ]; then
    echo "Usage: $0 <pid>"
    exit 1
fi

pid=$1
mkdir -p temp

# Check if FlameGraph folder exists
if [ ! -d "FlameGraph" ]; then
    # Clone FlameGraph repository
    git clone https://github.com/brendangregg/FlameGraph.git
fi

cd 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.coloradmin.cn/o/763916.html

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

相关文章

SpringMVC的数据响应-19

新的上面也是相当于放到域当中了 sel表达式&#xff0c;取你键值对的名称&#xff0c;使用前创造jsp文件 这个地域里面放什么都行 上面的内容也是ModelandView弄个文件记下来 1、新的方法&#xff0c;你在参数这里可以加一个ModelandView 往里面放点数据和视图名称 这种方法也能…

【hadoop】centos7.6+hadoop3.1.1搭建分布式hadoop环境——包含各类问题解决方案

本文针对centos7.4即以上版本的hadoop环境搭建&#xff0c;因为这部分搭建是个很复杂且很容易出错的内容&#xff0c;所以在结合了多种搭建方案后给出最适宜当前版本的搭建。 目录 一、准备阶段环境要求软件版本要求配置部署环境 二、部署阶段部署ZooKeeper安装ZooKeeper并配置…

华为云CodeArts Check代码检查新手操作指南

代码检查服务是基于云端实现代码质量管理的服务&#xff0c;软件开发者可在编码完成后执行多语言的代码静态检查和安全检查&#xff0c;获取全面的质量报告&#xff0c;并提供缺陷的分组查看与改进建议&#xff0c;有效管控代码质量&#xff0c;确保产品原生高质量和产品安全&a…

【文末福利】我用英飞凌的PSoC™ 62搞了点智能家居的创意

【英飞凌创意创客大赛】基于Infineon和ChatGPT的人工智能语音小管家 概要 本文给大家介绍一个Infineon和ChatGPT的人工智能语音小管家项目&#xff0c;该项目是博主架构师李肯参加由RT-Thread与英飞凌联合举办的2023英飞凌创意创客大赛的参赛项目&#xff0c;旨在探索智能硬件智…

微服务day1

一、认识微服务 1、单体架构 将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署。 优点 架构简单部署成本低 缺点 耦合度高 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fPfsQXAn-1689593800699)(https://picture.wangkay.tec…

GPT-1,GPT-2,GPT-3 InstructGPT论文学习笔记

Gpt-1 论文&#xff1a;《Improving Language Understanding by Generative Pre-Training》 GPT-1网络结构 无监督,使用12层transforer decoder结构,每一层维度是768,12个注意力heads token embedding矩阵,经过transformer decoder处理后,经过线性层和softmax层,得到下一个toke…

自定义一个SpringBoot starter 怎么实现

文章目录 1、创建一个空项目2、在新建的空项目中添加starter模块3、添加autoconfigure模块4、配置starter模块的pom文件5、配置autoconfigure模块1. 配置pom依赖2、创建xxProperties配置类3、创建服务提供类xxxService4、创建自动配置类xxxGenerateAutoConfiguration5 、META-I…

pgrouting 管线 联通分析

背景描述 啦啦啦啦&#xff0c;然后拉拉阿里&#xff0c;然后啦啦啦&#xff0c;最后就写了这个记录一下 数据准备 1 管线数据 数据要求&#xff08;拓扑检查&#xff09; 数据没有重叠要求 数据悬挂点问题得到合理结局&#xff0c;不存在数据连接点不一样的线 数据能按…

C. Fighting Tournament - 模拟+思维

分析&#xff1a; 每次两个数比较&#xff0c;大的留下&#xff0c;小的放后面&#xff0c;可以发现只要最大的到了第一位就只能是它赢&#xff0c;因此统计第一次遍历所有数组元素的赢的次数&#xff0c;如果查询是最大的数呢么就在加上k-n&#xff0c;赛时代码写的一团乱&…

适合投资者的交易策略,4步找到

在外汇交易市场中&#xff0c;根据市场情况和个人投资目标&#xff0c;制定灵活的交易策略是至关重要的。Forexclub认为投资者可以通过结合多种交易策略&#xff0c;打造出全面、科学且适合自己的外汇交易策略。 首先&#xff0c;基于技术指标的交易策略是判断市场趋势和转折点…

「数字化制造」 是如何让制造过程信息化的?

「数字化制造」 是如何让制造过程信息化的&#xff1f; 数字化制造是指利用数字技术和信息化手段来实现制造过程的智能化、自动化和高效化。 它通过将传感器、物联网、云计算、大数据分析、人工智能等先进技术与制造业相结合&#xff0c;实现生产过程的数字化、网络化和智能化…

【原创】实现ChatGPT中Transformer模型之Encoder-Decoder

作者&#xff1a;黑夜路人 时间&#xff1a;2023年7月 Transformer Block &#xff08;通用块&#xff09;实现 看以上整个链路图&#xff0c;其实我们可以很清晰看到这心其实在Encoder环节里面主要是有几个大环节&#xff0c;每一层主要的核心作用如下&#xff1a; Multi-he…

Flask 分页Demo

项目结构 app.py from flask import Flask, render_template, requestapp Flask(__name__)books [{title: Book 1, author: Author 1, year: 2020},{title: Book 2, author: Author 2, year: 2021},{title: Book 3, author: Author 3, year: 2022},{title: Book 4, author: …

《面试1v1》面试官让我讲一下Kafka的性能哪里好

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

公钥加密之『迪菲–赫尔曼密钥交换』,颜色混合的把戏

前奏&#xff1a; 迪菲-赫尔曼密钥交换是一种安全协议。它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。 颜色混合&#xff1a; 如图所示&#xff0c;蛇和老鼠要交换一个共享密钥&…

Springboot热部署相关功能

文章目录 前言一、Springboot如何在IDEA中开启热部署二、热部署的相关知识1.热部署的范围2.关闭热部署 前言 环境是Mac电脑下的IDEA 2023.1.X版本 如何在修改程序后自动进行加载修改后的程序而不是重启加载所有资源而更新程序&#xff0c;这就使用到了Springboot相关的热部署功…

120页商业银行企业级IT架构规划ppt

导读&#xff1a;原文《商业银行企业级IT架构规划ppt》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式&#xff1a; 如需获取完整的电…

2023年7月17日,比较器,TreeMap底层,LinkedHashMap,Set接口

比较器 Comparator是外部比较器&#xff0c;用于比较来对象与对象之间的&#xff0c;两个对象进行比较&#xff0c;多用于集合排序 Comparable可以认为是一个内比较器&#xff0c;根据对象某一属性进行排序的。 1. 使用场景 ​ 内置比较器&#xff08;Comparable&#xff09;的…

Windows10下ChatGLM2-6B模型本地化安装部署教程图解

随着人工智能技术的不断发展&#xff0c;自然语言处理模型在研究和应用领域备受瞩目。ChatGLM2-6B模型作为其中的一员&#xff0c;以其强大的聊天和问答能力备受关注&#xff0c;并且最突出的优点是性能出色且轻量化。然而&#xff0c;通过云GPU部署安装模型可能需要支付相应的…

手把手带你创建微服务项目

1.先创建以下项目结构 2.在父项目中导入以下依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- Web依赖 --><dependency>&l…