Linux Perf 介绍

文章目录

    • 前言
  • 二、安装Perf
  • 三、二级命令
    • 3.1 perf list
    • 3.2 perf record/report
    • 3.3 perf stat
    • 3.4 perf top
  • 四、使用火焰图进行性能分析
    • 4.1 下载火焰图可视化生成器
    • 4.2 使用perf采集数据
    • 4.3 生成火焰图
    • 参考资料

前言

perf是一款Linux性能分析工具,内置在Linux内核的一个Linux性能分析框架中,利用CPU、性能检测单元(Performance Monitoring Unit,PMU)和软件计数(如软件计数器和跟踪点)等进行性能分析。

主要用途:

  1. 快速定位和解决系统性能问题。它可以收集程序运行时的性能数据,包括CPU、内存、IO等方面的信息,并提供详细的性能分析和报告。
  2. 生成程序的调用图,记录程序中函数之间的调用关系,并提供详细的调用图分析和报告。
  3. 检测程序的内存泄漏问题,收集程序运行时的内存数据,并提供详细的内存泄漏分析和报告。
  4. 提供程序性能优化的建议,分析程序运行时的性能数据,并提供优化的建议和方案。

工作原理:

  1. 首先,perf会使用特殊的指令将硬件性能计数器设置为所需的事件类型。这可以包括CPU周期、指令执行数、缓存命中数等。
  2. perf会定期读取计数器的值,以获得一组采样数据。采样的频率可以由用户配置。
  3. perf将采样数据与相应的事件关联起来,并进行分析。这可以包括计算平均值、最大值、最小值,以及计算事件之间的关联性等。
  4. perf可以将分析结果以各种不同的格式进行输出,如报告、图形化界面等。用户可以根据需要选择适合自己的输出格式。

perf调用原理图如下:
img

二、安装Perf

大多数Linux发行版都包含perf工具。可以使用包管理器来安装perf,例如在Ubuntu上可以使用以下命令进行安装:

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

perf工具需要操作系统内核支持。确保Linux内核启用了性能事件计数器(PerformanceCounter)子系统。可以通过检查内核配置选项来确认,通常是在内核配置文件(例如/usr/src/linux/.config)中搜索以下选项: CONFIG_PERF_EVENTS=y
如果该选项没有被启用,需要重新编译内核并启用该选项。

三、二级命令

在终端中输入perf命令可以看到所有的二级命令:

1	annotate	解析perf record生成的perf.data文件,显示被注释的代码。
2	archive	根据数据文件记录的build-id,将所有被采样到的elf文件打包。利用此压缩包,可以再任何机器上分析数据文件中记录的采样数据。
3	bench	perf中内置的benchmark,目前包括两套针对调度器和内存管理子系统的benchmark。
4	buildid-cache	管理perf的buildid缓存,每个elf文件都有一个独一无二的buildid。buildid被perf用来关联性能数据与elf文件。
5	buildid-list	列出数据文件中记录的所有buildid。
6	diff	对比两个数据文件的差异。能够给出每个符号(函数)在热点分析上的具体差异。
7	evlist	列出数据文件perf.data中所有性能事件。
8	inject	该工具读取perf record工具记录的事件流,并将其定向到标准输出。在被分析代码中的任何一点,都可以向事件流中注入其它事件。
9	kmem	针对内核内存(slab)子系统进行追踪测量的工具
10	kvm		用来追踪测试运行在KVM虚拟机上的Guest OS。
11  list 列出当前系统支持的所有性能事件。包括硬件性能事件、软件性能事件以及检查点。
12	lock	分析内核中的锁信息,包括锁的争用情况,等待延迟等。
13	mem		内存存取情况
14	record	收集采样信息,并将其记录在数据文件中。随后可通过其它工具对数据文件进行分析。
15	report	读取perf record创建的数据文件,并给出热点分析结果。
16	sched	针对调度器子系统的分析工具。
17	script	执行perl或python写的功能扩展脚本、生成脚本框架、读取数据文件中的数据信息等。
18	stat	执行某个命令,收集特定进程的性能概况,包括CPI、Cache丢失率等。
19	test	perf对当前软硬件平台进行健全性测试,可用此工具测试当前的软硬件平台是否能支持perf的所有功能。
20	timechart	针对测试期间系统行为进行可视化的工具。
21	top		类似于linux的top命令,对系统性能进行实时分析。
22	trace	关于syscall的工具。
23	probe	用于定义动态检查点。

