基于 perf_event 的 Linux 系统级分析工具
权衡性能与灵活性,兼容旧内核,可长期运行

C 语言 Linux 3.10+ 30+ 分析器

架构概览

内核态采样 → 三层过滤器 → 环形缓冲区 → 时序排序 → 分析器实时处理

perf-prof framework

设计理念:围绕 Tracepoint 构建分析能力

内核 maintainer 在关键流程上预埋了 tracepoint,理解这些点就是理解内核

🎯 Tracepoint:内核的观测基础设施

内核 maintainer 在调度、内存、文件系统、IO、网络等子系统的关键节点预埋了 tracepoint,每个点标记一个关键的状态转换或决策点。

解决性能问题的本质,就是跟踪和分析 tracepoint 之间的关系 —— 事件的先后顺序、延迟、配对、聚合。

⚠ 原始事件的困境

perf、ftrace 可以采集原始 tracepoint 事件,但一秒内就能产生数十万条。海量原始数据既超出 AI 上下文窗口,也远超人的阅读能力,靠逐条分析无法定位问题。

✓ perf-prof 的方案

在用户态实时处理事件关系,将海量事件压缩为分析结论:

  • • multi-trace — tracepoint 之间的延迟与因果
  • • top / sql — 按维度聚合,输出 Top-N
  • • task-state — 调度事件流 → 状态耗时分布
  • • kmemleak — 配对 alloc/free,只输出泄漏

🤖 AI + perf-prof 协作

AI 理解问题选择 tracepoint
perf-prof 处理过滤、关联、聚合
精简结论延迟分布 / Top-N / 泄漏栈
AI 解读定位上下文可控,结论可达

perf-prof 将数十万条原始事件压缩为数行结论,比 AI 直接消化原始事件流高效几个数量级。

核心特性

事件在内存中实时处理后直接丢弃,可长期运行,安全可靠

内存中实时处理

采样事件不写文件,处理后直接丢弃。无磁盘瓶颈,适合长期运行。

🔌

广泛兼容性

支持 Linux 3.10+(仅需 perf_event),远低于 BCC/bpftrace 的 4.1+ 要求。

🔍

延迟根因分析

multi-trace 事件配对与延迟分析,还原中间事件细节。

🛠

三层过滤 + eBPF

eBPF / trace event / PMU 三层内核态过滤。支持 eBPF 过滤器和 BPF skeleton 分析器。

📈

30+ 内建分析器

覆盖 CPU、内存、调度、IO、虚拟化等场景,紧急问题直接拼命令。

🐍

Python 脚本扩展

事件自动转为 PerfEvent 对象,只需了解字段即可分析,无需编写内核代码。

🔥

火焰图 & 热图

内建火焰图折叠栈和延迟热图,一条命令完成可视化。

🌐

跨主机联合分析

通过 virtio-ports / TCP 传播事件,Guest ↔ Host 跨系统联合分析。

🤖

AI 技能集成

提供 perf-prof skill,AI 自动选择分析器、拼命令、解读结果。

工具定位

在性能、灵活性、跟踪时效、兼容性之间权衡

Linux 跟踪工具优先级

bcc / bpftrace / bpftime性能影响最小,内核态聚合
perf-prof兼容旧内核,延迟根因分析
perf / ftrace短时采样,离线分析
其他特定场景

类比编程语言:C/C++/RustJavaScript/TypeScriptPythonShell

bcc / bpftrace

类比 C/C++/Rust
  • 性能影响最小,内核态聚合
  • 高频事件首选
  • 需 4.1+ 内核
  • 需掌握 eBPF C 代码细节

perf-prof

类比 JavaScript/TypeScript
  • 兼容 3.10 旧内核
  • 延迟根因分析(multi-trace)
  • 紧急问题快速拼命令
  • eBPF 过滤器 + BPF 分析器
  • Python 分析器降低门槛

perf / ftrace

类比 Python
  • 短时采样后离线分析
  • 无长期运行需求时使用
  • 事件写文件,磁盘开销

❯ 优先选 bcc/bpftrace

性能影响最小化,高频事件内核态聚合,新内核(4.1+)环境

❯ 选择 perf-prof

旧内核(3.10+)且需要性能保障;延迟根因分析;紧急问题快速拼命令

❯ 可以用 perf/ftrace

无长期采样需求,短时采样后离线分析即可

Python 分析器

降低跟踪分析的门槛,让更多人能分析性能问题

bcc 的门槛

  • ✗ 需掌握 eBPF C 代码(不同 prog 类型参数不同)
  • ✗ 需了解不同 prog 可调用的 bpf helper
  • ✗ 需理解 perf_event、tracepoint、kprobe、poll

