Perf使用、CPU飙高问题排查

579 阅读1分钟

Perf使用

Perf 是 Linux 内核自带的一个性能工具,基于 perf_events 接口,用于监控和分析硬件及软件事件(如 CPU 周期、指令执行、缓存命中、系统调用等)。

安装

使用 which perf 查看是否已经安装 perf,如果已经安装可以跳过

yum install perf

常用命令

  1. 实时监控

    实时显示占用 CPU 最多的函数(类似 top 命令)。

    perf top
    
  2. 统计程序运行指标

    输出程序运行时的 CPU 周期、指令数、缓存命中率等统计信息。

    perf stat ./your_program
    
  3. 记录性能数据

    生成 perf.data 文件,后续用 perf report 分析。

    perf record ./your_program
    
  4. 生成分析报告

    交互式查看热点函数、调用链等。

    perf report
    
  5. 跟踪特定事件

    自定义监控事件并统计。

    perf stat -e cycles,instructions,cache-misses ./your_program
    

CPU飙高问题排查

使用 Perf 问题排查某个进程 CPU 飙高问题。

  1. 使用 top找到 cpu 飙高的程序 pid,比如 pid 为 12345

  2. 使用 perf record 监控指定 PID

    # -F 99 代表每秒采样 99 次
    perf record -F 99 -p 622794 --call-graph dwarf -- sleep 10
    
  3. 生成性能报告

    运行 perf report 分析生成的 perf.data 文件:

    sudo perf report
    
  4. 输出示例

    perf report 中,看到如下内容。 可以看到sieve_of_eratosthenes(int) 这个函数占用了几乎全部的CPU。

    image-20250504213025208

CPU火焰图

结合 perf scriptFlameGraph 工具生成可视化火焰图:

perf record -F 99 -p 622794 --call-graph dwarf -- sleep 10
perf script > out.perf
# 安装FlameGraph 已经安装可以忽略
wget https://github.com/brendangregg/FlameGraph/archive/master.zip
unzip master.zip
# stackcollapse-perf 和 flamegraph 是FlameGraph内的文件
FlameGraph-master/stackcollapse-perf.pl out.perf > out.folded
FlameGraph-master/flamegraph.pl out.folded > cpu_flamegraph.svg

image-20250504214041824