3.1 perf list

列出当前系统支持的所有性能事件。包括硬件性能事件、软件性能事件以及检查点。

  1. Hardware event:由PMU产生的事件,如L1缓存命中。
  2. Software event:由内核产生的事件,如进程切换,发生缺页中断等。
  3. Tracepoints event:由内核静态跟踪点所触发的事件。

tracepoints 不仅是用在 perf 中,它已经是 Linux 内核 tracing 的标准接口了,ftrace,ebpf 等工具都会用到它。这些tracepint的对应的sysfs节点在/sys/kernel/debug/tracing/events目录下。

总结:event 是 perf 工作的基础,主要有两种:有使用硬件的 PMU 里的 event,也有在内核代码中注册的 event

3.2 perf record/report

perf record采集数据,并且把数据写入数据文件中,随后可通过perf report命令对数据进行分析

perf record常用选项列表:

选项描述
-e选择一个事件,可以是硬件事件也可以是软件事件
-a全系统范围的数据采集
-p指定一个进程的ID来采集特定进程的数据
-o指定要写入数据的数据文件
-g使能函数调用图功能
-C只采集某个CPU的数据

perf reprot常用选项列表:

选项描述
-i导入数据文件名称,默认为perf.data
-g生成函数调用关系图
–sort分类统计信息,如PID、COMM、CPU等

3.3 perf stat

perf stat 命令一个通过概括、精简的方式提供被调试程序运行的整体情况和汇总数据的工具。如处理器占用时常,上下文切换次数,缺页异常次数等。选项如下:

选项描述
-a显示所有CPU上的统计信息
-c显示指定CPU上的统计信息
-e指定要显示的事件
-p指定要显示的进程ID
# perf stat ls

Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos

 Performance counter stats for 'ls':

              1.28 msec task-clock:u               #    0.165 CPUs utilized
                 0      context-switches:u         #    0.000 M/sec
                 0      cpu-migrations:u           #    0.000 K/sec
               104      page-faults:u              #    0.081 M/sec
         1,054,302      cycles:u                   #    0.823 GHz
         1,136,989      instructions:u             #    1.08  insn per cycle
           228,531      branches:u                 #  178.447 M/sec
            11,331      branch-misses:u            #    4.96% of all branches

       0.007754312 seconds time elapsed

       0.000000000 seconds user
       0.007717000 seconds sys

3.4 perf top

当你有一个明确的优化目标或对象时,可以使用perf stat命令。但有时候系统性能会无端下降,此时需要一个类似于top的命令,以列出所有值得怀疑的进程,从中快速定位问题和缩小范围。

Samples: 1K of event 'cpu-clock', Event count (approx.): 294500000
Overhead  Shared Object        Symbol
  32.77%  [kernel]             [k] clear_page_orig
  11.38%  [kernel]             [k] __softirqentry_text_start
   3.82%  libelf-0.170.so      [.] gelf_getsym
   3.48%  [kernel]             [k] kallsyms_expand_symbol.constprop.1
   2.80%  [kernel]             [k] filemap_map_pages
   2.46%  [kernel]             [k] module_get_kallsym
   2.38%  perf                 [.] d_demangle_callback
  • Samples: 采样数,perf总共采集了1k个CPU时钟事件;
  • event : 事件类型;
  • Event count (approx.):事件总数量;

行列:

  • Overhead :标识该符号的性能事件在所有采样中的比例,用百分比表示;
  • Shared:Shared,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等;
  • Object : Object,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
  • Symbol: Symbol是符号名,也是函数名。当函数名未知时,用十六进制的地址来表示。

四、使用火焰图进行性能分析

火焰图(FlameGraph)是 svg 格式的矢量图,是先通过 perf 等工具分析得到结果,并将该结果生成的具有不同层次且支持互动的图片,看起来就像是火焰,这也是它的名字的由来。表现形式如下所示:
在这里插入图片描述

4.1 下载火焰图可视化生成器

git clone https://github.com/brendangregg/FlameGraph.git

