目录
4.1 Kprobe-based Event Tracing
4.3 通过/sys/kernel/debug/tracing/动态添加tracepoint event
4.4 通过perf probe --add xxx动态添加tracepoint event
目录
1 基础知识
1.1 简介
perf是一款Linux性能分析工具。Linux性能计数器是一个新的基于内核的子系统,它提供一个性能分析框架,比如硬件(CPU、PMU(Performance Monitoring Unit))功能和软件(软件计数器、tracepoint)功能。
通过perf,应用程序可以利用PMU、tracepoint和内核中的计数器来进行性能统计。它不但可以分析制定应用程序的性能问题(per thread),也可以用来分析内核的性能问题,当然也可以同事分析应用程序和内核,从而全面理解应用程序中的性能瓶颈。
perf是一款综合性分析工具,大到系统全局性性能,再小到进程线程级别,甚至到函数及汇编级别。
https://www.cnblogs.com/arnoldlu/p/6241297.html
1.2 perf依赖的kernel配置项
CONFIG_PERF_EVENTS=y
CONFIG_FRAME_POINTER=y
CONFIG_KALLSYMS=y
CONFIG_TRACEPOINTS=y
CONFIG_FTRACE=y
CONFIG_KPROBES=y
CONFIG_KPROBE_EVENTS=y
CONFIG_UPROBES=y
CONFIG_UPROBE_EVENTS=y
CONFIG_DEBUG_INFO=y
CONFIG_LOCKDEP=y
CONFIG_LOCK_STAT=yCONFIG_DEBUG_INFO=y
1.3 使用 perf 带来的开销(overhead)
perf 测试不可避免的会引入额外负荷,有三种形式:
counting:内核提供计数总结,多是 Hardware Event、Software Events、PMU 计数等。相关命令 perf stat。
sampling:perf 将事件数据缓存到一块 buffer 中,然后异步写入到 perf.data 文件中。使用 perf report 等工具进行离
线分析。
bpf:Kernel 4.4+新增功能,可以提供更多有效 filter 和输出总结。
counting引入的额外负荷最小;sampling 在某些情况下会引入非常大的负荷;bpf 可以有效缩减负荷。
针对 sampling,可以通过挂在建立在 RAM 上的文件系统来有效降低读写 I/O 引入的负荷。
mkdir /tmpfs
mount -t tmpfs tmpfs /tmpfs
https://www.cnblogs.com/arnoldlu/p/6241297.html
2 交叉编译perf
2.1 获取perf工具的源代码
perf 工具源码位于 linux 内核代码目录的 tools/perf 下
2.2 交叉编译perf
以 loongson 2k1000 的 linux3.10 内核为例,编译步骤如下:
进入 kernel 源码根目录
export ARCH=mips
export CROSS_COMPILE=mips64el-linux-
cd tools/perf/
make
编译成功后会在当前目录(tools/perf/)下生成 perf 可执行文件
3 perf工具的用法
perf的常规用法网上资料很多,这里不过多介绍。
推荐下面的博文:
https://www.cnblogs.com/arnoldlu/p/6241297.html
4 动态添加tracepoint event
4.1 Kprobe-based Event Tracing
原始的trace event插桩是静态的:使用TRACE_EVENT()定义tracepoint,并且在代码中显式调用tracepoint。而kprobe机制可以实现在内核运行时动态的插桩,利用kprobe机制我们可以动态的插入trace event,实现和静态trace event同样的功能。
https://blog.csdn.net/pwl999/article/details/80431344
这种方式用户通过/sys/kernel/debug/tracing/目录下的 trace 等属性文件来探测用户指定的函数,用户可添加 kprobe 支持
的任意函数并设置探测格式与过滤条件,无需再编写内核模块,使用更为简便,但需要内核的 debugfs 和 ftrace 功能的支
持。
https://blog.csdn.net/luckyapple1028/article/details/52972315
4.2 相关内核配置项
CONFIG_KPROBE_EVENT
CONFIG_FTRACE
Documentation/trace/kprobetrace.txt
4.3 通过/sys/kernel/debug/tracing/动态添加tracepoint event
添加 kprobe
echo 'p:myprobe do_sys_open dfd=%ax filename=%dx flags=%cx mode=+4($stack)' > /sys/kernel/debug/tracing/kprobe_events
上述在 do_sys_open()函数之上创建一个 kprobe,对应的“myprobe” event 用来记录 4 个参数的。
注意:寄存器/堆栈怎么分配给函数的参数依赖于架构 ABI 的定义,如果你不确定 ABI,可以使用 perf-tools 的 probe子命令。如本例所示,用户可以为每个参数选择更熟悉的名称。
添加 kretprobe
echo 'r:myretprobe do_sys_open $retval' >> /sys/kernel/debug/tracing/kprobe_events
上述在 do_sys_open()函数非返回点设置了一个 kretprobe,对应的“myretprobe” event 用来记录返回值。可以通过“
/sys/kernel/debug/tracing/events/kprobes//format”查看 event 的输出格式。
清除动态添加的tracepoint event
echo 0 > /sys/kernel/debug/tracing/events/kprobes/myprobe/enable //清除前先关闭
echo > /sys/kernel/debug/tracing/kprobe_events //清除所有探测点
echo -:myprobe >> kprobe_events //清除指定探测点:myprobe
https://blog.csdn.net/luckyapple1028/article/details/52972315
https://blog.csdn.net/pwl999/article/details/80431344
4.4 通过perf probe --add xxx动态添加tracepoint event
perf probe --add do_sys_open
清除kprobe
perf probe -d kprobes:myprobe //清除名为myprobe的kprobe
4.5 查看动态添加的tracepoint event
root@ubuntu:~# perf list | grep probe
kprobes:myprobe [Tracepoint event]
kprobes:myretprobe [Tracepoint event]
probe:do_sys_open [Tracepoint event]
root@ubuntu:~#
root@ubuntu:~#
root@ubuntu:~# perf probe --list
kprobes:myprobe (on do_sys_open with dfd filename flags mode)
probe:do_sys_open (on do_sys_open)
kprobes:myretprobe (on do_sys_open%return with arg1)
root@ubuntu:~#
4.6 记录动态添加的tracepoint event
perf record -e kprobes:myretprobe -aR
5 生成火焰图
参考:
https://www.cnblogs.com/happyliu/p/6142929.html
https://blog.csdn.net/qq_25072517/article/details/78433756
https://queue.acm.org/detail.cfm?id=2927301 //火焰图的介绍论文
http://www.brendangregg.com/flamegraphs.html //火焰图官方主页
https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/index.html //应用程序调优
IBM Developer //内核调优
5.1 生成火焰图的步骤
5.1.1 下载FlameGraph工具
git clone GitHub - brendangregg/FlameGraph: Stack trace visualizer
5.1.2 具体步骤
第一步:生成 perf.data 文件
perf record xxx
第二步:用 perf script 工具对 perf.data 进行解析
perf script -i perf.data &> perf.unfold
第三步:将 perf.unfold 中的符号进行折叠
./stackcollapse-perf.pl perf.unfold &> perf.folded
第四步:生成 svg 图片
./flamegraph.pl perf.folded > perf.svg
5.2 火焰图的打开方式、控制方式和火焰图包含的信息
请参考:https://blog.csdn.net/qq_25072517/article/details/78433756