使用 perf 工具进行性能分析

1、perf简介

perf 是 Linux 内核自带的一个性能分析工具,它能够采集和分析系统和应用程序的性能数据。perf 是基于 Linux 内核的性能计数器(Performance Counters)实现的,通过它可以收集大量关于 CPU、内存、I/O 等方面的信息。perf 支持多种分析模式,如采样(Sampling)、跟踪(Tracing)、事件计数等。perf 工具的关键功能如下:

  • CPU 性能计数:收集 CPU 周期、指令、缓存访问等信息。
  • 调用图分析:分析函数调用的频率、调用链和性能瓶颈。
  • 时间跟踪:对程序的执行时间进行精确分析。
  • 内存访问:分析内存访问模式,如缓存命中率、内存带宽使用等。
  • 事件跟踪:支持跟踪不同事件,如系统调用、进程调度等。

2、perf安装

大多数现代 Linux 发行版都已预装 perf 工具。如果你的系统中没有安装 perf,可以通过以下命令进行安装:

sudo apt update
sudo apt install linux-tools-common linux-tools-$(uname -r)

3、perf的基本使用

3.1、查看CPU性能计数器

最简单的 perf 命令之一是查看 CPU 性能计数器信息。可以使用 perf stat 命令来收集一些基本的统计信息:

perf stat ls

上面的命令会执行 ls 命令并输出 CPU 使用情况,如周期数、指令数、缓存命中率等。

 Performance counter stats for 'ls':1.615207      task-clock (msec)         #    0.999 CPUs utilized          1,234,568      context-switches          #    0.764 K/sec                  567,876      CPU-migrations            #    0.351 K/sec                  100,056,789    page-faults               #    61.92 K/sec                  2,456,789,123  cycles                    #    1.517 GHz                   1,234,567,890  instructions              #    0.50  insns per cycle        345,678,901  branches                  #    213.12 M/sec                 123,456,789  branch-misses             #    35.66% of all branches       0.001500123 seconds time elapsed

常见的统计项包括:

  • task-clock:任务执行时间
  • cycles:CPU周期数
  • instructions:指令数
  • branches:分支指令数
  • branch-misses:分支预测失败的次数
  • page-faults:页面错误数

3.2、查看系统调用和事件

如果你想查看某个程序的系统调用,可以使用 perf trace 命令。例如:

perf trace ./my_program

该命令会列出 my_program 程序执行时的系统调用,类似于 strace,但是 perf trace 会提供更多的性能分析信息。

3.3、调用图

perf 还支持生成调用图,可以帮助我们了解函数调用的情况。使用 perf record 进行采样,然后通过 perf report 查看调用图。

perf record -g ./my_program
perf report

-g 选项启用了调用图的采样。执行 perf report 后,您可以看到函数调用图,并找出可能的性能瓶颈

3.4、分析热点函数

假设我们需要分析某个程序中最耗时的函数。可以通过 perf record 和 perf report 获得:

perf record -e cycles -a -- sleep 10
perf report

上面命令会记录所有 CPU 上的周期,并且在执行 10 秒后生成报告。在报告中,可以查看哪些函数消耗了最多的 CPU 周期。

4、perf进阶使用

4.1、跟踪特定事件

perf 支持多种硬件和软件事件,可以通过 -e 参数指定感兴趣的事件。例如,监控指令计数和缓存命中率:

perf stat -e instructions,cache-references,cache-misses ls

常见的性能事件包括:

  • instructions:执行的指令数
  • cycles:CPU 周期
  • cache-references:缓存访问次数
  • cache-misses:缓存未命中的次数

4.2、CPU级别性能分析

有时候,CPU 上的性能问题会影响整个系统的表现。perf 可以帮助我们分析 CPU 级别的事件。例如,查看 CPU 使用率、上下文切换等:

perf stat -e cpu-clock,task-clock,cpu-migrations,context-switches -a

此命令会实时显示系统级的 CPU 性能数据,包括上下文切换和 CPU 迁移情况。

4.3、分析多进程

perf 也支持多进程的性能分析。例如,分析整个系统中所有进程的性能:

