加餐02 | 理解perf:怎么用perf聚焦热点函数?

本文仅作为学习记录,非商业用途,侵删,如需转载需作者同意。

一、问题回顾

什么情况下使用perf工具的,perf工具给我们带来了哪些信息?

在调试网路延时的时候,我们使用了 ebpf 的工具之后,发现了节点上一个 CPU,也就是 CPU32 的 Softirq CPU Usage(在运行 top 时,%Cpu 那行中的 si 数值就是 Softirq CPU Usage)时不时地会增高一下。

在发现CPU Usage 异常增高的时候,肯定需要排查是什么程序导致的,这个时候就用到了 perf。

抓取数据,数据读取,异常聚焦三个步骤

第一步:抓取数据
# perf record -C 32 -g -- sleep 10

命令解释:
-C 32 指定只抓取CPU32执行的指令
-g 是指 call-graph enable 也就是记录函数调用关系
sleep 10 主要是为了让perf 抓取10秒钟的数据

然后使用 perf report 读取数据。
为了更直观的查看CPU32上的函数调用情况,做了一个火焰图(火焰图的生产方法,后续介绍)

火焰图中发现在softirq 里 TIMER softirq (run_timer_softirq) 占比很高,并且timer 主要处理的都是 estimation_timer() 这个函数,也就是看火焰图X轴占比比较大的函数。

第三步异常聚焦,找了异常占比中的异常函数,后续就重点关注这个函数的情况。

perf 可以在CPU Usage增高的节点上找到具体的引起CPU增高的函数,然后我们就可以有针对性的聚焦到那个函数分析。

二、如何理解perf的概念和工作机制

Perf 这个工具最早是 Linux 内核著名开发者 Ingo Molnar 开发的,它的源代码在内核源码tools 目录下,在每个 Linux 发行版里都有这个工具,比如 CentOS 里我们可以运行 yum install perf 来安装,在 Ubuntu 里我们可以运行 apt install linux-tools-common 来安装。

2.1、event

perf list 可以列出 event 信息


 # perf list
…
  branch-instructions OR branches                    [Hardware event]
  branch-misses                                      [Hardware event]
  bus-cycles                                         [Hardware event]
  cache-misses                                       [Hardware event]
  cache-references                                   [Hardware event]
  cpu-cycles OR cycles                               [Hardware event]
  instructions                                       [Hardware event]
  ref-cycles                                         [Hardware event]
 
  alignment-faults                                   [Software event]
  bpf-output                                         [Software event]
  context-switches OR cs                             [Software event]
  cpu-clock                                          [Software event]
  cpu-migrations OR migrations                       [Software event]
  dummy                                              [Software event]
  emulation-faults                                   [Software event]
  major-faults                                       [Software event]
  minor-faults                                       [Software event]
  page-faults OR faults                              [Software event]
  task-clock                                         [Software event]
…
 
  block:block_bio_bounce                             [Tracepoint event]
  block:block_bio_complete                           [Tracepoint event]
  block:block_bio_frontmerge                         [Tracepoint event]
  block:block_bio_queue                              [Tracepoint event]
  block:block_bio_remap                              [Tracepoint event]

接下来我们就说三个主要的 event,它们分别是 Hardware event、Software event 还有 Tracepoints event。

2.2、Hardware event

Hardware event 来自处理器的一个PMU(Performance Monitoring Unit)这些event 数目不多,都是底层处理器相关的行为,perf 中会命名几个通用的事件,比如 cpu-cycles,执行完成的 instructions,Cache 相关的 Cache-misses。

后面感觉有些难,先不看了。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Perf是一款Linux内核自带的程序性能分析工具,可以用于分析程序的CPU时间占用情况、函数调用关系、缓存命中率等信息。下面是使用Perf进行程序性能分析的步骤: 1. 安装PerfPerf通常已经预装在Linux系统中,如果没有安装,可以使用以下命令安装: ``` sudo apt-get install linux-tools-common linux-tools-generic linux-tools-$(uname -r) ``` 2. 编译程序时添-g选项:Perf需要程序符号表信息才能进行函数调用关系的分析,因此需要在编译程序时添-g选项,例如: ``` gcc -g -o myprogram myprogram.c ``` 3. 运行Perf:运行Perf需要使用root权限,因为Perf需要访问系统的计数器和内核数据结构。使用以下命令运行Perf: ``` sudo perf record -g ./myprogram ``` 该命令将会启动Perf进行性能分析,-g选项表示要收集函数调用关系信息。 4. 分析性能数据:Perf会将性能数据保存在perf.data文件中,可以使用以下命令查看性能数据: ``` sudo perf report ``` 该命令将会启动Perf进行性能数据分析,生成一个报告,包含了程序的函数调用关系、CPU时间占用情况、缓存命中率等信息。 以上是使用Perf进行程序性能分析的基本步骤,需要根据具体的情况和需求进行调整和优化。例如,可以使用Perf的更多选项和参数来收集更详细的性能数据,也可以使用Perf的插件和可视化工具来更方便地分析性能数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值