1. 写在前面
Linux perf
是 Linux 2.6+ 后内置于内核源码树中的性能剖析(profiling)工具,它基于事件采样,以性能事件为基础,针对 CPU 相关性能指标与操作系统相关性能指标进行性能剖析,可用于性能瓶颈查找与热点代码的定位。包含在 Linux 内核 tools/perf
下,通过命令 perf
实现一组子命令:stat , record , report ,[…]
2. perf 是什么?
perf
是由 Linux 官方提供的系统性能分析工具,perf
包含两部分:
-
perf 命令:用户空间应用程序;
-
perf_events:Linux 内核子系统;
perf
命令是一个用户空间工具,具备 profiling
、tracing
和脚本编写等多种功能,是内核子系统 perf_events
的前置工具。通过 perf
命令可以设置和操作内核子系统 perf_events
,完成系统性能数据的收集和分析。
内核子系统 perf_events
提供了性能计数器(hardware performance counters)和性能事件的支持,它以事件驱动型的方式工作,通过收集特定事件(如 CPU 时钟周期,缓存未命中等)来跟踪和分析系统性能。perf_events 是在 2009 年合并到 Linux 内核源代码中,成为内核一个新的子系统。
虽然 perf
命令是一个用户空间的应用程序,但它却位于 Linux 内核源代码树中,在 tools/perf
目录下。
perf
和 perf_events
最初支持硬件计数器(performance monitoring counters,PMC),后来逐步扩展到支持多种事件源,包括:tracepoints、kernel 软件事件、kprobes、uprobes 和 USDT(User-level statically-defined tracing)。
下图显示了 perf
命令和 perf_events
的关系,以及 perf_events
支持的事件源。
2.1 perf event
perf
支持来自硬件和软件等方面的各种事件。如下图所示:
event 类型包括:
-
Hardware Events: CPU 性能监视计数器 PMCs;
-
Software Events: 基于内核计数器的低级别事件。例如,CPU迁移、 缺页中断(minor faults, major faults)等等。
-
Kernel Tracepoint Events: 硬编码在内核中的静态内核级的检测点,即静态探针
-
User-Level Statically-Defined Tracing (USDT): 这些是用户级程序和应用程序的静态跟踪点。
-
Dynamic Tracing: 可以被放置在任何地方的动态探针。对于内核软件,可使用 kprobes 框架,对于用户级软件,则使用 uprobes。
-
Timed Profiling: 使用
perf record -FHz
选项以指定频率收集的快照。这通常用于 CPU 使用情况分析,其工作原理是周期性的产生时钟中断事件。
与其他性能分析工具相比,perf
特别适合 CPU 分析,它能对运行在 CPU 上代码调用栈(stack traces)进行采样,以确定程序在 CPU 上的运行情况,识别和优化代码中的热点。这种 CPU Profiling 能力是基于硬件计数器 (performance monitoring counters,PMC) 实现的,而 PMC 被内核子系统 perf_events 包装成了 Hardware Event。
list
子命令列出当前可用的事件:
root@dev:~# sudo perf list
---------------------------------------------------------------------------------
List of pre-defined events (to be used in -e):
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]
duration_time [Tool event]
msr/smi/ [Kernel PMU event]
msr/tsc/ [Kernel PMU event]
rNNN [Raw hardware event descriptor]
cpu/t1=v1[,t2=v2,t3 ...]/modifier [Raw hardware event descriptor]
(see 'man perf-list' on how to encode it)
mem:<addr>[/len][:access] [Hardware breakpoint]
alarmtimer:alarmtimer_cancel [Tracepoint event]
alarmtimer:alarmtimer_fired [Tracepoint event]
... ...
200多本网络安全系列电子书
网络安全标准题库资料
项目源码
网络安全基础入门、Linux、web安全、攻防方面的视频
网络安全学习路线图
2.2 采样事件
perf -FHz
:perf 每隔一个固定的时间,就在CPU上(每个核上都有)产生一个中断,在中断上看看,当前是哪个pid,哪个函数,然后给对应的pid和函数加一个统计值,这样,我们就知道CPU有百分几的时间在某个pid,或者某个函数上了。
这种方式可以推广到各种事件,此时使用的不再是 -FHz
指定的频率,而是 -e
参数指定的各种 event。当指定的事件发生的时候,perf
就会上来冒个头,看看击中了谁,然后算出分布,我们就知道谁会引发特别多的那个事件了。
所以本质上 perf
属于一种抽样统计。既然是抽样统计我们就要警惕抽样带来的抽样误差。每次看 perf report
的报告,首先要去注意一下总共收集了多少个点,如果你只有几十个点,你这个报告就可能很不可信了。
3. 如何安装 perf
3.1 安装
Linux 系统上没有预装 perf
程序,安装方式因 Linux 发行版而异:
Ubuntu/Debian:
sudo apt install linux-tools-$(uname -r) linux-tools-generic
RHEL/CentOS:
sudo yum install perf
Fedora:
sudo dnf install perf
打印版本号,表明安装成功。
root@dev:~# perf --version
---------------------------------------------------------------------------------
perf version 5.4.257
3.2 允许普通用户使用
perf<