perf stat -a -e cycles,instructions,cache-references,cache-misses

通过上述命令,perf 将会显示系统所有进程的性能数据,包括 CPU 周期、指令数、缓存访问

5、perf输出分析

perf 的输出通常包含很多细节,理解这些数据对性能分析至关重要。我们可以从以下几个方面分析输出结果:

  • CPU 周期与指令数,通过比较 cycles 和 instructions 可以计算指令的执行效率。如果 instructions 远少于 cycles,意味着 CPU 的利用率不高,可能是由于分支预测失败、内存延迟等问题
  • 缓存命中率,通过查看 cache-references 和 cache-misses,可以判断缓存命中率。如果缓存未命中过多,说明程序的内存访问模式不够友好,可能导致性能瓶颈
  • 上下文切换和 CPU 迁移,频繁的上下文切换和 CPU 迁移通常会导致性能下降。这些问题可能是由于锁竞争、IO 阻塞等原因造成的

6、总结

perf 是一个功能强大的性能分析工具,可以帮助开发人员从多个维度进行系统和应用程序的性能分析。通过掌握 perf 的基本命令和高级功能,开发者可以更高效地定位性能瓶颈,优化系统的运行效率。

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

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

相关文章

知识中台与人工智能:融合赋能企业智能化知识服务与决策

在数字化、智能化的时代背景下,企业面临着前所未有的机遇与挑战。为了提升知识管理与服务的能力,推动企业的智能化转型与发展,知识中台与人工智能的融合应用正成为新的趋势。知识中台作为连接数据、知识与业务的核心平台,能够为企…

《Web 项目开发之旅》

一、项目简介 介绍项目的背景与目标,说明为什么要开展这个 Web 项目。展示项目最终完成后的整体页面截图,让读者对项目外观有初步印象。 二、技术选型 阐述在项目中使用的前端技术(如 HTML、CSS、JavaScript 框架等)、后端技术…

VSCode搭建Java开发环境 2024保姆级安装教程(Java环境搭建+VSCode安装+运行测试+背景图设置)

名人说:一点浩然气,千里快哉风。—— 苏轼《水调歌头》 创作者:Code_流苏(CSDN) 目录 一、Java开发环境搭建二、VScode下载及安装三、VSCode配置Java环境四、运行测试五、背景图设置 很高兴你打开了这篇博客,更多详细的安装教程&…

【GIS教程】使用GDAL实现栅格转矢量(GeoJSON、Shapefile)- 附完整代码

文章目录 一、 应用场景1、GeoJSON2、ESRI Shapefile3、GDAL 二、基本思路1、数据准备2、重投影(可选)3、创建空的矢量图层4、栅格转矢量 三、完整代码四、总结五、拓展(使用ArcGIS工具进行栅格转矢量) 一、 应用场景 TIFF格式的…

计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

JVM系列(十三) -常用调优工具介绍

最近对 JVM 技术知识进行了重新整理,再次献上 JVM系列文章合集索引,感兴趣的小伙伴可以直接点击如下地址快速阅读。 JVM系列(一) -什么是虚拟机JVM系列(二) -类的加载过程JVM系列(三) -内存布局详解JVM系列(四) -对象的创建过程JVM系列(五) -对象的内存分…

Hive其四,Hive的数据导出,案例展示,表类型介绍

目录 一、Hive的数据导出 1)导出数据到本地目录 2)导出到hdfs的目录下 3)直接将结果导出到本地文件中 二、一个案例 三、表类型 1、表类型介绍 2、内部表和外部表转换 3、两种表的区别 4、练习 一、Hive的数据导出 数据导出的分类&…

使用RKNN进行YOLOv8人体姿态估计的实战教程:yolov8-pose.onnx转yolov8-pose.rknn+推理全流程

之前文章有提到“YOLOv8的原生模型包含了后处理步骤,其中一些形状超出了RK3588的矩阵计算限制,因此需要对输出层进行一些裁剪”,通过裁剪后得到的onnx能够顺利的进行rknn转换,本文将对转rnkk过程,以及相应的后处理进行阐述。并在文末附上全部源码、数据、模型的百度云盘链…

