1. 简介
ftrace是内建于Linux内核的跟踪工具,从2.6.27开始加入主流内核。ftrace的作用是帮助开发人员了解 Linux 内核的运行时行为,以便进行故障调试或性能分析。使用ftrace可以对内核函数调用、上下文切换进行跟踪,还可以查看中断被关闭的时长,跟踪内核态中的延迟以及性能问题等。使用ftrace对内核进行跟踪调试,可以找到内核中出现的问题的根源,通过ftrace来观察内核中发生的活动,则可以了解内核的工作机制。
2. 原理
ftrace本质上是一种静态代码插装技术,借助于GCC提供的profile特性,在所有的内核函数的开始部分插入一段代码,通过插入的代码来实现跟踪功能。GCC的-pg选项将在每个函数入口处加入对 mcount 的调用代码,ftrace使用自己定义的mcount函数来代替默认的mcount,实现了对于函数调用的跟踪。在每个内核函数入口加入跟踪代码,必然会影响内核的性能,为了减小对内核性能的影响,ftrace支持动态跟踪功能。在没有启用其跟踪功能时,它将mcount换成nop指令,只有在开启跟踪功能时,才将mcount换成用户注册的跟踪函数,因此在不进行跟踪的时候,对内核性能的影响微乎其微。
3. 使用
ftrace通过debugfs向用户态提供访问接口,使用时需先挂载debugfs,挂载debugfs之后,在挂载目录下(默认是/sys/kernel/debug)会有一个tracing的文件夹,这个文件夹就是ftrace导出的借口。该文件夹下一些主要的文件的用途如下:
l README文件提供了一个简短的使用说明,展示了 ftrace 的操作命令序列。可以通过 cat 命令查看该文件以了解概要的操作流程
l current_tracer用于设置或显示当前使用的跟踪器,其缺省值为nop,即不做任何跟踪操作。
l available_tracers记录了当前编译进内核的跟踪器的列表,current_tracer必须在该文件列出的跟踪器名字列表中。
l trace文件提供了查看获取到的跟踪信息的接口。可以通过 cat 等命令查看该文件以查看跟踪到的内核活动记录,也可以将其内容保存为记录文件以备后续查看
l tracing_enabled用于控制current_tracer中的跟踪器是否跟踪内核函数的调用情况。写入0会关闭跟踪活动,写入1则激活跟踪功能。
l set_graph_function设置要清晰显示调用关系的函数,显示的信息结构类似于 C 语言代码,这样在分析内核运作流程时会更加直观一些。在使用 function_graph 跟踪器时使用;缺省为对所有函数都生成调用关系序列,可以通过写该文件来指定需要特别关注的函数
l buffer_size_kb用于设置单个 CPU 所使用的跟踪缓存的大小
l available_filter_functions记录了当前可以跟踪的内核函数。对于不在该文件中列出的函数,无法跟踪其活动。
l set_ftrace_filter 用于指定要跟踪的函数,支持简单形式的含有通配符的表达式,这样可以用一个表达式一次指定多个目标函数;注意,要写入文件的函数名必须可以在文件 available_filter_functions 中看到
l set_ftrace_notrace 与set_ftrace_filter相反,用于指定不跟踪的函数
Ftrace使用起来很简单,大致可以分成三步完成,首先是选择函数跟踪器、设置将要跟踪的函数、启用其跟踪功能,然后执行你想要跟踪的代码,执行完成之后,停止跟踪器,将结果导出。下面通过一些实例来看看ftrace的使用
function跟踪器
# cd /sys/kernel/debug/tracing
# echo 1 > /proc/sys/kernel/ftrace_enabled
# echo 0 > tracing_enabled
# echo function > current_tracer
# echo 1 > tracing_on
# echo 1 > tracing_enabled
让内核执行一段时间
# echo 0 > tracing_enabled
# cat trace
sched_switch 跟踪器
# cd /sys/kernel/debug/tracing
# echo 1 > /proc/sys/kernel/ftrace_enabled
# echo 0 > tracing_enabled
# echo sched_switch > current_tracer
# echo 1 > tracing_on
# echo 1 > tracing_enabled
让内核执行一段时间
# echo 0 > tracing_enabled
# cat trace
其他的跟踪器的使用也类似上面的流程。上面的过程很容易写成脚步,此外还可以通过trace-cmd来操作。
4. 参考
http://lwn.net/Articles/322666/
http://www.ibm.com/developerworks/cn/linux/l-cn-ftrace/index.html
http://linux.cn/home/space-2-do-blog-id-326.html
http://linux.cn/home/space-2-do-blog-id-329.html
http://linux.cn/home/space-2-do-blog-id-331.html
http://blog.youkuaiyun.com/Leisure512/archive/2011/03/03/6221339.aspx