Perf 使用简介

2019-02-07 Thursday     linux , program

Perf 是一款随 Linux 内核代码一同发布和维护的性能诊断工具,由内核社区维护和发展,不仅可以用于应用程序的性能统计分析,也可以应用于内核代码的性能统计和分析。

可以分析程序运行期间发生的硬件事件,比如 instructions retired ,processor clock cycles 等;也可以分析软件事件,比如 Page Fault 和进程切换。

这里简单介绍。

简介

性能调优工具如 perf,Oprofile 等的基本原理都是对被监测对象进行采样,最简单的情形是根据 tick 中断进行采样,即在 tick 中断内触发采样点,在采样点里判断程序当时的上下文。

假如一个程序 90% 的时间都花费在函数 foo() 上,那么 90% 的采样点都应该落在函数 foo() 的上下文中。

安装

在 CentOS 中可以直接通过 yum install perf 安装,或者在内核源码 tools/perf 目录下通过 make && make install 进行编译安装,安装时不需要 root,将安装在 home 目录下。

使用

所支持的功能包括了 Hardware Event (硬件事件,需要类似 Performance Monitoring Unit, PMU 的硬件支持)、Software Event(内核软件事件,如进程切换)、Tracepoint Event(内核静态跟踪点) 等。

perf 通过 perf <subcmd> 执行,大概有二十多个子命令,可通过 pref help [subcmd] 查看,其中最常用的有 list、stat、top、record、report。

支持事件

首先确认内核是否支持。

$ cat "/boot/config-`uname -r`" | grep "PERF_EVENTS"
CONFIG_PERF_EVENTS_INTEL_UNCORE=y
CONFIG_HAVE_PERF_EVENTS=y
CONFIG_PERF_EVENTS=y
CONFIG_HAVE_PERF_EVENTS_NMI=y

常用命令

通过 list 子命令查看时,默认会打印所有,可以通过添加子集过滤所需要的事件,如 hw、sw、cache、tracepoint、pmu、event_glob 等。

不同的系统会列出不同的结果,大致可以将分为三类:

  • Hardware Event。由 PMU 硬件产生的事件,比如 Cache 命中,当需要了解程序对硬件特性的使用情况时,便需要对这些事件进行采样;
  • Software Event。是内核软件产生的事件,与硬件无关,比如进程切换,tick 数等;
  • Tracepoint Event。内核中的静态 Tracepoint 所触发的事件,基于 ftrace 用来判断程序运行期间内核的行为细节,比如 slab 分配器的分配次数等。

注意,很多情况下虚机上是无法支持的。

perf top

对整个系统直接进行采样,可以直接看到消耗最多的函数,也可以通过 -e 指定关注的事件,默认是 cycles 。

# perf top -e cache-misses              # 造成cache miss最多的函数

源码解析

如上所述,源码在内核的 tools/perf 目录下,其中入口在 main()@perf.c,会根据子命令调用不同的函数,如 cmd_list()@builtin-list.ccmd_stat()@builtin-stat.c 等。

list

该指令对应 cmd_list() 函数,该函数依赖 debugfs,在 tracing/events 目录下。

参考



如果喜欢这里的文章,而且又不差钱的话,欢迎打赏个早餐 ^_^


About This Blog

Recent Posts

Categories

Related Links

  • RTEMS
    RTEMS
  • GNU
  • Linux Kernel
  • Arduino

Search


This Site was built by Jin Yang, generated with Jekyll, and hosted on GitHub Pages
©2013-2019 – Jin Yang