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探究性能

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

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

相关文章

virtualbox新建Ubuntu虚拟机

1、下载virtualbox 2、下载Ubuntu镜像 https://ubuntu.com/blog/desktop virtualbox安装好后,点击新建 选择linux类型 选择内存2~4G都行 选择先不添加虚拟硬盘 创建硬盘,管理点击虚拟介质管理 点击创建,选择创建类型为vmdk&#xff0…

xshell配色

xshell-设置命令行提示符&配色方案 更换配色: Protect Eyes.xcs [Protect Eyes] text00ff40 cyan(bold)93a1a1 text(bold)839496 magentadd3682 green80ff80 green(bold)859900 background042028 cyan2aa198 red(bold)cb4b16 yellowb58900 magenta(bold)6c71c…

腾讯云Centos9使用docker的方式安装APISIX

在虚拟机中安装Docker、Docker-compose 安装Docker 清除旧版本的docker yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安装docker的依赖 yum install -y yum-utils device-ma…

腾讯云域名外部入库流程

注册商是腾讯云,且在腾讯云管理的,请使用此教程外部入库。 如您的域名注册商是腾讯云但在聚名管理,请参考教程:https://www.west.cn/faq/list.asp?unid2539 在外部入库操作之前,请先登录腾讯云获取账号ID信息。…

CCF-B类 | 持续中科院1区TOP,Elsevier出版社,50年老刊!

【SciencePub学术】本期,小编给大家推荐的是一本Elsevier旗下,CCF-B类,影响因子为8.0的中科院1区TOP。其详情如下: 期刊简介 PATTERN RECOGNITION ISSN:0031-3203 E-ISSN:1873-5142 IF(20…

使用Go语言编写高效的HTTP服务器

随着互联网的快速发展,HTTP服务器在Web开发中扮演着越来越重要的角色。而Go语言作为一种高效、并发性强的编程语言,为编写高性能的HTTP服务器提供了强大的支持。本文将探讨如何使用Go语言编写高效的HTTP服务器。 首先,我们需要了解Go语言的H…

ChatGPT学习笔记——大模型基础理论体系

1、ChatGPT的背景与意义 近期,ChatGPT表现出了非常惊艳的语言理解、生成、知识推理能力, 它可以极好的理解用户意图,真正做到多轮沟通,并且回答内容完整、重点清晰、有概括、有条理。 ChatGPT 是继数据库和搜索引擎之后的全新一代的 “知识表示和调用方式”如下表所示。 …

看板表格样式,去掉element表格背景

<div class"ml-20"><el-input v-model.trim"queryParams.wipOrderNo" size"small" clearable style"width:150px" placeholder"请输入工单号" /><el-select class"ml-20" v-model"queryParam…

Go后端开发 -- Go Modules

Go后端开发 – Go Modules 文章目录 Go后端开发 -- Go Modules一、什么是Go Modules?二、GOPATH的工作模式1.GOPATH模式2.GOPATH模式的弊端 三、Go Modules模式创建项目1.go mod命令2.go mod环境变量3.使用Go Modules初始化项目4.修改模块的版本依赖关系 四、Go Modules下impo…

如何写出一份优秀的简历?(求职必知)

你需要知道的事 简历是对自己职场的总结和概括&#xff0c;是通往下一段职业经历的敲门砖和 垫脚石。 因此&#xff0c;一份好的简历应该突出应聘者的优势&#xff0c;并引起企业方的好奇心。 知己知彼&#xff0c;百战百胜&#xff0c;求职者只有了解自己&#xff0c;以及了解…

大数据应用开发2-Scala语言各个环境配置

一、首先安装JDK1.8版本(简单过一下) 1.下载与安装 下载Java1.8 地址&#xff1a;Java Downloads | Oracle 中国 点击跳转&#xff08;下载需要登录甲骨文账号&#xff09; 下载完成运行 修改安装目录&#xff08;两个都要改&#xff09; 复制第一次修改的安装目录 2.配置环…

立仪科技光谱共焦位移传感器:应用领域的广泛性

在科技日新月异的今天&#xff0c;光谱共焦位移传感器以其精确、稳定的特性&#xff0c;在各个领域得到了广泛的应用。本文将详细介绍光谱共焦位移传感器的应用情况&#xff0c;以期让大家对其有更深入的了解。我们来理解一下什么是光谱共焦位移传感器。 它是一种通过测量物体表…

cmd命令启动C# windows服务程序

因为Process.Manage.Service.exe程序为Windows服务程序&#xff0c;不能直接双击打开&#xff0c;所以需要借助windows系统自带InstallUtil.exe程序来启动它。 以管理员身份运行cmd命令控制台窗口 输入命令进入到InstallUtil.exe程序所在的文件夹 cd C:\Windows\Microsoft.NET…

【EI会议征稿通知】第三届电子与集成电路技术国际学术会议(EICT 2024)

第三届电子与集成电路技术国际学术会议&#xff08;EICT 2024&#xff09; 2024 3rd International Conference on Electronics and Integrated Circuit Technology 第三届电子与集成电路技术国际学术会议&#xff08;EICT 2024&#xff09;将于2024年4月12至14日在南昌市举行…

【电路笔记】-超级电容器

超级电容器 文章目录 超级电容器1、概述2、对电容器充电3、超级电容构造4、超级电容器示例15、超级电容器能量6、总结 超级电容器是能够存储大量电荷的电能存储设备。 1、概述 与以热的形式耗散能量的电阻器不同&#xff0c;理想的超级电容器不会损失能量。 我们还看到&#x…

【ITK库学习】使用itk库进行图像配准:变换Transform(三)

目录 1、itkAffineTransform 仿射变换2、itkBSplineDeformableTransform B样条可变形变换 1、itkAffineTransform 仿射变换 该类实现向量空间的仿射变换&#xff08;例如空间坐标&#xff09; 此类允许定义和操作n维仿射空间&#xff08;及其关联的向量空间&#xff09;对其自…

班主任是班级工作的什么人

在我们的学习生涯中&#xff0c;班主任是一个不可或缺的角色。他不仅是我们学术上的指导者&#xff0c;更是我们成长路上的引路人。 是班级的掌舵者。一个班级就像一艘船&#xff0c;航行在知识的海洋中。班主任就是这艘船的船长&#xff0c;他们带领着我们向着目标前进&#x…

【办公软件】修改U盘的默认盘符

在工作中我们可能会因为有一些大型软件设置了库文件路径&#xff08;如Z盘&#xff09;。在家办公时通过U盘的方式将库拷入在U盘中&#xff0c;但是到家里的电脑上&#xff0c;U盘插入后会默认一个盘符&#xff08;如E盘&#xff09;&#xff0c;那么应该怎么操作呢&#xff1f…

国产化软硬件升级之路:πDataCS 赋能工业软件创新与实践

在国产化浪潮的推动下&#xff0c;基础设施软硬件替换和升级的需求日益增长。全栈国产化软硬件升级替换已成为许多领域中的必选项&#xff0c;也引起了数据库和存储领域的广泛关注。近年来&#xff0c;虽然涌现了许多成功的替换案例&#xff0c;但仍然面临着一些问题。 数据库…

判断线性相关性

线性相关是线性代数中的一个重要概念&#xff0c;用于描述向量或向量组之间的线性关系。以下是判断向量组是否线性相关的几种方法&#xff1a; 1. **根据定义判断**&#xff1a; - 如果存在一组不全为零的系数&#xff0c;使得这些系数与对应的向量组相乘后相加等于零向量&a…