4.2 使用perf采集数据

sudo perf record -F 99 -p 2512 -g -- sleep 30
  • record:表示采集系统事件,没有采用 -e 执行采集事件,则默认采集 cycles(即 CPU clock 周期)。
  • -F 99:指定采样频率为 99Hz(每秒99次),如果 99次都返回同一个函数名, 那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。
  • -p 2512:指定进程号,对某一个进程分析。
  • -g:表示记录调用栈。
  • -- sleep 30:表示持续 30 秒
    除了附加到正在执行的进程之外,还可以启动一个进程
sudo perf record -g -F 99  ls
  • ls:为需要执行的程序

4.3 生成火焰图

# 统计每个调用栈出现的百分比,然后从高到低排列。
sudo perf report -n --stdio
# 生成折叠后的调用栈
sudo perf script -i perf.data > perf.unfold
# 生成火焰图
./stackcollapse-perf.pl perf.unfold > perf.folded
# 最后生成 svg 图
./flamegraph.pl perf.folded > perf.svg

生成的perf.svg 文件可以直接使用浏览器打开。

此外还有红蓝分叉火焰图,可以分析性能回退问题,感兴趣的读者可以进一步了解。

参考资料

  1. 系统级性能分析工具perf的介绍与使用
  2. 从小白到精通:揭秘perf工具的全部功能与操作技巧
  3. perf性能分析–stat命令
  4. 使用火焰图(FlameGraph)分析程序性能
  5. 如何使用perf top探究性能

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爬虫工具(tkinter+scrapy+pyinstaller)

需求介绍输入:关键字文件,每一行数据为一爬取单元。若一行存在多个and关系的关键字 ,则用|隔开处理:爬取访问6个网站的推送,获取推送内容的标题,发布时间,来源,正文第一段&#xff0…

自动化测试框架总结

1. 单元测试框架 几乎所有的主流语言,都会有其对应的单元测试框架,下面简单介绍一下python,java,C#三种语言的常见单元测试框架 1.1 Python python常见单元测试框架包括unittest, pytest 1.1.1 unittest unittest单元测试框架不仅可以适用于单元测试&#xff0c…

Windows重装升级Win11系统后 恢复Mysql数据

背景 因为之前电脑硬盘出现问题,换了盘重装了系统,项目的数据库全部没了,还好之前的Mysql是安装在的D盘里,还有留存文件 解决办法 1.设置环境变量 我的路径是 D:\SoftWare\Application\mysql-5.7.35-winx64 此电脑右键属性 …

auto关键字的含义以及常见用法,C++11中的关键字

一、auto关键字的含义: auto:这是 C11 引入的关键字,用于自动推断变量的类型; 二、auto关键字的常见用法: auto 关键字在 C 中用于自动推断变量的类型,它可以让编译器根据初始化表达式的类型推导出变量的…

Python 介绍和环境准备

一、概述 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的解释性编程语言。 Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。 Python 是交互式语言: 这意味着,您可以在一个 Python…

和鲸解放军总医院连续生理数据分析引擎入选爱分析数据智能最佳实践案例

近日,“2023 爱分析 数据智能最佳实践案例”评选活动落下帷幕,和鲸科技基于旗下数据科学协同平台 ModelWhale 携手解放军总医院联合打造的《解放军总医院连续生理数据分析引擎》成功入选,有力证明了该案例于数据资产归集、数据架构升级、数据…

UE5.1保存资源报错

UE5.1保存资源报错 错误: The asset /Game/XXX(XXX.uasset) failed to save. Cancel: Stop saving all assets and return to the editor. Retry: Attempt to save the asset again. Continue: Skip saving this asset only. 解决: 1. 可能是进程中有多开的项目&…

iOS 组件开发教程——手把手轻松实现灵动岛

1、先在项目里创建一个Widget Target 2、一定要勾选 Include live Activity,然后输入名称,点击完成既可。 3、在 Info.plist 文件中声明开启,打开 Info.plist 文件添加 NSSupportsLiveActivities,并将其布尔值设置为 YES。 4、我…

Spark内核解析-脚本解析2(六)

