使用 perf 工具进行性能分析

devtools/2024/12/25 22:17:47/

perf_0">1、perf简介

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

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

perf_7">2、perf安装

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

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

perf_13">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 周期。

perf_61">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 周期、指令数、缓存访问

perf_84">5、perf输出分析

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

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

6、总结

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


http://www.ppmy.cn/devtools/145375.html

相关文章

GA-BP回归-遗传算法(Genetic Algorithm)和反向传播神经网络(Backpropagation Neural Network)

GA-BP回归详细介绍 源码 什么是GA-BP回归? GA-BP回归(遗传算法-反向传播回归,Genetic Algorithm-Backpropagation Regression)是一种结合了**遗传算法(Genetic Algorithm, GA)和反向传播神经网络&#x…

用 Python 从零开始构建 LLaMA 3

文章结尾有最新热度的文章,感兴趣的可以去看看。 本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身 文章有点长(字),期望您能坚…

网络安全等级保护测评工作流程

一、测评准备活动阶段 首先,被测评单位在选定测评机构后,双方需要先签订《测评服务合同》,合同中对项目范围(系统数量)、项目内容(差距测评?验收测评?协助整改?&#xf…

软件测试之非功能测试设计

非功能测试设计 非功能:除了软件功能测试,其他都是非功能测试。 1.兼容 2.易用 3.性能(专项) 4.安全(专项) Web浏览器 兼容:Chrome浏览器、Edge浏览器、Firefox浏览器、Safari苹果浏览器 易用:参考竞品,主观感受为主 总结 1.非功能测试范围 兼容性、…

组态页面渲染器通过npm包方式使用页面没有渲染成功的问题

前言 在项目开发过程中,计划将组态页面的渲染器集成到组件库,以 npm 包的形式供后续项目模板复用。如此一来,倘若组态页面渲染出现问题,便能简化修复与迭代工作。 遇到问题 采用本地引入方式开发完成后,切换至 npm 包方…

Git开发常用命令总结

Git开发常用命令总结 克隆仓库拉取仓库新建和切换分支远程库增删改查 克隆仓库 git clone --depth 3 -b 17.0 --single-branch https://github.com/odoo/odoo.git odoo17参数说明: --depth 3 : 只克隆最近提交的3条记录到本地。-b 17.0 --single-branch : 只拉取分支 17.0 拉…

【监控】夜莺监控系统各环节资源压力分析

最近研究运维/主机监控/AIOps/容灾备份系统,现分析夜莺监控系统各个环节的资源压力对比: 1. Categraf (采集端) 资源类型 典型消耗 压力点 -------------------------------- 内存 30-50MB • 采集项过多时内存上升 CPU 1-5% …

各种网站(学习资源及其他)

欢迎围观笔者的个人博客~ 也欢迎通过RSS网址https://kangaroogao.github.io/atom.xml进行订阅~ 大学指南 上海交通大学生存手册中国科学技术大学人工智能与数据科学学院本科进阶指南USTC不完全入学指南大学生活质量指北科研论 信息搜集 AI信息搜集USTC飞跃网站计算机保研 技…