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

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 lsDesktop  Documents  Downloads  Music  Pictures  Public  Templates  VideosPerformance counter stats for 'ls':1.28 msec task-clock:u               #    0.165 CPUs utilized0      context-switches:u         #    0.000 M/sec0      cpu-migrations:u           #    0.000 K/sec104      page-faults:u              #    0.081 M/sec1,054,302      cycles:u                   #    0.823 GHz1,136,989      instructions:u             #    1.08  insn per cycle228,531      branches:u                 #  178.447 M/sec11,331      branch-misses:u            #    4.96% of all branches0.007754312 seconds time elapsed0.000000000 seconds user0.007717000 seconds sys

3.4 perf top

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

Samples: 1K of event 'cpu-clock', Event count (approx.): 294500000
Overhead  Shared Object        Symbol32.77%  [kernel]             [k] clear_page_orig11.38%  [kernel]             [k] __softirqentry_text_start3.82%  libelf-0.170.so      [.] gelf_getsym3.48%  [kernel]             [k] kallsyms_expand_symbol.constprop.12.80%  [kernel]             [k] filemap_map_pages2.46%  [kernel]             [k] module_get_kallsym2.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探究性能

相关文章:

Linux Perf 介绍

文章目录 前言 二、安装Perf三、二级命令3.1 perf list3.2 perf record/report3.3 perf stat3.4 perf top 四、使用火焰图进行性能分析4.1 下载火焰图可视化生成器4.2 使用perf采集数据4.3 生成火焰图参考资料 前言 perf是一款Linux性能分析工具,内置在Linux内核的…...

【论文阅读】Variational Graph Auto-Encoder

0、基本信息 会议:2016-NIPS作者:Thomas N. Kipf,Max Welling文章链接:Variational Graph Auto-Encoder代码链接:Variational Graph Auto-Encoder 1、介绍 本文提出一个变分图自编码器,一个基于变分自编…...

如何把电脑中的项目快速传进Github中?

一、打开GitHub网站:https:github.com 登录自己的个人账号 1.新建一个项目 2.用鼠标直接拖拽电脑中的项目文件夹与文件到新创建的项目中点击保存即可。...

