Linux perf:系统性能监控和分析工具

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 命令是一个用户空间工具,具备 profilingtracing 和脚本编写等多种功能,是内核子系统 perf_events 的前置工具。通过 perf 命令可以设置和操作内核子系统 perf_events,完成系统性能数据的收集和分析。

内核子系统 perf_events 提供了性能计数器(hardware performance counters)和性能事件的支持,它以事件驱动型的方式工作,通过收集特定事件(如 CPU 时钟周期,缓存未命中等)来跟踪和分析系统性能。perf_events 是在 2009 年合并到 Linux 内核源代码中,成为内核一个新的子系统。

虽然 perf 命令是一个用户空间的应用程序,但它却位于 Linux 内核源代码树中,在 tools/perf 目录下。

perfperf_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<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值