Linux perf 指令

Linux perf 指令

perf 是 Linux 系统中一款功能强大的性能分析工具,集成了内核和用户空间的性能监控功能,用于诊断系统性能瓶颈、分析应用程序行为以及优化硬件资源利用。它是 Linux 内核提供的原生工具,广泛应用于系统管理员、开发者和性能工程师的工作中。perf 支持多种性能事件(如 CPU 周期、缓存未命中、系统调用),并提供采样、统计和跟踪等功能。结合其子命令和选项,perf 可实现从全局监控到代码级分析的全面性能诊断。


📚 什么是 perf 指令?

概述

perf 是 Linux 内核提供的性能分析工具,集成在 linux-tools 软件包中,通常随内核源码分发。它通过访问硬件性能计数器(PMC)、内核跟踪点和用户态事件,提供系统和应用程序的性能数据。perf 由 Linux 内核开发者维护,支持大多数现代 Linux 发行版(如 Ubuntu、CentOS、Arch Linux)。perf 的核心功能包括性能采样(profiling)、事件统计、动态跟踪和调用栈分析,适用于 CPU、内存、I/O 和内核等性能分析场景。它的设计注重高效性和灵活性,能够从系统级到代码级提供细粒度洞察。

核心概念

  • 性能事件(Events)
    • 硬件事件:CPU 周期、指令数、缓存未命中。
    • 软件事件:上下文切换、页面错误。
    • 跟踪点事件:系统调用、调度事件。
    • 动态事件:kprobes、uprobes。
  • 采样(Profiling)
    • 定期记录程序计数器(PC),生成性能热点图。
  • 统计(Counting)
    • 累计事件发生次数,提供总量分析。
  • 跟踪(Tracing)
    • 记录事件的时间序列,分析动态行为。
  • 调用栈(Call Stack)
    • 捕获函数调用链,定位性能瓶颈。
  • 性能计数器(PMC)
    • 硬件提供的寄存器,记录低级事件。
  • 子命令
    • stat:事件统计。
    • record:采样数据。
    • report:分析采样结果。
    • trace:系统调用跟踪。
  • 退出状态
    • 成功:返回 0。
    • 失败(如权限不足):返回非 0。

核心特点

  • 多维度分析:支持硬件、软件和内核事件。
  • 高效采样:低开销,适合生产环境。
  • 灵活子命令:覆盖统计、采样和跟踪。
  • 跨平台:支持 x86、ARM 等架构。
  • 脚本集成:与 Python、Perl 等结合。
  • 可视化支持:生成火焰图、热点图。

基本语法

perf [子命令] [选项] [命令]
参数说明
  • 子命令
    • stat:统计事件。
    • record:记录采样数据。
    • report:查看采样结果。
    • list:列出支持的事件。
    • trace:跟踪系统调用。
    • sched:调度分析。
    • lock:锁分析。
  • 选项
    • -e EVENT:指定事件(如 cycles)。
    • -p PID:监控特定进程。
    • -a:系统范围监控。
    • -g:捕获调用栈。
    • -F FREQ:采样频率。
    • -o FILE:输出文件。
    • –help:显示帮助。
  • 命令
    • 要监控的程序(如 ls、make)。
  • 输出行为
    • 根据子命令,输出统计、报告或数据文件。
    • 错误(如权限不足)输出到 stderr。

注意事项

  • 权限要求

    • 部分功能需 root 权限:

      sudo perf stat ls
      
    • 调整 /proc/sys/kernel/perf_event_paranoid:

      echo 0 | sudo tee /proc/sys/kernel/perf_event_paranoid
      
  • 内核支持

    • 要求 Linux 2.6.31+,推荐 4.x+。
  • 硬件依赖

    • PMC 依赖 CPU 型号(如 Intel、AMD)。
  • 安装检查

    • 确保安装:

      sudo apt install linux-tools-common linux-tools-$(uname -r)  # Ubuntu
      sudo dnf install perf  # CentOS
      
  • 数据大小

    • 采样数据可能占用大量磁盘。
  • 安全性

    • 谨慎在生产环境高频采样。

