4. perf工具入门:安装、基本命令(perf stat, perf record, perf report)

perf 是 Linux 内核官方提供的性能分析工具集,基于内核的 Performance Events 子系统,能够以极低开销采集 CPU 周期、缓存命中、分支预测、硬件中断等底层事件。在安全驱动性能分析中,perf 是定位热点函数、识别异常执行路径的首选工具。

4.1 安装 perf

perf 通常随 linux-tools 包发布,不同发行版安装命令略有差异:

发行版 安装命令 内核版本要求
Ubuntu / Debian sudo apt install linux-tools-common linux-tools-$(uname -r) ≥ 4.0
CentOS / RHEL / Rocky sudo yum install perf 或 sudo dnf install perf ≥ 3.10
Fedora sudo dnf install perf ≥ 5.0
Arch Linux sudo pacman -S linux-tools ≥ 5.10
验证安装:执行 perf --version,若输出类似 perf version 6.2.9 即安装成功。若提示 WARNING: perf not found for kernel ...,请确认 linux-tools-$(uname -r) 包已正确安装。

4.2 perf 核心工作流程

perf 的分析流程遵循“事件采集 → 数据记录 → 报告分析”三阶段。下图展示了 perf 在安全驱动性能分析中的典型数据流:

perf 核心工作流程 perf 核心工作流程(安全驱动视角) 目标程序 (待分析进程) perf stat (计数统计) perf record (采样记录) perf report (热点报告) 安全分析 (异常检测) 说明:perf stat 做轻量计数,perf record 做深度采样,perf report 生成热点报告供安全分析。 虚线表示安全分析可反向驱动 perf record 的采样参数调整。

4.3 perf stat:轻量级性能计数

perf stat 用于快速统计程序运行期间的硬件/软件事件总数,不记录采样点,开销极低。适合在安全基线对比、异常检测前做快速摸底。

基本用法

# 统计 ls 命令的性能事件
perf stat ls

# 统计指定 PID 进程 10 秒
perf stat -p 12345 sleep 10

# 统计整个系统 5 秒
perf stat -a sleep 5

输出解读

Performance counter stats for 'ls':
    1.234567      task-clock (msec)         #    0.123 CPUs utilized
           5      context-switches          #    4.050 K/sec
           0      cpu-migrations            #    0.000 K/sec
          12      page-faults               #    9.720 K/sec
   3,456,789      cycles                    #    2.800 GHz
   1,234,567      instructions              #    0.36  insn per cycle
     456,789      branches                  #  369.789 M/sec
      12,345      branch-misses             #    2.70% of all branches
安全关注点:若 context-switches 或 cpu-migrations 异常偏高,可能暗示进程被频繁抢占或存在 CPU 亲和性攻击(如侧信道探测)。branch-misses 异常升高可能指向分支预测攻击(如 Spectre 变种)。

4.4 perf record:深度采样记录

perf record 以指定频率对程序进行事件采样,默认记录 CPU 周期(cycles)事件,生成 perf.data 文件。采样频率通过 -F 参数控制,常用 99Hz 或 1000Hz。

常用参数

参数 含义 安全场景示例
-F 99 采样频率 99 Hz(避免与系统时钟共振) 常规热点分析
-g 记录调用栈(call-graph) 定位攻击入口函数
-e event 指定事件,如 cache-misses 缓存侧信道检测
-p PID 附加到指定进程 监控可疑进程
-a 全系统采样 全局异常行为排查

典型命令

# 对 ls 命令采样,记录调用栈
perf record -F 99 -g ls

# 对 PID 12345 采样 30 秒,关注缓存未命中
perf record -e cache-misses -p 12345 sleep 30

# 全系统采样,记录所有 CPU 事件
perf record -a -F 99 sleep 10
安全警告:全系统采样(-a)会记录所有进程的采样点,包括敏感进程(如加密服务、容器)。在多租户环境中,请确保有权限审计,避免隐私泄露。

4.5 perf report:热点报告生成

perf report 读取 perf.data 文件,生成按热点开销排序的函数/指令报告。默认以 开销占比(Overhead) 降序排列,帮助快速定位最耗 CPU 的函数。

交互式界面

# 生成报告(交互式 TUI)
perf report

# 输出纯文本报告
perf report --stdio

# 按调用链展开
perf report --stdio -g graph

输出示例(文本模式)

# Overhead  Command  Shared Object      Symbol
# ........  .......  .................  .........................
    35.67%  nginx    libc-2.31.so       [.] __memcpy_avx_unaligned
    12.34%  nginx    nginx              [.] ngx_http_process_request
     8.90%  nginx    [kernel.kallsyms]  [k] _raw_spin_lock
     5.67%  nginx    libpthread.so      [.] pthread_mutex_lock
     4.32%  nginx    nginx              [.] ngx_ssl_handshake
安全分析要点:
  • 内核函数热点(如 _raw_spin_lock)异常升高,可能暗示存在自旋锁滥用或 DoS 攻击。
  • 非预期库函数出现在热点列表(如 system、execve),可能指向代码注入或后门。
  • 调用链(-g 模式)可追溯热点函数的调用路径,帮助定位攻击入口。

4.6 三命令对比与选择策略

命令 数据量 开销 适用阶段 安全场景
perf stat 极小(仅计数) 极低 快速摸底、基线对比 检测异常事件计数
perf record 中等(采样点) 低~中 深度分析、热点定位 追踪可疑调用链
perf report 无新数据(只读) 无 结果呈现、报告生成 输出安全审计报告

4.7 安全驱动实践:快速排查流程

  1. 基线建立:使用 perf stat -a sleep 60 采集系统空闲时的上下文切换、缓存未命中、分支预测失败等指标,记录为安全基线。
  2. 异常触发:当告警系统提示某进程 CPU 异常或上下文切换飙升时,执行 perf record -F 99 -g -p <PID> sleep 30 采集样本。
  3. 热点分析:运行 perf report --stdio -g graph 查看热点函数及调用链,重点关注内核函数、非预期库调用、自旋锁等敏感符号。
  4. 对比基线:将当前 perf stat 结果与基线对比,若 branch-misses 或 cache-misses 偏差超过 3σ,则触发安全事件调查。
效率提示:在安全巡检脚本中,可将 perf stat -a sleep 10 2>&1 | grep -E "context-switches|branch-misses|cache-misses" 作为轻量级健康检查,异常时再触发 perf record 深度采样,避免持续高开销采集。