怎么用Java写一个数据库?详细的步骤流程

在 Java 中编写一个与数据库交互的程序通常涉及以下几个步骤: 选择数据库和驱动:首先需要选择一个数据库(如 MySQL、PostgreSQL、SQLite 等),并确保安装了该数据库和相应的 JDBC 驱动。 创建数据库连接:使用 JDBC(Java Database…

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集NI-FGSM介绍背景算法流程 NI-FGSM代码实现NI-FGSM算法实现攻击效果 代码汇总nifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器: Pytorch | 从零构建AlexNet对CIFAR10进行…

继承详细总结

一.继承的定义与概念 1.定义:继承是一种is-a的关系,例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。 2.允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数) 和 属…

批量多线程给TXT文档插入相关腾讯AI【高质量无水印无版权】原创图片

给蜘蛛访问的网站文章插入相关图片,可以带来以下好处: ‌1、提升用户体验‌:图片能够直观地展示文章内容,帮助用户更好地理解和消化信息。对于阅读者来说,图文并茂的内容往往更具吸引力,也能提高他们的阅读…

牵手红娘:牵手App红娘助力“牵手”,脱单精准更便捷

随着互联网的普及,现代青年的社交圈层加速扩大,他们的恋爱观也正经历着前所未有的转变。在繁忙的工作之余,人们希望能够找到一种既高效又真诚的交友方式。于是,线上交友平台成为了他们寻找爱情的新选择。让不同文化背景、不同工作…

STM32-笔记12-实现SysTick模拟多线程流水灯

1、前言 正常STM32实现多线程,需要移植一个操作系统FreeRTOS。但是在这里不移植FreeRTOS怎么实现多线程呢?使用SysTick,那么怎么使用SysTick来模拟多线程呢?前面我们知道SysTick就是一个定时器,它不是在主函数的while循…

麒麟信安受邀出席开放原子园区行暨供需对接活动,分享基于关基领域打造的行业解决方案

12月17日,武汉市经信局和开放原子开源基金会共同主办开放原子园区行暨供需对接活动,旨在推进武汉市开源体系建设,推动开源技术赋能千行百业。活动吸引了武汉市委金融办、市卫健委、疾控中心、医保局、信息中心(大数据中心)、市红十字会、银行…

Everspin代理MR25H10CDFR存储MRAM

RAMSUN提供的MR25H10CDFR是一款具备1,048,576位存储容量的磁阻随机存取存储器(MRAM)设备,由131,072个8位字构成。该设备提供与串行EEPROM和串行闪存兼容的读/写时序,无写延迟,并且其读/写寿命是不受限制的。 与其它串…

golang 并发--goroutine(四)

golang 语言最大的特点之一就是语法上支持并发,通过简单的语法很容易就能创建一个 go 程,这就使得 golang 天生适合写高并发的程序。这一章节我们就主要介绍 go 程,但是要想完全理解 go 程我们需要深入研究 GPM 模型,关于 GPM 模型…

三维模型中的UV展开是什么意思?它有什么优势?

UV展开涉及将三维模型的表面展开为一个或多个二维区域,以便将纹理图像正确地映射到模型上。这个过程类似于将一个立体物体的表面切割并平铺开来。UV坐标是用于在二维纹理图像中定位颜色和细节的坐标系统,U和V分别代表纹理图像的水平和垂直轴。 UV展开它…

SpringAI人工智能开发框架006---SpringAI多模态接口_编程测试springai多模态接口支持

可以看到springai对多模态的支持. 同样去创建一个项目 也是跟之前的项目一样,修改版本1.0.0 这里 然后修改仓库地址,为springai的地址 然后开始写代码

JSON 系列之1:将 JSON 数据存储在 Oracle 数据库中

本文为Oracle数据库JSON学习系列的第一篇,讲述如何将JSON文档存储到数据库中,包括了版本为19c和23ai的情形。 19c中的JSON 先来看一下数据库版本为19c时的情形。 创建表colortab,其中color列的长度设为4000。若color的长度需要设为32767&a…