linux内核性能分析工具perf学习记录

目录

1 基础知识

1.1 简介

1.2 perf依赖的kernel配置项

1.3 使用 perf 带来的开销(overhead)

2 交叉编译perf

2.1 获取perf工具的源代码

2.2 交叉编译perf

3 perf工具的用法

4 动态添加tracepoint event

4.1 Kprobe-based Event Tracing

4.2 相关内核配置项

4.3 通过/sys/kernel/debug/tracing/动态添加tracepoint event

4.4 通过perf probe --add xxx动态添加tracepoint event

4.5 查看动态添加的tracepoint event

4.6 记录动态添加的tracepoint event

5 生成火焰图

5.1 生成火焰图的步骤

5.1.1 下载FlameGraph工具

5.1.2 具体步骤

5.2 火焰图的打开方式、控制方式和火焰图包含的信息


目录

1 基础知识

1.1 简介


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值