哈喽,大家好,我是小G。
前言
ftrace 功能很强大,不仅能跟踪代码流程,也能用来分析性能问题。对于 Linux 和 Android 平台的学习和开发人员来说 ,能够熟练使用 ftrace 的话,是非常强大的生产力,非常尤其要深入和快速学习linux内核相关流程,也非常有用。
我也是在努力学习中,目前能进行一些简单的性能问题分析,常用的主要还在使用 ftrace 熟悉和学习 linux 内核函数和相关流程,更好的理解工作中涉及到的内核层面知识。所以用的 最多的是ftrace 的 function、function_graph 这两个跟踪器。
在学习使用 function、function_graph 之前,需要先了解一些,ftrace 相关的一些数据和节点文件知识。
正文
最新的linux 内核,ftrace 所有相关数据和文件节点都位于 /sys/kernel/tracing 目录下。
ftrace部分数据和文件节点说明:
文件..................... | 用途......................... |
---|---|
README | README文件提供了一个简短的使用说明,展示了ftrace的操作命令序列。可以通过cat命令查看该文件以了解概要的操作流程。 |
current_tracer | current_tracer用于设置或显示当前使用的跟踪器;使用echo将跟踪器名字写入该文件可以切换到不同的跟踪器。系统启动后,其缺省值为nop,即不做任何跟踪操作。在执行完一段跟踪任务后,可以通过向该文件写入nop来重置跟踪器。 |
available_tracers | available_tracers记录了当前编译进内核的跟踪器的列表,可以通过cat查看其内容。写current_tracer文件时用到的跟踪器名字必须在该文件列出的跟踪器名字列表中。 |
trace | trace文件提供了查看获取到的跟踪信息的接口。可以通过cat等命令查看该文件以查看跟踪到的内核活动记录,也可以将其内容保存为记录文件以备后续查看。 |
...... | ... |
set_graph_function | set_graph_function设置要清晰显示调用关系的函数,显示的信息结构类似于C语言代码,这样在分析内核运作流程时会更加直观一些。在使用function_graph跟踪器时使用;缺省为对所有函数都生成调用关系序列,可以通过写该文件来指定需要特别关注的函数。 |
buffer_size_kb | buffer_size_kb用于设置单个CPU所使用的跟踪缓存的大小。跟踪器会将跟踪到的信息写入缓存,每个CPU的跟踪缓存是一样大的。跟踪缓存实现为环形缓冲区的形式,如果跟踪到的信息太多,则旧的信息会被新的跟踪信息覆盖掉。
说明: 要更改该文件的值需要先将“current_tracer”设置为“nop”才可以。 |
tracing_on | tracing_on用于控制跟踪的暂停。有时候在观察到某些事件时想暂时关闭跟踪,可以将0写入该文件以停止跟踪,这样跟踪缓冲区中比较新的部分是与所关注的事件相关的;写入1可以继续跟踪。 |
available_filter_functions | available_filter_functions记录了当前可以跟踪的内核函数。对于不在该文件中列出的函数,无法跟踪其活动。 |
set_ftrace_filter、
set_ftrace_notrace |
set_ftrace_filter和 set_ftrace_notrace在编译内核时配置了动态ftrace(选中 CONFIG_DYNAMIC_FTRACE 选项)后使用。前者用于显示指定要跟踪的函数,后者则作用相反,用于指定不跟踪的函数。如果一个函数名同时出现在这两个文件中,则这个函数的执行状况不会被跟踪。这些文件还支持简单形式的含有通配符的表达式,这样可以用一个表达式一次指定多个目标函数。缺省为可以跟踪所有内核函数,文件set_ftrace_notrace的值则为空。
说明: 要写入这两个文件的函数名必须可以在文件available_filter_functions中看到。 |
ftrace部分跟踪器说明:
ftrace包含多个跟踪器,用于跟踪不同类型的信息,例如进程调度、中断关闭等。可以通过 available_tracers 获取内核当前支持的跟踪器列表。常见的跟踪器有:
跟踪器.............. | 说明....................... |
---|---|
nop | nop跟踪器不会跟踪任何内核活动,将nop写入current_tracer文件可以删除之前所使用的跟踪器,并清空之前收集到的跟踪信息,即刷新trace文件。 |
function | function跟踪器可以跟踪内核函数的执行情况,可以通过文件set_ftrace_filter显示指定要跟踪的函数。 |
function_graph | function_graph跟踪器可以显示类似C源码的函数调用关系图,这样查看起来比较直观一些,可以通过文件 set_graph_function显示指定要生成调用流程图的函数。 |
sched_switch | sched_switch跟踪器可以对内核中的进程调度活动进行跟踪。 |
irqsoff、
preemptoff |
irqsoff跟踪器和 preemptoff跟踪器分别跟踪关闭中断的代码和禁止进程抢占的代码,并记录关闭的最大时长,preemptirqsoff跟踪器则可以看做它们的组合。 |
ftrace还支持其它一些跟踪器,了解更多可查看详细内核文档和源码。“Documentation/trace”目录下的文档以及“kernel/trace”下的源文件。
下一篇,将会看下具体如何使用 function 和 function_graph 。