#打卡不停更#Linux perf工具使用 原创
@toc
一、linux内核开启编译选项支持
for perf_events: CONFIG_PERF_EVENTS=y
for stack traces: CONFIG_FRAME_POINTER=y
kernel symbols: CONFIG_KALLSYMS=y
tracepoints: CONFIG_TRACEPOINTS=y
kernel function trace: CONFIG_FTRACE=y
kernel-level dynamic tracing: CONFIG_KPROBES=y CONFIG_KPROBE_EVENTS=y
user-level dynamic tracing: CONFIG_UPROBES=y CONFIG_UPROBE_EVENTS=y
full kernel debug info: CONFIG_DEBUG_INFO=y
kernel lock tracing: CONFIG_LOCKDEP=y
kernel lock tracing: CONFIG_LOCK_STAT=y
kernel dynamic tracepoint variables: CONFIG_DEBUG_INFO=y
二、编译Linux的perf工具
1. 下载源码
下载一份linux内核的源码,进入linux内核的tools/perf目录下载,该目录就是linux perf工具的源码;
2. 源码编译(以Ubuntu x86-64为例编译)
make perf_clean V=1
make perf V=1
arm-linux-gnueabihf-gcc交叉编译为如下:
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm perf_clean V=1
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm perf V=1
编译完成在perf源码目录下会生成二进制的perf工具
三、使用perf工具
1. 使用perf --help方法查询perf工具的使用方法
2.抓取linux系统的perf数据
perf 命令(performance 的缩写)讲起, 它是 Linux 系统原生提供的性能分析工具, 会返回 CPU 正在执行的函数名以及调用栈(stack)
sudo perf record -F 99 -p 3887 -g -- sleep 30
perf record -F 99 -a -g -- sleep 60 所有信息
perf record 表示采集系统事件, 没有使用 -e 指定采集事件, 则默认采集 cycles(即 CPU clock 周期), -F 99 表示每秒 99次, -p 13204 是进程号, 即对哪个进程进行分析, -g 表示记录调用栈, sleep 30 则是持续 30 秒.
-F 指定采样频率为 99Hz(每秒99次)
注意:Ubuntu上运行perf命令需要添加sudo,否则perf的采集数据会出现异常。
执行perf record命令会在当前目录下生成perf.data数据
3. perf report命令可以统计每个调用栈出现的百分比, 然后从高到低排列
sudo perf report > perf.txt
四、生成火焰图
首先用 perf script 工具对 perf.data 进行解析
1.生成折叠后的调用栈
perf script -i perf.data &> perf.unfold
将解析出来的信息存下来, 供生成火焰图
工具下载 https://github.com/brendangregg/FlameGraph,要安装perl工具:https://strawberryperl.com/
首先用 stackcollapse-perf.pl 将 perf 解析出的内容 perf.unfold 中的符号进行折叠 :
2.生成火焰图
./stackcollapse-perf.pl perf.unfold &> perf.folded
#@# 3.最后生成 svg 图
./flamegraph.pl perf.folded > perf.svg
五、生成差分火焰图
FlameGrdph 中实现了一个程序脚本,difffolded.pl 用来生成红蓝差分火焰图. 为了展示工具是如何工作的, 用 Linux perf_events 来演示一下操作步骤. 你也可以使用其他 profiler/tracer.
抓取修改前的profile 1文件:
# 抓取数据
perf record -F 99 -a -g -- sleep 30
# 解析数据生成堆栈信息
perf script > out.stacks1
# 折叠堆栈
./stackcollapse-perf.pl ../out.stacks1 > out.folded1
一段时间后 (或者程序代码修改后), 抓取 profile 2` 文件
# 抓取数据
perf record -F 99 -a -g -- sleep 30
# 解析数据生成堆栈信息
perf script > out.stacks2
# 折叠堆栈
./stackcollapse-perf.pl ../out.stacks2 > out.folded2
生成红蓝差分火焰图
./difffolded.pl out.folded1 out.folded2 | ./flamegraph.pl > diff2.svg
六、自动抓取某一进程的perf数据脚本
#!/bin/bash
process_name='xorg/Xorg'
while true
do
count=`ps -ef | grep $process_name | grep -v "grep" | wc -l`
if [[ $count != 0 ]];then
time=`date '+%Y-%m-%d %H:%M:%S'`
echo $time
break
fi
sleep 1
done
process_id=`ps -ef | grep $process_name | grep -v grep | awk '{print $2}'`
echo $process_id
perf record -F 99 -p $process_id -g -- sleep 30
perf script -i perf.data > perf.unfold
perf report > perf.txt
process_name='xorg/Xorg’进程名可以根据实际修改
– sleep 30 抓取进程perf数据的时间可以根据实际修改