Linux中perf的使用
`perf` 是 Linux 系统中的一个强大的性能分析工具,广泛用于内核和用户态程序的性能分析。它可以帮助开发者和系统管理员深入了解程序的 CPU 使用情况、函数调用频率、缓存命中率、硬件事件等,进而优化程序的性能。
下面我将详细介绍如何在 Linux 系统中使用 `perf`,从安装到基本的使用方法。
### 1. **安装 `perf` 工具**
在大多数 Linux 发行版中,`perf` 是内核的一部分,但你需要通过软件包管理器安装它。安装命令因发行版不同而异:
- **Debian/Ubuntu**:
```bash
sudo apt update
sudo apt install linux-tools-common linux-tools-$(uname -r)
```
- **Fedora/RHEL/CentOS**:
```bash
sudo dnf install perf
```
- **Arch Linux**:
```bash
sudo pacman -S perf
```
确认 `perf` 是否安装成功,可以运行以下命令:
```bash
perf --version
```
### 2. **基本的 `perf` 使用方法**
`perf` 提供了许多子命令,以下是一些常见的用法。
#### 2.1. **分析 CPU 使用情况(`perf stat`)**
`perf stat` 是用来统计一个命令的执行过程中,硬件和软件事件发生的次数。例如,可以用它来查看程序执行期间的 CPU 周期、指令、缓存访问等硬件计数。
示例:统计 `ls` 命令的性能数据
```bash
perf stat ls
```
输出将包括程序执行期间的事件统计信息,例如:
- CPU cycles
- Instructions
- Cache misses
- Branch misses
#### 2.2. **查看程序的热点函数(`perf record` 和 `perf report`)**
`perf record` 用于记录程序的性能数据,特别是 CPU 性能数据(如函数的执行频率)。`perf report` 用于分析这些数据,查看程序的热点函数。
步骤:
1. **记录数据**:
```bash
perf record <your_command>
```
例如:
```bash
perf record ./my_program
```
这将记录 `my_program` 的执行数据,并生成一个 `perf.data` 文件。
2. **分析报告**:
```bash
perf report
```
这将打开一个 TUI(文本用户界面),显示执行数据的分析报告,其中包括各个函数的执行频率(如 CPU 周期占比),帮助你识别程序的热点函数(耗时多的函数)。
#### 2.3. **分析系统上的所有进程(`perf top`)**
`perf top` 类似于 `top`,但它分析的是系统上所有进程的实时性能数据,显示当前占用 CPU 最多的函数或事件。它可以帮助你了解哪些程序或函数正在消耗最多的系统资源。
运行以下命令:
```bash
perf top
```
该命令将打开一个实时监控界面,显示当前系统中 CPU 使用最多的函数(带符号表解析)。
#### 2.4. **跟踪系统调用(`perf trace`)**
`perf trace` 是一个类似于 `strace` 的工具,它可以跟踪进程的系统调用并统计其频率和开销。
例如,跟踪 `ls` 命令的系统调用:
```bash
perf trace ls
```
输出将显示 `ls` 过程中发生的所有系统调用及其耗时。
#### 2.5. **分析内核事件(`perf sched`)**
`perf sched` 可以用来分析内核中的调度事件。它可以帮助你了解进程的调度行为,分析系统中是否存在调度延迟等问题。
使用以下命令记录调度事件:
```bash
perf sched record
```
然后查看调度情况:
```bash
perf sched latency
```
或者绘制调度图:
```bash
perf sched trace
```
### 3. **常见场景下的 `perf` 使用**
#### 3.1. **程序性能瓶颈分析**
在你发现一个程序的执行时间比预期长时,可以使用 `perf record` 和 `perf report` 来分析程序的性能瓶颈:
```bash
perf record ./my_program
perf report
```
通过分析函数的 CPU 使用情况,找出最耗时的部分,进而进行优化。
#### 3.2. **CPU 资源争用分析**
当系统负载较高时,可以使用 `perf top` 查看哪些进程或者函数占用了最多的 CPU 资源:
```bash
perf top
```
这有助于定位系统性能瓶颈,分析高 CPU 占用的原因。
#### 3.3. **缓存性能分析**
如果你怀疑程序中存在缓存命中率低的问题,可以通过 `perf stat` 来分析缓存的性能。你可以查看缓存未命中(cache misses)的次数,以确定程序中的缓存利用情况:
```bash
perf stat ./my_program
```
在输出中查看 `cache-references` 和 `cache-misses` 两项。
#### 3.4. **多线程调度问题**
如果程序存在多线程调度问题,可以通过 `perf sched` 来分析调度延迟:
```bash
perf sched record
perf sched latency
```
通过分析调度延迟,找出导致系统调度不均衡的原因。
### 4. **高级用法**
#### 4.1. **采样指定硬件事件**
你可以让 `perf` 专门采样某些硬件事件(例如缓存未命中、分支预测失败等),从而针对性地分析程序的性能问题。
例如,记录程序的缓存未命中情况:
```bash
perf record -e cache-misses ./my_program
```
#### 4.2. **对指定 PID 进行性能分析**
如果你想对正在运行的某个进程进行性能分析,可以使用 `-p` 选项指定进程 ID:
```bash
perf record -p <PID>
```
这对分析后台运行的进程非常有用。
### 5. **总结**
- `perf` 是 Linux 内核中强大的性能分析工具,能够对 CPU 事件、系统调用、线程调度、硬件计数器等多种系统层面进行全面的性能分析。
- 常用命令包括:
- `perf stat`:获取硬件事件统计。
- `perf record`:记录程序执行过程中的性能数据。
- `perf report`:生成性能分析报告。
- `perf top`:实时查看系统性能。
- `perf trace`:跟踪系统调用。
- `perf sched`:分析调度行为。
掌握这些基本用法,可以帮助你快速分析和优化系统和程序的性能。