#打卡不停更#Linux perf工具使用 原创

民之码农
发布于 2022-9-29 14:04
浏览
1收藏

@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数据的时间可以根据实际修改

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
perf.zip 411B 7次下载
已于2022-9-29 16:39:18修改
2
收藏 1
回复
举报
回复
    相关推荐