Linux perf使用思考
目录
- 一、参考资料(建议阅读)
- 二、值得思考的几个问题
- 1、perf使用不同的性能事件进行统计有什么区别呢?
- 2、那使用不同的性能事件统计出来的数据?排序是如何决定的,其中的百分比数值在不同的性能事件进行统计时各自的意义又是什么?
- 3、perf的 计数模式 与采样模式
- 三、CPU部分性能指标解释
- 1、EXC_RETURN:异常返回次数
- 2、EXC_TAKEN:发生的异常次数
- 3、branch-misses
- 4、如何减少程序执行过程中出现的缺页异常?
一、参考资料(建议阅读)
(1)程序员性能之道,从使用perf开始!
(2)手把手教你系统级性能分析工具perf的介绍与使用(超详细)
(3)perf优化cache实例
二、值得思考的几个问题
1、perf使用不同的性能事件进行统计有什么区别呢?
在使用 perf
进行性能分析时,可以选择不同的性能事件进行统计,每个事件都提供了不同类型的性能信息。选择不同的性能事件可以帮助你重点关注特定的性能方面,以下是一些常见的性能事件及其区别的示例:
1)CPU周期数(CPU cycles):这个事件跟踪了 CPU 执行指令的周期数,可以用来评估程序的执行效率和指令的优化情况。比较 CPU 周期数可以帮助你发现某个程序瓶颈在于执行时间较长的代码段。
2)指令数(Instructions):这个事件跟踪了执行的指令数量,可以帮助你评估程序的指令级别的性能。指令数高的代码段可能是 CPU 密集型的部分。
3)缓存相关事件(Cache-related events):包括缓存命中率、缓存失效等相关事件。缓存相关事件可以帮助你了解程序对缓存的使用情况,如缓存的命中效率、缓存失效引起的开销,从而针对性地优化程序的内存访问模式。
4)分支预测失误(Branch mispredictions):这个事件跟踪了分支预测错误的次数,分支预测错误会导致流水线中断和指令重排,从而影响程序的性能。
5) 缺页中断(Page faults):这个事件跟踪了缺页中断的次数,缺页中断通常表示内存访问受限,可以用来评估程序的内存访问模式和资源利用情况。
选择不同的性能事件可以让你聚焦于特定的性能方面,以便更好地发现问题和进行优化。通过观察不同性能事件的统计数据,你可以了解程序在各个方面的状况,并找到需要改进的地方。根据具体的应用场景,选择适合的性能事件能够更精确地分析和优化程序的性能表现。
2、那使用不同的性能事件统计出来的数据?排序是如何决定的,其中的百分比数值在不同的性能事件进行统计时各自的意义又是什么?
在 perf
工具中,数据的分析和排序是根据所选择的性能事件和相关指标来进行的,不同的性能事件和指标可以提供不同的视角和信息。以下是一些常见的方法和概念,用于分析 perf
收集的性能数据:
1)排序方式:perf
默认使用性能事件的计数值来排序,即按照事件发生的频率或数量进行排序。你可以通过 -s
或 --sort
参数来改变排序方式,例如 -s cpu
表示按照 CPU 占用排序,-s dso
表示按照动态共享对象排序。
2) DSO(Dynamic Shared Object):perf
默认按照动态共享对象来分组和排序,动态共享对象是程序在运行时使用的共享库。通过对 DSO 进行排序,可以看到各个共享库对性能的贡献,帮助你定位问题并进行优化。
3)百分比数值:perf
输出中的百分比数值通常表示该事件在总体中的占比。例如,如果一个函数的 CPU 使用时间占总 CPU 使用时间的 10%,则会显示为 10.00%。你可以根据百分比数值来确定相对重要性,找到有影响的代码段和函数。
4)热点函数/代码段:通过观察排序后的性能数据,你可以找到热点函数或代码段,即最耗费时间或资源的部分。这些热点可以成为性能优化的关注点,针对性地进行修改和优化。
5) 调用图(Call graph):perf
还提供了生成函数调用图的功能,它显示了函数之间的调用关系和调用路径。调用图可以帮助你理解性能问题的根源,确定函数的调用路径和调用频率,以及找到有潜在优化空间的函数。
分析 perf
收集的性能数据需要结合具体的应用场景和问题。你可以着重关注具有高占比和频率的性能事件,找到引起性能问题的原因,并根据结果进行性能优化和改进。同时,你还可以通过调用图、堆栈信息等进一步深入分析性能问题。记住,性能分析是一个迭代的过程,需要反复优化和验证,以改善系统的性能与效率。
3、perf的 计数模式 与采样模式
计数模式
和采样模式
可以使用相同的性能事件,但它们所提供的数据统计和分析方式是不同的。
在计数模式
下,您可以指定要计数的特定性能事件,例如指令的执行数、缓存命中数、分支预测错误等。perf会实时监测这些事件的发生次数,并提供相应的计数结果。这样可以对事件的频率进行精确的计量,得到准确的计数信息。
而在采样模式
下,您同样可以选择相同的性能事件来进行采样,以收集数据。采样会在程序执行过程中间隔一定的时间或事件触发时进行,记录事件发生时的上下文信息,如函数调用堆栈、指令指针等。采样会提供更详细的数据,可以用于分析热点函数、调用关系、性能瓶颈等。
虽然计数模式和采样模式可以监测和记录相同的性能事件,但计数模式提供了精确的事件计数,而采样模式提供了更丰富的上下文信息。因此,在选择模式时,您需要根据具体的分析需求考虑所需的数据类型和精度。
总结起来,计数模式和采样模式可以使用相同的性能事件,但它们所提供的数据类型和分析方式是不同的,具体取决于您的分析目标和准确度需求。
三、CPU部分性能指标解释
1、EXC_RETURN:异常返回次数
在性能分析中,异常返回(Exception returns)
是指程序中发生异常并从异常处理程序返回到正常执行流程的次数。当程序执行过程中遇到异常,例如除零错误
、段错误
等,系统会检测到异常并跳转到相应的异常处理程序进行处理。当异常处理程序完成后,程序会从异常处理程序返回到原来的执行流程,继续执行。
异常返回可以是由于程序中的异常处理逻辑导致的,也可以是由于外部事件(如系统资源不足、信号等)触发的。异常返回次数的计数器可以帮助我们了解程序中异常的频率和规模,以及异常处理代码的性能影响。
异常返回的频率较高可能会对程序的性能产生不利影响,因为异常会导致程序的正常执行流程中断,并且处理异常通常涉及额外的开销。因此,分析异常返回次数可以帮助我们确定异常处理代码的效率和优化的方向,以提高程序的性能和稳定性。
请注意,异常返回次数是 perf
工具中提供的一种性能事件,你可以使用 perf
进行性能分析,收集和分析异常返回的数据,从而了解程序中异常的情况和对性能的影响。
2、EXC_TAKEN:发生的异常次数
在性能分析中,EXC_TAKEN
事件指的是程序中发生的异常的次数。异常是在程序执行过程中遇到的意外情况,可以是由于错误的操作、无效的数据或其他不可预测的情况而引发的。
异常可以分为不同类型,常见的异常类型包括但不限于以下几种:
1. 除零错误(Divide by Zero):使用除法操作时除数为零引发的异常。2. 空指针异常(Null Pointer Exception):当代码试图通过空引用访问对象的成员时引发的异常。3. 内存访问异常(Segmentation Fault):试图访问无效地址或越界的内存区域导致的异常。4. 数据类型异常:包括类型转换错误、越界访问数组等数据类型相关的异常。5. 文件访问异常:如文件不存在、权限不足等导致无法正常读写文件的异常。
异常是破坏程序正常执行流程的事件,应该被正确地处理,以避免程序崩溃或产生其他不可预测的结果。异常的发生次数可以通过 EXC_TAKEN
事件来统计和分析,帮助我们了解异常的频率和规模,进而对异常情况进行调试和优化。
3、branch-misses
branch-misses
事件计数器用于统计处理器分支预测(branch prediction)错误(branch misprediction)的次数。当处理器在执行分支指令时,会根据预测结果提前执行分支的某个方向的指令,以提高指令流水线的效率。但是,在某些情况下,处理器的分支预测会出现错误,导致执行了错误的分支方向。这就是分支预测错误(branch misprediction)。
要优化程序代码以减少分支预测错误(branch-misses)的发生,可以考虑以下几个方面:
分支预测友好的编码风格
:尽量使用顺序执行的代码结构,避免复杂的条件分支和嵌套。简化程序流程可以减少分支预测错误的机会。
避免频繁的分支跳转
:过多的分支跳转会增加分支预测错误的几率。可以通过重构代码,减少不必要的分支跳转,例如合并相邻的条件判断,展开循环等。
提高代码局部性
:尽量保持代码的局部性,减少分支发生的频率和深度。可以通过适当的循环展开、代码重排等技术来优化代码的局部性。
使用逻辑运算替代条件分支
:在某些情况下,可以使用逻辑运算符(如 &&、||)代替条件分支语句,以减少分支预测错误的机会。
减小分支预测错误的影响
:分支预测错误的影响主要体现在指令流水线的停顿。可以通过优化指令调度、减少依赖关系等手段来降低分支预测错误对程序性能的影响。
使用程序注解和优化指令
:某些编程语言和编译器提供了特殊的注解或优化指令,用于提供分支预测的相关信息。可以在适当的地方使用这些特性,帮助编译器更好地进行优化和预测。
利用硬件分支预测特性
:现代处理器通常具备硬件分支预测机制,并提供了针对分支预测错误的优化技术。可以考虑利用特定的处理器指令或优化策略来最大程度地利用硬件分支预测。
需要注意的是,分支预测错误的优化是一个复杂而细微的过程,具体的优化策略可能因程序的特征和目标平台的不同而异。建议使用性能分析工具(如perf)来分析程序的热点代码和分支预测错误的情况,并根据具体情况进行针对性的优化。
4、如何减少程序执行过程中出现的缺页异常?
要减少程序执行过程中的缺页异常(Page Faults),可以采取以下几个措施:
内存访问模式优化
:缺页异常通常是由于内存访问模式不合理导致的,例如频繁地访问不在内存中的页。通过优化内存访问模式,尽量避免频繁地访问不在内存中的页,可以减少缺页异常的发生。
数据局部性优化
:数据局部性是指程序对数据的访问呈现出一定的空间和时间上的局部性规律。通过合理地组织数据结构和算法,尽量利用好数据的局部性,可以提高内存访问的效率,减少缺页异常的发生。
预读取(Prefetching)
:预读取技术可以在程序访问某个数据之前,提前将其加载到缓存或内存中。预读取可以减少缺页异常的发生,提高数据的可用性和访问的效率。可以使用系统级别的预读取策略,也可以在代码中手动进行预读取。
内存分配优化
:合理管理内存分配可以减少缺页异常的发生。例如,避免过度的内存分配和释放,减少频繁的内存碎片化,可以提高内存的利用率。
使用大页面(Large Pages)
:使用大页面可以减少缺页异常的次数。大页面是指比传统的页面更大的内存区域,通过减少页表的数量,从而降低了缺页异常的发生频率。请注意,使用大页面可能需要系统级别的支持,并且需要根据特定的应用场景进行评估和配置。
需要根据具体的程序和系统环境来选择和实施这些优化措施。通过综合考虑程序的访问模式、数据局部性、内存分配、预读取等因素,以及实际测试和性能分析的结果,可以有效地减少缺页异常的发生,提高程序的性能和响应速度。
欢迎大家指导和交流!如果我有任何错误或遗漏,请立即指正,我愿意学习改进。期待与大家一起进步!
相关文章:
Linux perf使用思考
目录 一、参考资料(建议阅读)二、值得思考的几个问题1、perf使用不同的性能事件进行统计有什么区别呢?2、那使用不同的性能事件统计出来的数据?排序是如何决定的,其中的百分比数值在不同的性能事件进行统计时各自的意义…...
自定义路由断言工厂
我们来设定一个场景: 假设我们的应用仅仅让age在(min,max)之间的人来访问。 第1步:在配置文件中,添加一个Age的断言配置 spring: application:name: api-gateway cloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:discovery:locator:enabled: trueroute…...
Nacos安装及在项目中的使用
目录 概要一、安装 Nacos1、下载 Nacos2、解压3、启动 Nacos 服务器4、自定义Nacos启动脚本5、访问Nacos Web控制台 二、Nacos----服务注册与发现1、添加 Nacos 依赖2、配置 Nacos 服务器地址3、使用 Nacos 注册服务4、启动服务 三、Nacos----配置管理1、创建配置数据2、从 Nac…...
overleaf中latex语法总结
α和bata $\alpha$ $\beta$上标和下标同时使用 $A_{IJ}^{IJ}$\\ %上标^下标_多个使用{}行内公式 \noindent $abc$\\ %行内公式\documentclass{article} \usepackage[utf8]{inputenc} \usepackage[namelimits]{amsmath} %数学公式 \usepackage{amssymb} %数学公式…...
Grafana配置邮件告警
1、创建一个监控图 2、grafana邮件配置 vim /etc/grafana/grafana.ini [smtp] enabled true host smtp.163.com:465 user qinziteng05163.com password xxxxx # 授权码 from_address qinziteng05163.com from_name Grafanasystemctl restart grafana-serv…...
setup中的nextTick函数
await nextTick() 是 Vue 3 的一个异步函数,用于等待 DOM 更新完成后执行回调函数, 它在 setup 函数中非常有用,可以确保在对 DOM 进行操作之前,先等待 Vue 完成相关的 DOM 更新。 下面是一个示例,演示了 await nextT…...
Matlab信号处理3:fft(快速傅里叶变换)标准使用方式
Fs 1000; % 采样频率 T 1/Fs; % 采样周期:0.001s L 1500; % 信号长度 t (0:L-1)*T; % 时间向量. 时间向量从0开始递增,0s~1.499sS 0.7*sin(2*pi*50*t) sin(2*pi*120*t); % 模拟原信号 X S 2*randn(size(t)); …...
Python|合并两个字典的几种方法
在Python中,有多种方法可以通过使用各种函数和构造函数来合并字典。在本文中,我们将讨论一些合并字典的方法。 1. 使用方法update() 通过使用Python中的update()方法,可以将一个列表合并到另一个列表中。但是在这种情况下,第二个…...
ElementUI浅尝辄止24:Message 消息提示
常用于主动操作后的反馈提示。与 Notification 的区别是后者更多用于系统级通知的被动提醒。 1.如何使用? Message 在配置上与 Notification 非常类似,所以部分 options 在此不做详尽解释,可以结合 Notification 的文档理解它们。Element 注…...
让照片动起来的软件,轻松制作照片动效
随着社交媒体的日益普及,我们对于照片的要求也越来越高。普通的照片已经不能满足我们的需求,我们希望照片更加生动有趣。照片动效便应运而生,它可以让照片动起来,吸引更多的注意力,让照片更加生动有趣。 照片动效制作起…...
【图解RabbitMQ-7】图解RabbitMQ五种队列模型(简单模型、工作模型、发布订阅模型、路由模型、主题模型)及代码实现
🧑💻作者名称:DaenCode 🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…...
Linux命令200例:write用于向特定用户或特定终端发送信息
🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师࿰…...
javaee spring整合mybatis spring帮我们创建dao层
项目结构 pom依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…...
修改Tomcat的默认端口号
1、找到Tomcat的安装路径。 2、打开conf文件夹。 3、用记事本打开server.xml文件 4、找到 <Connector port"8080" protocol"HTTP/1.1",其中的8080就是tomcat的默认端口,将其修改为你需要的端口即可。...
Open3D Ransac拟合空间直线(python详细过程版)
RANSAC拟合直线 一、算法原理1、算法简介2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、算法简介 见:Open3D——RANSAC 三维点云空间直线拟合 2、参考文献...
题目:2729.判断一个数是否迷人
题目来源: leetcode题目,网址:2729. 判断一个数是否迷人 - 力扣(LeetCode) 解题思路: 对 n,2*n,3*n 中的数字出现次数计数,若数字 0 出现 0 次,数字 1~9…...
微服务模式:服务发现模式
由于微服务应用的动态性,很难调用具有固定 IP 地址的服务。这就是服务发现的概念出现的背景。服务发现有助于客户端了解服务实例的位置。在这种情况下,服务发现组件将充当服务注册表。 服务注册表是一个包含服务实例位置的集中式服务器/数据库。在微服务…...
9.4 数据库 TCP
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//判断数据库对象是否包含了自己使用的数据库if(!db.contains("Stu.db")){//不存在数据库࿰…...
普通用户使用spark的client无法更新Ranger策略
普通用户使用spark的client无法更新Ranger策略 报错图片: WARN org.apache.ranger.admin.client.RangerAdminRESTClient: Error getting Roles. secureModetrue, usercaojianxiangUCDIPA.VIATRIS.CC (auth:KERBEROS),responsef"httpStatusCode&quo…...
Git超详细教程
文章目录 一、安装并配置Git二、Git的基本操作三、Github/GitLab/Gitee四、分支 一、安装并配置Git 查看所有的全局配置项 git config --list --global查看指定的全局配置项 git config user.name git config user.email配置用户信息 git config --global user.name "…...
C++ 回调函数
一、使用方法 1.定义一个函数指针 typedef int (*pCallback)(int a, int b);2.定义一个带参的回调函数(注释部分是普通回调函数,不用定义第一步里的函数指针) //带参 int oneCallback(int a, int b, pCallback p) //int oneCallback(int a, i…...
xilinx FPGA IOB约束使用以及注意事项
文章目录 一、什么是IOB约束二、为什么要使用IOB约束1、在约束文件中加入下面约束:2、直接在代码中加约束, 三、IOB约束使用注意事项 一、什么是IOB约束 在xilinx FPGA中,IOB是位于IO附近的寄存器,是FPGA上距离IO最近的寄存器&am…...
如何统计iOS产品不同渠道的下载量?
一、前言 在开发过程中,Android可能会打出来很多的包,用于标识不同的商店下载量。原来觉得苹果只有一个商店:AppStore,如何做出不同来源的统计呢?本篇文章就是告诉大家如何做不同渠道来源统计。 二、正文 先看一下苹…...
大模型学习
大模型 大规模语言模型(Large Language Model)简称,具有庞大的参数规模和复杂程度的机器学习模型。在深度学习领域,指具有数百万到数十亿参数的神经网络模型。 优点: 更强大、更准确的模型性能,可面对复杂…...
Redis原理:IntSet
(笔记总结自b站黑马程序员课程) 一、结构 IntSet是Redis中set集合的一种实现方式,基于整数数组来实现,并且具备长度可变、有序等特征。 结构如下: typedef struct intset {uint32_t encoding; //编码方式uint32_t l…...
【已解决】Splunk 8.2.X 升级ES 后红色报警
1: 背景: 由于splunk ES 占有很大的computing resource, 所以,Splunk ES 升级到7.1.1 后,有红色的alert. 2: 解决方法: 降低iowait 的 threshold: Investigation The default threshold setting for IOWait is pre-set to a low value and may not be relevant to the …...
香橙派使用外设驱动库wiringOP 配合定时器来驱动舵机
舵机认识和硬件接线 关于舵机也是使用过很多次了,详见: 使用PWM波控制开发SG90-CSDN博客 同时再次回顾香橙派的物理引脚对应: 所以舵机的VCC接 2,GND接 6,PWM接 7(此处写的是物理引脚编号) Li…...
C++学习笔记--函数重载(2)
文章目录 1.3、Function Templates Handling1.3.1、Template Argument Deduction1.3.2、Template Argument Substitution 1.4、Overload Resolution1.4.1、Candidate functions1.4.2、Viable functions1.4.3、Tiebreakers 1.5、走一遍完整的流程1.6、Name Mangling1.7、总结 1.…...
代码随想录算法训练营Day56 || ● 583. 两个字符串的删除操作 ● 72. 编辑距离
今天接触到了真正的距离,但可以通过增删改操作来逼近。 问题1:583. 两个字符串的删除操作 - 力扣(LeetCode) 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字…...
chrome_elf.dll丢失怎么办?修复chrome_elf.dll文件的方法
Chrome是目前最受欢迎的网络浏览器之一,然而有时用户可能会遇到Chrome_elf.dll丢失的问题。该DLL文件是Chrome浏览器的一个重要组成部分,负责启动和管理程序的各种功能。当Chrome_elf.dll丢失时,用户可能无法正常启动Chrome或执行某些功能。本…...
网站建设与管理课程视频/网络推广销售是做什么的
此HTML标签<input id"Radio1" type"radio"/>可完全取代以上2个服务器控件。RadioButtonList及RadioButton依赖于form窗体,产生很多垃圾代码,有时候只是用来显示此方法可取代。aspx:<input type"radio" name"…...
access做动态网站/主流搜索引擎有哪些
2019独角兽企业重金招聘Python工程师标准>>> 为了让mac系统能够实现更多的操作,现在很多用户都会在mac上使用虚拟机,且越来越多的用户正不断认识mac虚拟机,了解它的使用方法,从众多虚拟机中寻找最适合使用的一款虚拟机…...
深圳免费做网站/网络运营seo是什么
7 月 12 日,Python 之父 Guido van Rossum 在 Python 邮件组里发邮称,他将退出 Python 核心决策层,而转居幕后。从 Guido van Rossum 的邮件内容可以看出,他已经厌倦了运营该组织。他在邮件开头写道,「我不想再为 PEP&…...
个人网站备案要钱吗/网页设计与制作教程
javascript中数组数字元素的去重//创建一个数组var arr [1,2,3,2,2,3,4,2,5];//去除数组中重复的数字//获取数组中每一个元素function quchong(){for(var ...SpringCloud 2.x学习笔记:9、Spring Cloud Eureka Server HA高可用 (3个节点) (Greenwich版本)1、Eureka …...
网站开发者不给源代码怎么办/快速优化关键词排名
殊不知,在N年前被奉为“圣经”的数据库设计3范式早就已经不完全适用了。这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用。 由于MySQL数据库是基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方…...
怎么给网站做动图/北京seo网络推广
疫情期间,大多数学子的毕业季都很苦涩,除了求职难,很多同学们甚至无法认真告别,有些同学这次见不到,也许一生都不再见。百度也见证了一场别开生面的“云毕业”,这些同学们来自百度飞桨官方出品的《百度架构…...