Plantuml之nwdiag网络图语法介绍(二十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...

MyBatis接口的方法上使用,定义对应的 SQL 操作

目录标题 一、Mapper:二、Select、Insert、Update、Delete:三、Results、Result:四、Param:五、# 和 $: MyBatis 是一款基于 Java 的持久层框架,它通过简化数据库操作来帮助开发者构建更好的数据库访问应用…...

(20)Linux初始文件描述符

前言:本章我们介绍 O_WRONLY, O_TRUNC, O_APPEND 和 O_RDONLY。之后我们开始讲解文件描述符。 一、系统传递标记位 1、O_WRONLY C 语言在 w 模式打开文件时,文件内容是会被清空的,但是 O_WRONLY 好像并非如此? 代码演示&…...

draw.io基础操作和代码高效画图进阶

文章目录 一、基础操作1、链接2、等比例变形3、复制4、插入表格 二、在线打开三、插入—功能聚集地1、插入图片2、插入画笔3、插入布局4、导出 四、图码转换——高效画图1、通用图码转换2、流程图生成:使用mermaid语言生成图: 五、图码转换高效画图的典型…...

2024-01-04 用llama.cpp部署本地llama2-7b大模型

点击 <C 语言编程核心突破> 快速C语言入门 用llama.cpp部署本地llama2-7b大模型 前言一、下载llama.cpp以及llama2-7B模型文件二、具体调用总结 前言 要解决问题: 使用一个准工业级大模型, 进行部署, 测试, 了解基本使用方法. 想到的思路: llama.cpp, 不必依赖显卡硬件…...

HTTP打怪升级之路

新手村 上个世纪80年代末&#xff0c;有一天&#xff0c;Tim Berners-Lee正在工作&#xff0c;他需要与另一台计算机上的同事共享一个文件。他尝试使用电子邮件&#xff0c;但发现电子邮件不能发送二进制文件。Tim Berners-Lee意识到&#xff0c;他需要一种新的协议来共享二进制…...

axure RP9.0安装字体图标库fontawesome

字体图库地址: Font AwesomeThe internets icon library toolkit. Used by millions of designers, devs, & content creators. Open-source. Always free. Always awesome.https://fontawesome.com/v6/download进入后下载想要的版本如我是6.3 下载后得到压缩包,解压之后…...

PiflowX组件-ReadFromUpsertKafka

ReadFromUpsertKafka组件 组件说明 upsert方式从Kafka topic中读取数据。 计算引擎 flink 有界性 Unbounded 组件分组 kafka 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子kafka_hostKAFKA_HO…...

keil 5 ARM CC编译错误和警告解释大全(3)序列号2000-3000

2001年&#xff1a;已声明虚拟参数&#xff0c;但从未使用过 2002年&#xff1a;虚拟参数重新定义为do变量 2003&#xff1a;无法优化&#xff1a;常量/表达式传递给可能修改的变量 2004&#xff1a;重新维度的数组作为参数传递 2005&#xff1a;重维度数组等价 2006&…...

CentOS 7 实战指南:文件或目录的权限操作命令详解

前言 这篇文章详细介绍了文件和目录的常用权限操作命令&#xff0c;并提供了全面的技术解析。通过本文&#xff0c;你将学习如何使用 chmod 和 chown 命令来管理文件和目录的权限&#xff0c;控制用户和用户组的访问权限。无论你是初学者还是有经验的系统管理员&#xff0c;这…...

我的第一个前端项目,vue项目从零开始创建和运行

​入门前端&#xff0c;从基础做起&#xff0c;从零开始新建项目 背景&#xff1a;VUE脚手架项目是一个“单页面”应用&#xff0c;即整个项目中只有1个网页&#xff01; 在VUE脚手架项目中&#xff0c;主要是设计各个“视图组件”&#xff0c;它们都是整个网页中某个部分&…...

【OJ】C++,Java,Python,Go,Rust

for循环语法 // cpp// java// python for i in range(集合): for i, val in enumerate(集合): for v1,v2,v3,... in zip(集合1,集合2,集合3,...):Pair // cpp pair<int, string> first second // java Pair<Integer, String> first() new Pair<>(firstVal…...

Flink 任务指标监控

目录 状态监控指标 JobManager 指标 TaskManager 指标 Job 指标 资源监控指标 数据流监控指标 任务监控指标 网络监控指标 容错监控指标 数据源监控指标 数据存储监控指标 当使用 Apache Flink 进行流处理任务时&#xff0c;可以根据不同的监控需求&#xff0c;监控…...

Go语言程序设计-第7章--接口

Go语言程序设计-第7章–接口 接口类型是对其他类型行为的概括与抽象。 Go 语言的接口的独特之处在于它是隐式实现。对于一个具体的类型&#xff0c;无须声明它实现了哪些接口&#xff0c;只要提供接口所必须实现的方法即可。 7.1 接口即约定 7.2 接口类型 package iotype …...

性能优化-OpenMP基础教程(二)

本文主要介绍OpenMP并行编程技术&#xff0c;编程模型、指令和函数的介绍、以及OpenMP实战的几个例子。希望给OpenMP并行编程者提供指导。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&am…...

让电脑变得更聪明——用python实现五子棋游戏

作为经典的棋类游戏&#xff0c;五子棋深受大众喜爱&#xff0c;但如果仅实现人与人的博弈&#xff0c;那程序很简单&#xff0c;如果要实现人机对战&#xff0c;教会计算机如何战胜人类&#xff0c;那就不是十分容易的事了。本文我们先从简单入手&#xff0c;完成五子棋游戏的…...

C#-接口

接口 (interface) 定义了一个可由类和结构实现的协定。接口可以包含方法、属性、事件和索引器。接口不提供它所定义的成员的实现 — 它仅指定实现该接口的类或结构必须提供的成员。 接口可支持多重继承。在下面的示例中,接口 IComboBox 同时从 ITextBox 和 IListBox 继承。 i…...

ASP.NET可视化流程设计器源码

源码介绍: ASP.NET可视化流程设计器源码已应用于众多大型企事业单位。拥有全浏览器兼容的可视化流程设计器、表单设计器、基于角色的权限管理等系统开发必须功能&#xff0c;大大为您节省开发时间&#xff0c;是您开发OA.CRM、HR等企事业各种应用管理系统和工作流系统的最佳基…...

景联文科技GPT教育题库:AI教育大模型的强大数据引擎

GPT-4发布后&#xff0c;美国奥数队总教练、卡耐基梅隆大学数学系教授罗博认为&#xff0c;这个几乎是用“刷题”方式喂大的AI教育大模型的到来&#xff0c;意味着人类的刷题时代即将退出历史舞台。 未来教育将更加注重学生的个性化需求和多元化发展&#xff0c;借助GPT和AI教育…...

PHP进阶-实现网站的QQ授权登录

授权登录是站点开发常见的应用场景&#xff0c;通过社交媒体一键授权可以跳过注册站点账户的繁琐操作。本文将讲解如何用PHP实现QQ授权登录。首先&#xff0c;我们需要申请QQ互联开发者账号获得APPID和密钥&#xff1b;接着&#xff0c;我们下载QQ官方SDK&#xff1a;PHP SDK v…...

字节跳动基础架构SRE-Copilot获得2023 CCF国际AIOps挑战赛冠军

近日&#xff0c;2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会在北京成功举办&#xff0c;活动吸引了来自互联网、运营商、科研院所、高校、软硬件厂商等领域多名专家学者参与&#xff0c;为智能运维的前沿学术研究、落地生产实践打开了新思路。决赛中&#xff0…...

python moviepy 图文批量合成带字幕口播视频

最近在研究将图片和文本批量合成为带字幕口播视频 主要是基于python的moviepy库 from generator import audio, pics, subs, videodef main():texts_input examplepics_input example# 图片分辨率预处理pics.adjust(pics_input)# 文字转语音audio.text_to_audio(texts_inpu…...

【代码片段】Linux C++打印当前函数调用堆栈

在开发大型项目时&#xff0c;尤其是多线程情况下&#xff0c;一般无法使用断点调试&#xff0c;这时候将当前函数的调用堆栈打印出来是非常有必要和有效的问题排查手段。 这里记录一段Linux环境下&#xff0c;打印函数堆栈的代码。 void get_native_callstack(std::string &a…...

Linux程序、进程以及计划任务(第一部分)

目录 一、程序和进程 1、什么是程序&#xff1f; 2、什么是进程&#xff1f; 3、线程是什么&#xff1f; 4、如何查看是多线程还是单线程 5、进程结束的两种情况&#xff1a; 6、进程的状态 二、查看进程信息的相关命令 1、ps&#xff1a;查看静态的进程统计信息 2、…...

Oracle database 12cRAC异地恢复至单机

环境 rac 环境 byoradbrac Oracle12.1.0.2 系统版本&#xff1a;Red Hat Enterprise Linux Server release 6.5 软件版本&#xff1a;Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit byoradb1&#xff1a;172.17.38.44 byoradb2&#xff1a;172.17.38.4…...

【docker】linux部署docker

简介 首先我需要声明的是&#xff0c;我的系统是centos7&#xff0c;下载工具使用的是yum&#xff1b;在linux上部署docker&#xff0c;之前一直看的是这篇文章Linux之Docker部署&#xff0c;基本上功能方面也都可以使用&#xff0c;部署起来也是比较的简单。首先我先讲述这篇…...

【K8S 云原生】Pod资源限制、Pod容器健康检查(探针)

目录 一、docker的重启方式和K8S重启方式 1、Pod的重启方式&#xff1a; 2、docker的重启策略&#xff1a; 二、yaml文件快速生成&#xff1a; 三、pod的状态&#xff1a; 四、Pod的资源限制 1、限制的方式和种类 2、CPU的限制的格式&#xff1a; 五、K8S拉取镜像的策…...

大学生个人网站怎么做/网络媒体软文案例

数据扩展(data extent)数据扩展是为存储数据而分配的一组连续的数据块。段分配空间的时候总是以extent为单位来分配的。在创建一个段时&#xff0c;指定一个initial extent&#xff0c;即初始数据扩展&#xff0c;当初始扩展中的数据块已经装满&#xff0c;且有新数据插入需要空…...

网站图怎么做会高清/如何进行网站推广?网站推广的基本手段有哪些

XML配置文件 eProsima Fast DDS允许加载XML配置文件,每个文件包含一个或多个XML配置。除了用于加载用户XML文件的API函数外,Fast DDS还尝试在初始化时定位和加载多个XML文件。Fast DDS提供以下选项: 加载位于当前执行路径中的名为DEFAULT_FASTRTPS_PROFILES.XML的XML文件。加…...

大数据 做网站流量统计/百度咨询电话 人工

今天在整合jar包时候&#xff0c;出现了 这是我导入的jar坐标 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.14</version> </dependency> 然后查看了它的相关依赖&#xff0c;果然…...

电子商务网站建设实训室简介/谷歌chrome安卓版

inux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, 因此有必要了解下echo的用法 echo命令的功能是在显示器上显示一段文字&#xff0c;一般起到一个提示的作用。 该命令的一般格式为&#xff1a; echo [ -n ] 字符串 其中选项n表示输出文字…...

做网站西宁/太原seo代理商

最近开始学习Qt&#xff0c;新建一个基础的项目&#xff0c;编译完成后&#xff0c;在原来的项目目录中又多了一个新的文件夹&#xff0c;名字是build-xxx-Desktop_xxxx-Debug。 文件夹中存放的是编译后生成的文件。 其中relase文件夹为空&#xff0c;因为此时我只进行了debu…...

加盟型网站制作/上海企业推广

自动化运维工具ansible的安装部署及其命令行模块 文章目录自动化运维工具ansible的安装部署及其命令行模块一、ansible简介二、为什么选择ansible1、puppet、saltstack和ansible的对比2、ansible 的特点三、ansible的安装部署1、yum安装epel源和ansible并查看其结构2、修改ansi…...