2、脚本解析 在看源码之前,我们一般会看相关脚本了解其初始化信息以及Bootstrap类,Spark也不例外,而Spark中相关的脚本如下: %SPARK_HOME%/sbin/start-master.sh %SPARK_HOME%/sbin/start-slaves.sh %SPARK_HOME%/sbin/start-all…

freeRTOS——事件标志组知识总结及实战

1事件标志组概念 事件标志组:是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。 其特点: 1)它的每一个位表示一个事件(高8位不算) 2)每一位事件的含义,…

Spark内核解析-节点启动4(六)

1、Master节点启动 Master作为Endpoint的具体实例,下面我们介绍一下Master启动以及OnStart指令后的相关工作 1.1脚本概览 下面是一个举例: /opt/jdk1.7.0_79/bin/java -cp /opt/spark-2.1.0/conf/:/opt/spark-2.1.0/jars/*:/opt/hadoop-2.6.4/etc/ha…

UI5与后端的文件交互(四)

文章目录 前言一、后端开发1. 新建管理模板表格2. 新建Function,动态创建文档 二、修改UI5项目1.Table里添加下载证明列2. 实现onClickDown事件 三、测试四、附 前言 这系列文章详细记录在Fiori应用中如何在前端和后端之间使用文件进行交互。 这篇的主要内容有&…

2008年全国生态自然地域划分数据,shp格式,来源于国家生态环境部发布的《全国生态功能区》2008年版

数据名称: 全国生态自然地域划分数据 数据格式: Shp 数据时间: 2008年 数据几何类型: 面 数据坐标系: WGS84 数据来源:国家生态环境部发布的《全国生态功能区》2008年版 数据字段: 序号字段名称字段说明1bh编号2stq_1生态区_大类3stq_2生态区…

Spring Boot 完善订单【五】集成接入支付宝沙箱支付

1.1.什么是沙箱支付 支付宝沙箱支付(Alipay Sandbox Payment)是支付宝提供的一个模拟支付环境,用于开发和测试支付宝支付功能的开发者工具。在真实的支付宝环境中进行支付开发和测试可能涉及真实资金和真实用户账户,而沙箱环境则提…

网络对讲终端 网络音频终端 网络广播终端SV-7011V使用说明

高速路sip广播对讲求助 隧道sip对讲调度SIP-7011 网络广播终端SV-7011 壁挂式对讲终端网络监听终端SIP广播终端 sip语音对讲终端SIP-7011 SV-7011网络对讲终端网络对讲、网络厂播、监听 SV-7101网络解码终端提供一路线路输出接功放或有源音箱。 SV-7102网络解码广播终端两…

OpenGL如何基于glfw库 进行 点线面 已解决

GLFW是现在较流行、使用广泛的OpenGL的界面库,而glut库已经比较老了。GLEW是和管理OpenGL函数指针有关的库,因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置…

一加 Buds 3正式发布:普及旗舰音质 一加用户首选

1月4日,一加新品发布会正式推出旗下新款耳机一加 Buds 3。延续一加经典美学,秉承音质完美主义追求,一加 Buds 3全面普及一加旗舰耳机体验,其搭载旗舰同款“超清晰同轴双单元”,配备49dB 4000Hz超宽频主动降噪&#xff…

企语iFair 协同管理系统 任意文件读取漏洞复现(CVE-2023-47473)

0x01 产品简介 企语iFair协同管理系统是一款专业的协同办公软件,该管理系统兼容性强,适合多种企业类型。该软件永久免费,绿色安全,无需收取费用即可使用所有功能。企语iFair协同管理系统同时兼容了Linux、Windows两种操作系统 0x02 漏洞概述 企语iFair协同管理系统getup…

LangChain与昇腾

LangChain这个词今年已经听烂了,今天基于昇腾的角度总结一下: Why LangChain ? 场景:构建一个LLM应用 在构建一个新项目时,可能会遇到许多API接口、数据格式和工具。要去研究每一个工具、接口很麻烦。 假设要构建一…

Flume基础知识(三):Flume 实战监控端口数据官方案例

1. 监控端口数据官方案例 1)案例需求: 使用 Flume 监听一个端口,收集该端口数据,并打印到控制台。 2)需求分析: 3)实现步骤: (1)安装 netcat 工具 sudo yum …
最新文章