文章

perf性能分析(3) -- Intel VTune 配合 linux perf 使用

1. 配置

1.1 安装 perf

1
sudo apt-get install linux-tools-common linux-tools-generic linux-tools-`uname -r`

1.2 设置系统相关设置项以允许 perf 采集

1
2
3
4
5
6
7
8
9
10
# 允许非特权用户进行内核分析和访问 CPU 事件
echo 0 | sudo tee /proc/sys/kernel/perf_event_paranoid
sudo sh -c 'echo kernel.perf_event_paranoid=0 >> /etc/sysctl.d/local.conf'

# 启用内核模块符号解析以供非特权用户使用
echo 0 | sudo tee /proc/sys/kernel/kptr_restrict
sudo sh -c 'echo kernel.kptr_restrict=0 >> /etc/sysctl.d/local.conf'

# 生效系统设置
sudo sysctl -p

其中:

  1. 第一项设置,允许非特权用户进行内核分析和访问 CPU 事件。
  2. 第二项设置(kptr_restrict),可以使得perf工具可以访问到内核指针,即允许内核符号(kallsyms)被映射到用户层。

2. 开始 perf 测量及收集数据

在被测量的程序中,添加如下代码获取自身PID:

1
2
3
4
#include <unistd.h>  // getpid

const pid_t pid = getpid();
std::cout << argv[0] << ". Process ID: " << pid << std::endl;

使用ggdb,并使用fno-omit-frame-pointer等编译选项,遍已完成之后,启动程序。

随后启动perf命令:

1
perf record -F 599 -e cycles,cache-misses -ag -p 12738 -- sleep 200

其中:

  • -e cycles,cache-misses 表示采集的类型,使用 perf list 可以列出所有可用的事件,如CPU相关的事件,cache相关的事件,以及是硬件采集 (PMC) 还是软件采集;
  • -p 12738 表示进程 PID;
  • sleep 200 表示采集持续时间;

采集完成之后,将生成的perf.data 重命名为 data.perf.perf 文件是 VTune 可以识别的文件格式。

为防止采样频率与代码中的某些周期性代码因同频而导致每次采集到相同的地方,故设置采集频率不能为10的倍数,也不能是2的幂次方,可尽量避免采集误导性数据。参考 Using perf On Arm platforms

3. VTune 分析数据

使用VTune Profiler 导入经过重命名的 data.perf

  1. Menu -> Import Result...;
  2. Import raw trace data, 选择 data.perf 文件;
  3. Import 按钮;

import_perf_format_file import_perf_format_file_step_2

4. 参考资料

5. 更多学习资料

本文由作者按照 CC BY 4.0 进行授权