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
其中:
- 第一项设置,允许非特权用户进行内核分析和访问 CPU 事件。
- 第二项设置(
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
:
Menu
->Import Result...
;Import raw trace data
, 选择data.perf
文件;Import
按钮;
4. 参考资料
5. 更多学习资料
本文由作者按照 CC BY 4.0 进行授权