🔧 perf 的常见用途

应用场景

  • 性能瓶颈诊断:定位 CPU、内存或 I/O 问题。
  • 代码优化:分析函数和指令级性能。
  • 系统监控:观察全局或进程级行为。
  • 内核调试:跟踪系统调用和调度。
  • 锁分析:诊断多线程竞争。
  • 硬件利用率:评估缓存和分支预测。

🛠️ 基础用法与示例

准备工作

以下示例假设运行在 Bash shell(如 Ubuntu 24.04,当前时间为 2025年6月17日周二上午8:20 CST)。测试环境为标准 Linux 系统(4核 Intel CPU,16GB 内存),确保 perf 已安装(perf --version)。示例涉及 CPU 密集型程序、系统调用跟踪和采样分析,假设用户具有 root 权限。命令在终端运行,系统支持 UTF-8 编码。

检查 perf
perf --version

输出:

perf version 6.8.dist
安装 perf
sudo apt update
sudo apt install linux-tools-common linux-tools-$(uname -r)
创建测试程序
cat > /tmp/test.c <<EOF
#include <stdio.h>
int main() {
    for (long i = 0; i < 1000000000; i++) {
        volatile int x = i * i;
    }
    printf("Done\n");
    return 0;
}
EOF
gcc /tmp/test.c -o /tmp/test

示例 1:统计 CPU 事件

命令
sudo perf stat /tmp/test
说明
  • 统计程序的默认性能事件(如 CPU 周期、指令)。
输出
 Performance counter stats for '/tmp/test':
         2,345.12 msec task-clock                #    0.999 CPUs utilized          
               123 context-switches          #    0.052 K/sec                  
                 2 cpu-migrations            #    0.001 K/sec                  
             1,234 page-faults               #    0.526 K/sec                  
     5,678,123,456 cycles                    #    2.421 GHz                    
     9,876,543,210 instructions              #    1.74  insn per cycle         
       123,456,789 branches                  #   52.627 M/sec                  
         1,234,567 branch-misses             #    1.00% of all branches        
       0.002346125 seconds time elapsed

示例 2:采样性能热点

命令
sudo perf record /tmp/test
sudo perf report
说明
  • 记录采样数据并生成报告。
输出(报告部分)
Samples: 2K of event 'cycles', Event count (approx.): 5678123456
  Overhead  Command  Shared Object      Symbol
    99.12%  test     test               [.] main
     0.88%  test     libc.so.6          [.] __libc_start_main

示例 3:列出支持事件

命令
perf list
说明
  • 显示可监控的事件。
输出(部分)
  cpu-cycles OR cycles                    [Hardware event]
  instructions                            [Hardware event]
  cache-misses                            [Hardware event]
  syscalls:sys_enter_open                 [Tracepoint event]

示例 4:系统调用跟踪

命令
sudo perf trace -e openat ls
说明
  • 跟踪 openat 系统调用。
输出
     0.000 ls/12345 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
     0.012 ls/12345 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3

示例 5:监控特定进程

命令
/tmp/test &
sudo perf stat -p $!
说明
  • 监控后台进程的性能。
输出
 Performance counter stats for process id '12345':
         2,350.45 msec task-clock                #    0.999 CPUs utilized          
               125 context-switches          #    0.053 K/sec                  
                 3 cpu-migrations            #    0.001 K/sec                  
             1,235 page-faults               #    0.525 K/sec                  

示例 6:自定义事件

命令
sudo perf stat -e cycles,instructions,cache-misses /tmp/test
说明
  • 监控特定事件。
输出
 Performance counter stats for '/tmp/test':
     5,678,123,456 cycles                    #    2.421 GHz                    
     9,876,543,210 instructions              #    1.74  insn per cycle         
       123,456,789 cache-misses              #   52.627 M/sec                  
       0.002346125 seconds time elapsed

