当前位置: 首页 > news >正文

Linux 浅谈之性能分析工具 perf

Linux 浅谈之性能分析工具 perf

HELLO,各位博友好,我是阿呆 🙈🙈🙈

这里是 Linux 浅谈系列,收录在操作系统专栏中 😜😜😜

本系列将记录一些阿呆个人整理的 OS 相关知识 🏃🏃🏃

OK,兄弟们,废话不多直接开冲 🌞🌞🌞


一 🏠 概述

什么是 PERF

perf 是一个 Linux 性能分析工具,它利用 PMU、tracepoint 和内核计数器来进行性能统计

内核计数器是一个基于内核的子系统,它提供一个性能分析框架,比如硬件(CPU、PMU( Performance Monitoring Unit ) 功能和软件 (软件计数器、tracepoint) 功能


什么是 PMU

性能监视单元(Performance Monitor Unit),CPU 提供的一个单元(硬件),通过访问相关寄存器读取 CPU 的一些性能数据

内存读写很快,但是无法和处理器指令执行速度相比。cache 是一种 SRAM,读写速度非常快,能和处理器相匹配。因此将常用的数据保存在 cache 中,处理器便无需等待,从而提高性能


tracepoints

tracepoints 是内核源码中的一些 hook,在特定代码被执行时触发,该特性可被各种trace/debug 工具所使用

perf 将 tracepoint 时间记录下来,生成报告,分析这些报告,调优人员便可以了解程序运行期间内核的各种细节,tracepint 对应的 sysfs 节点在 /sys/kernel/debug/tracing/events 目录

PERF 整体架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WGmW4F2f-1677034090822)(E:\2022年MD文档\2023 年 MD文档\二月\操作系统\Linux 浅谈之性能分析工具 perf.assets\1676896375395.png)]


二 🏠 核心

PERF 使用

事件分为三种

  • Hardware Event PMU 部件产生,探测性能事件的发生次数(如 cache 命中)
  • Software Event 内核产生,统计和操作系统性能相关事件(如 进程切换)
  • Tracepoint Event 静态 tracepoint 触发事件(判断程序运行期内核行为,分配器分配次数)

perf --help 可看到 perf 二级命令


perf list

perf list查看当前系统支持的性能事件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xa9XIrMe-1677034090823)(E:\2022年MD文档\2023 年 MD文档\二月\操作系统\Linux 浅谈之性能分析工具 perf.assets\1676897086463.png)]


perf top

perf top 类似 top 命令,实时分析各函数在某性能事件的热度,快速定位热点函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z0F26RBE-1677034090824)(E:\2022年MD文档\2023 年 MD文档\二月\操作系统\Linux 浅谈之性能分析工具 perf.assets\1676897154333.png)]


perf stat

用于输出指定程序的性能统计数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yLFgteQJ-1677034090824)(E:\2022年MD文档\2023 年 MD文档\二月\操作系统\Linux 浅谈之性能分析工具 perf.assets\1676897212741.png)]


perf record

perf record 收集采样信息,并记录在文件中,可离线分析

常用方式 perf record

-e 指定事件

-p 指定进程

-g 生成调用关系(类似gcc中-g)

-o 输出文件名


更多参数参考 perf record --help

perf report

perf report 分析 perf record 生成的 perf.data 文件

常用参数:-i:指定输入文件


火焰图制作与解读

火焰图是基于 perf 结果产生的 SVG 图片,用来展示 CPU 的调用栈

y 轴表示调用栈,每一层是一个函数,调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数

x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长(x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的)

火焰图就是看顶层的哪个函数占据的宽度最大。只要有 平顶,就表示该函数可能存在性能问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uygcmEr3-1677034090825)(E:\2022年MD文档\2023 年 MD文档\二月\操作系统\Linux 浅谈之性能分析工具 perf.assets\1676897438542.png)]


常用操作

先用 top -Hp + 进程号
执行 SQL, 占用 CPU 最高的那个线程号应该就是要抓的线程
用 perf record -g --call-graph dwarf -e cpu-clock -F 1000 -t 线程号 -o perf.data 
抓取, 等 SQL 结束 ctrl + c 结束掉
用 perf report -i perf.data --no-ch //查看data文件内容

三 🏠 结语

身处于这个浮躁的社会,却有耐心看到这里,你一定是个很厉害的人吧 👍👍👍

各位博友觉得文章有帮助的话,别忘了点赞 + 关注哦,你们的鼓励就是我最大的动力

博主还会不断更新更优质的内容,加油吧!技术人! 💪💪💪

http://www.lryc.cn/news/16024.html

相关文章:

  • 代码随想录-Day7:四数相加、三数之和
  • jsp在线考试系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • 【总结】2023数学建模美赛!收官!
  • C# GDI+ winform绘图知识总结
  • 【研究空间复用及函数调用问题】
  • SQL常用查询语句
  • 【Python实战】一大波高颜值主播来袭:快看,某网站颜值排名,为了这个排名我可是大费周章啦,第一名不亏是你...(人脸检测+爬虫实战)
  • Linux进程学习【三】
  • Spring自动装配的底层逻辑
  • 华为OD机试 - 数组合并(C++) | 附带编码思路 【2023】
  • 在vue3+ts的项目中,如何解决vant组件自带表单校验不生效?
  • 华为OD机试真题Python实现【子序列长度】真题+解题思路+代码(20222023)
  • 【答疑现场】我一个搞嵌入式的,有必要学习Python吗?
  • MySQL存表报错问题 Incorrect string value
  • SAP ABAP DIALOG长文本编辑框
  • 电子技术——负反馈特性
  • 网站移动端性能优化方法
  • 2023年AI语音会议汇总
  • Mybatis持久层框架 | Mapper加载方式、目录结构解析
  • 九龙证券|创业板向未盈利企业敞开大门 考验投行估值定价能力
  • 「TCG 规范解读」第12章 TPM工作组 TCG身份验证研讨
  • Logstash:在 Logstash 管道中的定制的 Elasticsearch update by query
  • Spring Cloud Kubernetes环境下使用Jasypt
  • Kotlin-面向对象
  • 循环、函数、对象——js基础练习
  • 精确控制 AI 图像生成的破冰方案,ControlNet 和 T2I-Adapter
  • 让师生“不跑腿”,教育数据治理究竟有何魔力
  • 力扣-寻找用户推荐人
  • mmdetection测试阶段
  • 【无标题】10.货币系统