perf-prof 是一款 Linux 系统级性能分析工具,专为长期性能监控设计,具有低开销、广泛兼容性和高可靠性的特点。
您正在阅读中文版文档。English version available.
perf-prof 是一款用户态性能分析工具,基于 libperf、libtraceevent 和 libbpf 构建。它提供实时分析能力,无需将事件数据写入磁盘,在内存中处理并立即丢弃。
- 内存处理:事件在内存中处理并立即丢弃,无持久化存储开销
- 广泛兼容:支持旧版 Linux 内核(需要 perf_event 支持)
- 用户态实现:安全执行,快速迭代
- 模块化架构:30+ 专用分析器应对不同场景
- 低开销:内核级过滤减少用户空间数据传输
- 实时分析:实时处理事件,即时反馈
# 安装必需依赖
yum install -y xz-devel elfutils-libelf-devel
# 可选:安装 eBPF 依赖
yum install -y llvm bpftool# 克隆仓库
git clone https://github.com/OpenCloudOS/perf-prof.git
cd perf-prof
# 构建项目
make
# 详细构建输出
make V=1
# 清理构建产物
make clean# 使用 CROSS_COMPILE
make CROSS_COMPILE=aarch64-linux-gnu-
# 使用 LLVM
make LLVM=1无需安装系统 python3-devel,可使用 python-build-standalone 启用 Python 分析器:
# 下载(自动检测架构,默认 Python 3.12)
packages/download-python-standalone.sh
# 解压
tar xzf cpython-*.tar.gz
# 使用 standalone Python 构建
make PYTHON=python/bin/python3PYTHON= 选项会自动检测 standalone Python 的路径,设置 PYTHONHOME,并添加 -Wl,-rpath 链接 bundled libpython。可通过 PYTHON_HOME= 覆盖安装路径。
# 列出所有分析器
./perf-prof -h
# 列出所有 tracepoint 事件
./perf-prof list# 以 997Hz 采样分析 CPU 使用情况,包含调用栈
./perf-prof profile -F 997 -g
# 使用 DWARF unwind 采样用户态调用栈(比帧指针更可靠)
./perf-prof profile -F 997 -g --user-callchain=dwarf
# 生成火焰图
./perf-prof profile -F 997 -g --flame-graph cpu.folded
# 仅分析用户态,指定 CPU,显示超过 30ms 的采样点
./perf-prof profile -F 997 -C 0-3 --exclude-kernel --than 30# 检测内核内存泄露
./perf-prof kmemleak --alloc "kmem:kmalloc//ptr=ptr/size=bytes_alloc/stack/" \
--free "kmem:kfree//ptr=ptr/" --order -m 128 -g# 监控任务状态(R, S, D, T, I)
./perf-prof task-state -i 1000# 跟踪特定事件
./perf-prof trace -e sched:sched_wakeup,sched:sched_switch -i 1000
# 跟踪并过滤
./perf-prof trace -e "sched:sched_wakeup/prio<10/" -i 1000perf-prof 提供 30+ 专用分析器,按类别组织:
- profile - CPU 性能采样分析
- oncpu - 监控 CPU 上运行的进程
- kmemleak - 内存泄露检测
- kmemprof - 内存分配分析
- page-faults - 页面异常跟踪
- task-state - 进程状态监控(R, S, D, T, I)
- rundelay - 调度运行延迟分析
- blktrace - 块设备 I/O 跟踪
- kvm-exit - KVM 退出延迟分析
- kvmmmu - KVM MMU 映射观察
- hwstat - 硬件状态监控(cycles, IPC)
- llcstat - 最后一级缓存监控
- tlbstat - dTLB 监控
- ldlat-loads - Intel 加载延迟计数
- ldlat-stores - Intel 存储指令计数
- split-lock - x86 分裂锁检测
- hrtimer - 高精度条件采样
- irq-off - 中断关闭检测
- watchdog - 硬锁和软锁检测
- sql - SQL 聚合分析(基于 SQLite)
- top - 键值统计分析
- multi-trace - 多事件关系分析
- syscalls - 系统调用延迟分析
- python - Python 脚本事件处理
- trace - 事件跟踪
- list - 列出 tracepoint 事件
- expr - 表达式测试工具
- usdt - 用户静态定义跟踪
- breakpoint - 内核/用户空间硬件断点
- kcore - 读取内核内存
- misc - 杂项跟踪
perf-prof 遵循三层事件选择规范:
# 列出所有事件
./perf-prof list
# 按类别过滤
./perf-prof list | grep -E "^(sched:|kmem:|timer:|irq:)"# 查看事件字段
./perf-prof trace -e sched:sched_wakeup help
# 多个事件
./perf-prof trace -e sched:sched_wakeup,sched:sched_switch helpEVENT: sys:name[/filter/ATTR/ATTR/.../]
kprobe:func[/filter/ATTR/ATTR/.../]
kretprobe:func[/filter/ATTR/ATTR/.../]
uprobe:func@"file"[/filter/ATTR/ATTR/.../]
uretprobe:func@"file"[/filter/ATTR/ATTR/.../]
# 数值比较
./perf-prof trace -e "sched:sched_wakeup/pid>1000/"
./perf-prof trace -e "sched:sched_wakeup/prio<10/"
# 字符串匹配
./perf-prof trace -e 'sched:sched_wakeup/comm=="java"/'
./perf-prof trace -e 'sched:sched_wakeup/comm~"pyth*"/'
# 逻辑组合
./perf-prof trace -e "sched:sched_wakeup/pid>1000 && prio<10/"stack # 启用调用栈
alias=str # 事件别名
max-stack=int # 最大栈深度
key=EXPR # 事件关联键
top-by=EXPR # 排序字段
comm=EXPR # 进程名显示
ptr=EXPR # 指针字段
size=EXPR # 大小字段
num=EXPR # 数值分布字段# 分析器帮助(包含示例)
./perf-prof trace -h
./perf-prof task-state -h
# 事件帮助(包含字段信息)
./perf-prof trace -e sched:sched_wakeup help
./perf-prof kmemleak --alloc kmem:kmalloc --free kmem:kfree help- 主要选项参考 - 完整命令行选项
- profile - CPU 性能分析
- task-state - 进程状态监控
- multi-trace - 多事件分析
- sql - SQL 聚合分析
- top - 键值统计
- kmemleak - 内存泄露检测
- kvm-exit - KVM 退出分析
- blktrace - 块设备 I/O 跟踪
- trace - 事件跟踪
- python - Python 脚本事件处理
# 运行所有测试
cd tests
pytest
# 运行特定测试文件
pytest test_profile.py
# 使用自定义运行时和内存泄漏检查
pytest --runtime=20 --memleak-check=2000perf-prof/
├── src/ # 项目源码
│ ├── *.c # 核心框架和分析器模块(30+ 个分析器)
│ ├── bpf-skel/ # BPF skeleton 程序
│ ├── filter/ # 事件过滤器(BPF, tracepoint, PMU)
│ └── sqlite/ # SQLite源码和扩展模块
├── lib/ # 基础库(libperf, libtraceevent, libbpf)
├── arch/ # 架构相关代码
├── include/ # 包含头文件
├── tests/ # 测试套件
├── docs/ # 文档
├── packages/ # 打包脚本和补丁
└── skills/ # AI 辅助分析技能包
监控框架:
src/monitor.c/h- 核心框架src/tep.c/h- Trace 事件解析器src/trace_helpers.c/h- Trace 事件工具src/stack_helpers.c/h- 栈遍历和符号解析
分析单元:
- 每个分析器都是
src/下独立的.c文件 - 通过
PROFILER_REGISTER()宏注册 - 支持
init,deinit,interval,read,sample回调
事件源 → 过滤器 → 环形缓冲区 → 排序 → 分析器 → 输出
- 创建源文件
src/new_profiler.c - 实现
profiler结构体及所需回调 - 定义
name,desc,argc,option - 使用
PROFILER_REGISTER()注册 - 在
src/Build文件中添加:perf-prof-y += new_profiler.o - 在
tests/目录中添加测试
欢迎贡献!请遵循以下准则:
- Fork 仓库
- 创建特性分支
- 为新功能编写测试
- 确保所有测试通过
- 提交 Pull Request
本项目采用 GPLv2 许可证。详见 LICENSE。
- 遵循 Linux 内核编码风格
- 编写清晰、可维护的代码
- 为新功能包含测试
- 编写公共 API 和接口文档
基于 Linux内核 组件构建:
- libperf
- libtraceevent
- libbpf
- 其他实用库