🚀 常用子命令与功能

🔍 性能统计(stat)

选项描述
-e EVENT指定事件
-p PID监控进程
-a系统范围
-r N重复运行 N 次
示例
sudo perf stat -e cycles -r 3 ls

📜 性能采样(record/report)

选项描述
-F FREQ采样频率
-g捕获调用栈
-o FILE输出文件
示例
sudo perf record -F 999 -g /tmp/test
sudo perf report -i perf.data

📁 事件跟踪(trace)

选项描述
-e EVENT跟踪事件
-p PID跟踪进程
示例
sudo perf trace -e sched:sched_switch

🌟 高级用法

概述

高级用法涉及动态跟踪、火焰图生成、锁分析和内核优化。

🛡️ 1. 动态跟踪(kprobes)

命令
sudo perf probe -a do_sys_open
sudo perf record -e probe:do_sys_open -a sleep 5
sudo perf report
说明
  • 使用 kprobes 跟踪内核函数。

🔍 2. 火焰图生成

脚本
sudo perf record -F 99 -g /tmp/test
sudo perf script > out.perf
git clone https://github.com/brendangregg/FlameGraph
cd FlameGraph
./stackcollapse-perf.pl ../out.perf > out.folded
./flamegraph.pl out.folded > flame.svg
说明
  • 生成可视化火焰图,定位热点。

🔄 3. 锁分析

命令
sudo perf lock record /tmp/test
sudo perf lock report
说明
  • 分析多线程锁竞争。

⚡ 4. 调度分析

命令
sudo perf sched record sleep 5
sudo perf sched latency
说明
  • 分析调度延迟。

🔐 5. 用户态跟踪(uprobes)

命令
sudo perf probe -x /tmp/test main
sudo perf record -e probe_test:main /tmp/test
sudo perf report
说明
  • 跟踪用户程序函数。

⚠️ 使用 perf 时的注意事项

  1. 权限要求:

    • 调整 perf_event_paranoid:

      sudo sysctl -w kernel.perf_event_paranoid=0
      
  2. 内核支持:

    • 检查内核版本:

      uname -r
      
  3. 数据管理:

    • 清理采样数据:

      rm perf.data
      
  4. 性能开销:

    • 降低采样频率:

      perf record -F 99
      
  5. 安全性:

    • 限制 root 使用。

🛠️ 高级技巧与实战案例

概述

以下是高级技巧和实战案例,展示 perf 的复杂应用。

🖥️ 案例 1:Web 服务器优化

命令
sudo perf record -F 999 -p $(pidof nginx) -g sleep 10
sudo perf report
说明
  • 分析 Nginx 性能瓶颈。

📦 案例 2:数据库性能

命令
sudo perf stat -e cache-misses -p $(pidof mysqld) sleep 5
说明
  • 监控 MySQL 缓存未命中。

🔒 案例 3:多线程调试

命令
sudo perf lock record ./multithread_app
sudo perf lock report
说明
  • 诊断锁竞争。

📈 案例 4:系统监控

命令
sudo perf stat -a -e cycles,instructions sleep 5
说明
  • 全局 CPU 使用分析。

🔧 案例 5:自定义脚本

脚本
#!/bin/bash
sudo perf record -F 99 -g "$@"
sudo perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > flame.svg
说明
  • 自动化火焰图生成。

🔗 与其他工具结合

  • 与 FlameGraph:

    perf script | stackcollapse-perf.pl | flamegraph.pl
    
  • 与 strace:

    perf trace -e openat strace ls
    
  • 与 gdb:

    perf record ./app; gdb ./app -c perf.data
    

📝 总结

perf 是 Linux 系统中强大的性能分析工具,适用于系统优化、代码调试和内核分析。本文从基础到高级,结合详细示例和注意事项,全面介绍了 perf 的功能。无论是定位瓶颈、生成火焰图还是跟踪系统调用,perf 都能提供高效支持。

更多技术分享,关注公众号:halugin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值