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

Linux上perf工具的使用-基础采样

        perf record 和 perf report是一对配套使用的工具,其中,record用来统计,report用来展示。执行record这个命令后,会在当前目录下产生一个 perf.data 文件,接下来就可以使用 perf report 命令来分析这份采样记录了。

        常用使用命令

        ./perf record ./perfdemo

        ./perf report

测试代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>#define SIZE 1000000int cpu_intensive()
{volatile double sum = 0;int v = 0;for (int i = 0; i < SIZE * 2; i++){v = tan(i);sum += v;}return sum;
}int cpu_test()
{return cpu_intensive();
}int main()
{printf("===== perfdemo =====\n");while(1){cpu_test();}return 0;
}

编译 aarch64-linux-gnu-gcc -g -O0 -fno-omit-frame-pointer -o perfdemo perfdemo.c -lm

命令解析

其中各个字段意义

(1) cycles:ppp 事件

cycles:监控CPU时钟周期(硬件性能计数器)

:ppp 修饰符:

precise(精确):使用PEBS(精确事件采样)技术,减少采样偏差

per-process(进程级):仅统计目标进程的周期

per-core(核心级):不跨CPU核心统计

       在record的时候,可以用-e指定记录哪个event。支持哪些event,可以使用pert list查看。

(2) Overhead%

计算公式:(符号的采样数 / 总采样数) * 100%

你的数据示例:

40.21% 表示该地址(0x880)消耗了约40.21%的总CPU周期

结合Event count,可估算绝对耗时:88.75亿 cycles * 40.21% ≈ 35.67亿 cycles

       想要查看CPU占用率的话,可以使用-g或 --call-graph记录调用信息

./perf record -g --call-graph fp -e cycles:ppp ./perfdemo

(3) Symbol函数名

       正常应该显示函数名称,显示地址可能是没加调试信息无调试符号,也可能跟系统有关。

其中 [.] 表示用户空间函数,[k] 表示内核函数

调试过程

查看内容,CPU占用率最高的是

10.96%  perfdemo  libm-2.28.so       [.] 0x000000000003e3dc

由于系统原因,没有直接打出函数名,所以我们只能通过地址查找是哪个函数接口。根据Shared Objec信息我们可以知道这个接口在libm库里,那我们objdump这个库拿到符号信息。

objdump -D /lib/aarch64-linux-gnu/libm.so.6 > libmdump

       打开这个文件,搜索3e3d0地址。可以看到是tan接口,跟代码一致,是占用最多的接口。

       objdump perfdemo也能根据0x400578-> 0x4006e8-> 0x4006e8-> 0x400670地址查到调用关系,直至定位到tan接口。

       objdump perfdemo -D perfdemo > perfdump

      

http://www.xdnf.cn/news/1422973.html

相关文章:

  • 命名空间级别应用 Pod 安全标准
  • 从组分到涌现:系统科学视域下结构、功能与层级的辨析及在人工智能中的应用
  • 安全等保复习笔记
  • 大模型 RAG 项目必看:技术架构拆解 + 实战步骤,新手也能快速上手
  • 内存管理 - 从虚拟到物理
  • Java全栈工程师面试实战:从基础到微服务的深度解析
  • CentOS10安装RabbitMQ
  • Spring Bean 生命周期中的 @PostConstruct 注解
  • NestJS 3 分钟搭好 MySQL + MongoDB,CRUD 复制粘贴直接运行
  • 【C++进阶篇】学习C++就看这篇--->多态超详解
  • 传统web项目,vue开发实践篇01
  • 微服务Docker-compose之若依部署
  • 视频提取文字用什么软件好?分享6款免费的视频转文字软件!
  • apipost 8.x 脚本循环调用接口
  • 云手机为什么会受到广泛关注?
  • 单链表的基本原理与实现
  • 深入掌握 Flask 配置管理:从基础到高级实战
  • uniapp使用uview UI,自定义级联选择组件
  • 六、练习3:Gitee平台操作
  • RSA的CTF题目环境和做题复现第1集
  • shell——函数与数组
  • 华东制造企业推荐的SD-WAN服务商排名
  • java中常见的几种排序算法
  • 毕业设计:丹麦电力电价预测预测未来24小时的电价pytorch+lstm+历史特征和价格+时间序列 电价预测模型资源 完整代码数据可直接运行
  • js脚本和ts脚本相互调用
  • 虚拟机一插SD卡就蓝屏,导致整个电脑系统蓝屏怎么办
  • 一、SVN与svnbucket.com常见问题解答
  • PTP高精度时间同步的核心:E2E与P2P延迟补偿机制
  • FPGA|Quartus II 中pll IP核的具体使用方法
  • 优化正则表达式性能:预编译与模式匹配的最佳实践