bpftrace 的门槛

  • ✗ 需学习一套全新的跟踪语言
  • ✗ 大量新函数需要记忆
  • ✗ 限制性较大,复杂逻辑难以表达

perf-prof python

  • ✓ 采样事件自动转换为 PerfEvent 对象
  • ✓ 不需要关注如何采样和内核逻辑
  • ✓ 只需了解事件成员即可开始分析
  • ✓ 使用 help 生成模板后修改

分析器一览

每个分析器都是独立模块,针对特定场景优化

分析器功能领域
profileCPU 采样:热点函数定位、火焰图,支持内核/用户态CPU
trace通用事件跟踪:打印事件与调用栈,支持 kprobe / uprobe跟踪
multi-trace多事件关系:延迟分析、事件配对、--detail 还原中间细节延迟
top键值聚合统计:按进程/线程/自定义键排序统计
sqlSQL 聚合查询:基于 SQLite 的灵活事件分析统计
task-state进程状态监控:R/S/D/T 耗时分布与根因分析调度
oncpuCPU 运行监控:实时显示各 CPU 运行进程及时间CPU
blktrace块设备 IO:全生命周期延迟、毛刺检测IO
kvm-exitKVM VM-Exit/Entry 延迟分析与退出原因统计虚拟化
kmemleak内存泄漏检测:内核/用户态分配追踪内存
pythonPython 脚本:自定义脚本处理 perf 事件脚本
syscalls系统调用延迟:完整生命周期分析延迟
rundelay调度延迟:唤醒到实际运行的延迟调度
kmemprof内存分配统计:分配器热点与大小分布内存
bpf:kvm_exit基于 eBPF 的 KVM 退出事件生成虚拟化
watchdog硬锁/软锁检测:预测 lockup 并输出内核栈调试
irq-off中断关闭检测:定位长时间关中断代码段调试
num-dist数值分布:任意字段的直方图与百分位统计
hwstat / llcstat / tlbstat硬件计数器:IPC、LLC 命中率、TLB 命中率硬件
breakpoint硬件断点:监控指定地址的读写调试

按问题类型查找

快速定位合适的分析器

🔴 CPU 使用率高

采样热点函数,生成火焰图

profile oncpu cpu-util

🟠 调度延迟

唤醒 → 运行延迟、进程状态分析

multi-trace rundelay task-state

🟡 IO 性能

块设备 IO 全链路延迟、毛刺检测

blktrace

🟣 内存泄漏

分配/释放配对追踪,泄漏字节统计

kmemleak kmemprof page-faults

🔵 虚拟化开销

VM-Exit 延迟与退出原因统计

kvm-exit bpf:kvm_exit kvmmmu

⬛ 进程 D/S 状态

状态耗时分布与堆栈定位

task-state syscalls

🔸 系统调用慢

系统调用延迟全链路分析

syscalls multi-trace

⬜ 事件聚合统计

按维度聚合,Top-N 排序

top sql num-dist stat

快速开始

安装构建与常见分析场景示例

① 构建安装

# Install dependencies
yum install -y xz-devel elfutils-libelf-devel libunwind-devel python3-devel

# Clone and build
git clone https://github.com/OpenCloudOS/perf-prof.git
cd perf-prof && make

② CPU 热点分析

# Sample kernel CPU hotspots
perf-prof profile -F 997 -g --exclude-user --than 30

# Generate flame graph
perf-prof profile -F 997 -g --flame-graph cpu.folded
flamegraph.pl cpu.folded.folded > cpu.svg

③ 延迟分析

# Scheduling latency > 4ms, with intermediate details
perf-prof multi-trace \
  -e sched:sched_wakeup,sched:sched_wakeup_new \
  -e 'sched:sched_switch//key=next_pid/' \
  -k pid --order --than 4ms --detail

④ 内存泄漏检测

# Track kmalloc/kfree pairs
perf-prof kmemleak \
  --alloc "kmem:kmalloc//ptr=ptr/size=bytes_alloc/stack/" \
  --free "kmem:kfree//ptr=ptr/" \
  --order -m 128 -g

⑤ IO 跟踪

# IO latency > 10ms
perf-prof blktrace -d /dev/sda -i 1000 --than 10ms

# IO latency heatmap
perf-prof blktrace -d /dev/sda --heatmap io_lat

⑥ 进程状态分析

# D state > 100ms, with call stacks
perf-prof task-state -D --than 100ms -g

# S state analysis
perf-prof task-state -S -p <pid> --than 50ms -g