linux perf tool分析

linux perf tool

Linux perf 是一个强大的性能分析工具,广泛用于内核与用户空间的性能剖析。其原理涉及 **PMU(Performance Monitoring Unit)**硬件事件收集、内核的 perf 子系统(perf_event)、以及用户态工具链。以下是对 perf 原理的系统性分析:

perf 总体架构

+-----------------------------+
|    perf (用户空间工具)     |
+-----------------------------+
             │
             ▼
+-----------------------------+
|      perf_event 内核模块    |
|  (drivers/perf/, kernel/events/) |
+-----------------------------+
             │
             ▼
+-----------------------------+
|   CPU Performance Counter   |
|   (PMU: Performance Monitoring Unit) |
+-----------------------------+

工作流程详解

  1. 事件来源

perf 支持多种事件:

  • 硬件事件(HW):
    • cycles:CPU周期
    • instructions:指令执行数
    • cache-misses:缓存未命中
  • 软件事件(SW):
    • cpu-clock:CPU时钟周期
    • page-faults:页面错误
    • context-switches:上下文切换次数
  • 内核 Tracepoints
  • 动态探针(Kprobe/Uprobe)
  • eBPF 支持的高级事件
  1. 事件注册与采样

用户执行如 perf record -e cycles ./app 时:

  • perf 用户工具通过 perf_event_open() 系统调用注册事件
  • 内核 perf_event 框架建立 event 结构,设置采样参数(频率/周期/阈值)
  • 内核分配 buffer(基于 mmap)用于用户态读取
  • 设置中断处理(PMU 溢出触发)
  1. 采样过程

硬件事件发生达到设定阈值后:

  • PMU 触发中断(如 NMI)
  • perf_event 中断处理函数被调用
  • 内核采集当前指令地址、寄存器、调用栈等上下文
  • 写入到 mmap 环形缓冲区中(perf ring buffer)
  1. 数据收集与分析
  • perf record:收集采样数据(存在 .data 文件中)
  • perf report:对记录数据解码,呈现出热点函数、调用图等信息
  • perf top:实时分析性能热点

核心模块分析(内核)

  1. perf_event_open 系统调用
int perf_event_open(struct perf_event_attr *attr,
                    pid_t pid, int cpu, int group_fd,
                    unsigned long flags);
  • pid=-1 表示采集当前进程
  • cpu=-1 表示采集当前 CPU
  • 内核会构造 struct perf_event 并加入 perf_event_context
  1. 事件调度与 PMU 驱动

PMU 驱动位于:

arch/x86/events/intel/core.c (Intel)
arch/arm64/kernel/perf_event.c(ARM)
  • 负责写入硬件寄存器:如 IA32_PERFEVTSELx, IA32_PMCx
  • 控制采样阈值、中断使能等
  • 支持硬件溢出中断回调
  1. 采样数据写入缓冲区
  • perf_event_ring_buffer 为每个 perf event 分配一段共享内存
  • 用户态通过 mmap() 映射 ring buffer 到用户空间
  • perf 会在其中读取 sample event(含 PC, callchain, register 等)

关键结构体

  • struct perf_event:核心事件描述
  • struct perf_event_attr:用户空间传入参数
  • struct perf_sample_data:采样数据上下文
  • struct ring_buffer:采样数据缓存区

典型用法举例

  1. 查看热点函数
perf record ./app
perf report
  1. 实时分析(类似 top)
perf top
  1. 采样特定事件
perf record -e cache-misses ./app
  1. 采样内核事件
perf record -e sched:sched_switch -aR

与 eBPF 的结合(新趋势)

  • perf 可用于收集 BPF 程序的输出
  • perf buffer 也用于 bpf 程序 bpf_perf_event_output() 写入事件
  • perf + bpf tools(如 bpftools, bcc, bpftrace)形成更现代的性能分析平台

perf 的优势

特性描述
精度高依赖硬件 PMU,纳秒级别采样精度
低开销NMI 中断采样不干扰主流程
事件灵活支持硬件/软件/kprobe/uprobe/BPF
实时分析能力perf top, perf sched, perf trace
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值