文章目录
- ftrace使用
- 一、ftrace的功能与用途
- 二、ftrace的实现原理
- 三、ftrace的使用步骤
- 1. 查看tracer:通过查看available\_tracers文件,了解当前内核中可用的插件追踪器
- 2. 选择tracer
- 3. 设置参数和过滤器
- 4.开启追踪
- 5. 读取追踪结果
- 四、ftrace的常用tracer
- available_tracers 文件
- 一、文件内容
- 二、使用方式
- current_tracer文件
- 一、可用的跟踪器类型
- 二、使用步骤
- tracing_on 文件
- 一、 功能
- 二、位置
- 三、 使用方法
- func_stack_trace文件
- 一、 功能
- 二、 使用方法
- trace文件
- 一、文件位置与访问
- 二、文件内容
- 三、使用场景
- 四、相关配置与操作
ftrace是Linux内核中的一种强大跟踪工具,自2.6版本之后被引入内核中,主要用于分析和调试内核和应用程序的性能问题。:
ftrace使用
一、ftrace的功能与用途
ftrace可以帮助开发人员跟踪各种事件,如函数调用、系统调用、中断事件、定时器事件等,并生成相应的跟踪数据。通过分析这些数据,开发人员可以了解代码执行路径、函数耗时、资源使用情况等信息,从而进行性能优化或故障排查。ftrace提供了多个功能组件,如函数图谱(function graph)、事件追踪(event tracing)和动态追踪(dynamic tracing)
,使得它在不同场景下都有广泛的应用价值。具体来说,ftrace可用于快速排查以下问题:
- 特定内核函数调用的频次。
- 内核函数在被调用的过程中路径(调用栈)。
- 内核函数调用的子函数流程(子调用栈)。
- 由于抢占导致的高延时路径等。
二、ftrace的实现原理
ftrace通过在编译时在每个函数入口插入函数探针来实现记录功能。这些探针在函数实际运行之前被触发,用于记录本次函数调用。为了减少对系统运行效率的影响,ftrace在不使用时通过替换函数探针指令为NOP
(无操作指令)来减少性能开销,并能动态启用和切换不同类型的探针。
初始化时,ftrace会扫描_mcount_loc段并修改为NOP,然后在需要时将NOP替换为函数探针,通过二级指针概念实现快速切换。此外,ftrace还允许动态配置,实现不同探针的切换和配置。
三、ftrace的使用步骤
要使用ftrace,首先需要确保内核支持该功能,并将其编译进入内核。同时,还需要激活对debugfs文件系统的支持,因为ftrace通过debugfs向用户态提供了访问接口。接下来,可以挂载debugfs文件系统,并通过访问/sys/kernel/debug/tracing/
目录下的文件来配置和使用ftrace。
使用ftrace的一般步骤如下:
1. 查看tracer:通过查看available_tracers文件,了解当前内核中可用的插件追踪器
2. 选择tracer
根据查找到的追踪器选择 function
写入current_tracer文件来设置当前要使用的tracer。
图上表示追踪的为函数调用
3. 设置参数和过滤器
可以使用set\_ftrace\_filter
文件来指定要追踪的函数名称,函数名称可以包含一个通配符。
例如追踪 sync()系统调用
4.开启追踪
通过写入tracing\_on
文件来启用追踪功能
5. 读取追踪结果
通过读取trace文件来查看追踪结果。此外,还可以使用文件以管道方式实时读取追踪信息。
四、ftrace的常用tracer
ftrace提供了多种tracer供用户使用,以下是一些常用的tracer及其功能:
- function:函数调用追踪器,用于跟踪哪个函数在何时被调用。
- function_graph:函数调用图表追踪器,用于显示函数调用关系图,包括哪个函数被哪个函数调用以及何时返回。这对于观察函数的执行时间和确定代码执行流程非常有用。
- wakeup:进程调度延迟追踪器,用于追踪普通进程从唤醒到真正得到执行之间的延迟。
- wakeup_rt:与wakeup相同,但以实时进程为对象。
- irqsoff:当中断被禁止时,系统无法响应外部事件,造成系统响应延迟。irqsoff跟踪并记录内核中哪些函数禁止了中断,并标示出禁止中断时间最长的函数。
- preemptoff:追踪并记录禁止内核抢占的函数,并显示禁止内核抢占时间最长的函数。
- preemptirqsoff:追踪并记录禁止内核抢占和中断时间最长的函数。
- sched_switch:进行上下文切换的追踪,可以得知从哪个进程切换到了哪个进程。
available_tracers 文件
available_tracers
文件位于/sys/kernel/debug/tracing/
目录下。这个目录通常挂载了debugfs虚拟文件系统,提供了与ftrace交互的接口。
一、文件内容
当你查看available_tracers
文件时,它会列出当前内核支持的ftrace跟踪器类型。这些跟踪器类型包括但不限于以下几种:
- function:用于跟踪内核函数的调用情况,是ftrace最基本的跟踪功能之一。
- function_graph:不仅跟踪指定的函数,还跟踪该函数调用的所有子函数,以图形化的方式展示函数调用关系。
- hwlat、osnoise、blk、mmiotrace等:这些跟踪器类型用于跟踪特定的系统行为,如硬件延迟、系统噪声、块I/O操作等。
- nop:这是一个特殊的跟踪器,它实际上不执行任何跟踪操作,可以作为重置跟踪器的选项。
二、使用方式
要使用特定的ftrace跟踪器,你需要将跟踪器的名字写入/sys/kernel/debug/tracing/current_tracer
文件。例如,要使用function_graph
跟踪器,你可以执行以下命令:
echo function_graph > /sys/kernel/debug/tracing/current_tracer
之后,你可以通过配置其他相关文件(如set_ftrace_filter
、tracing_on
等)来控制跟踪行为,并查看/sys/kernel/debug/tracing/trace
文件来获取跟踪信息。
current_tracer文件
- 文件位置:
current_tracer
文件位于/sys/kernel/debug/tracing/
目录下,这个目录是ftrace与用户空间交互的主要接口。 - 功能:
current_tracer
文件用于设置或显示当前正在使用的ftrace跟踪器类型。通过向该文件写入特定的跟踪器名称,可以切换到相应的跟踪模式。
一、可用的跟踪器类型
可以通过查看/sys/kernel/debug/tracing/available_tracers
文件来了解当前内核支持哪些ftrace跟踪器类型。常见的跟踪器类型包括:
- function:跟踪内核函数的调用情况,是ftrace最基本的跟踪功能。
- function_graph:不仅跟踪函数本身,还跟踪函数的调用关系,以图形化的方式展示函数调用链。
- wakeup、wakeup_rt、wakeup_dl:用于调试系统唤醒和调度过程中的延迟。
- mmiotrace:跟踪内核中的内存映射I/O(如GPU、磁盘等)的访问情况。
- blk、blocktrace:用于跟踪块层的一些延迟情况。
- nop:不执行任何跟踪操作,相当于关闭跟踪器。
二、使用步骤
-
查看可用的跟踪器:
通过查看available_tracers
文件,了解当前内核支持哪些跟踪器类型。 -
选择跟踪器:
根据调试需求,选择一个合适的跟踪器类型。 -
设置当前跟踪器:
通过向current_tracer
文件写入选定的跟踪器名称,来设置当前正在使用的跟踪器。例如,要切换到function_graph
跟踪器,可以执行以下命令:echo function_graph > /sys/kernel/debug/tracing/current_tracer
-
配置其他参数(可选):
根据需要,可以配置其他与跟踪相关的参数,如跟踪过滤器(set_ftrace_filter
)、跟踪开关(tracing_on
)等。 -
查看跟踪结果:
开启跟踪后,可以通过查看/sys/kernel/debug/tracing/trace
文件来获取跟踪信息
tracing_on 文件
tracing_on
文件是 Linux 内核 ftrace 跟踪工具中的一个关键文件,它用于控制是否将跟踪数据写入到追踪缓冲区。ftrace 是 Linux 内核中的一种强大工具,用于分析和调试内核和应用程序的性能问题。通过启用和配置 ftrace,开发人员可以跟踪函数调用、系统调用、中断事件、定时器事件等各种事件,并生成相应的跟踪数据。
以下是关于 tracing_on
文件的详细解释:
一、 功能
tracing_on
文件是一个简单的文本文件,其内容是数字 “0” 或 “1”。写入 “1” 到 tracing_on
文件会启用向追踪缓冲区写入跟踪数据的功能,而写入 “0” 则会禁用该功能。这使得开发人员可以在需要时轻松地开启或关闭跟踪。
二、位置
tracing_on
文件通常位于 /sys/kernel/debug/tracing/
或 /sys/kernel/tracing/
目录下,这取决于 ftrace 的配置和挂载点。这些目录是 debugfs 文件系统的一部分,它提供了对内核内部数据结构的访问。
三、 使用方法
要使用 tracing_on
文件,通常需要执行以下步骤:
- 挂载 debugfs 文件系统:如果 debugfs 文件系统尚未挂载,需要将其挂载到某个目录(如
/sys/kernel/debug
)上。这可以通过修改/etc/fstab
文件或使用mount
命令来完成。 - 导航到 tracing 目录:使用
cd
命令导航到包含tracing_on
文件的目录(如/sys/kernel/debug/tracing/
)。 - 写入值到 tracing_on 文件:使用
echo
命令将 “1” 或 “0” 写入到tracing_on
文件中,以启用或禁用跟踪功能。例如,echo 1 > tracing_on
会启用跟踪,而echo 0 > tracing_on
则会禁用跟踪。 - 查看跟踪数据:启用跟踪后,可以使用
cat
命令或其他文本查看工具来查看/sys/kernel/debug/tracing/trace
文件中的跟踪数据。这个文件包含了从启用跟踪开始到当前时刻的所有跟踪事件。
func_stack_trace文件
func_stack_trace
文件是 Linux 内核 ftrace 工具中的一个配置选项,它允许在跟踪函数时启用或禁用函数堆栈跟踪。ftrace 是 Linux 内核中一种强大的跟踪和调试工具,它可以帮助开发人员分析和调试内核行为。
以下是关于 func_stack_trace
文件的详细解释:
一、 功能
func_stack_trace
文件通常位于 /sys/kernel/debug/tracing/options/
目录下(取决于 ftrace 的配置和挂载点)。通过向该文件写入 “1” 或 “0”,可以启用或禁用函数堆栈跟踪功能。当启用该功能时,ftrace 在跟踪函数时不仅会记录函数名,还会记录函数调用时的堆栈信息,这有助于开发人员更深入地了解函数的调用关系和调用路径。
二、 使用方法
要使用 func_stack_trace
文件,通常需要执行以下步骤:
- 挂载 debugfs 文件系统:确保 debugfs 文件系统已经挂载到某个目录(如
/sys/kernel/debug
)上。如果尚未挂载,可以使用mount
命令将其挂载。 - 导航到 options 目录:使用
cd
命令导航到包含func_stack_trace
文件的目录(如/sys/kernel/debug/tracing/options/
)。 - 写入值到 func_stack_trace 文件:使用
echo
命令将 “1” 或 “0” 写入到func_stack_trace
文件中,以启用或禁用函数堆栈跟踪功能。例如,echo 1 > func_stack_trace
会启用函数堆栈跟踪,而echo 0 > func_stack_trace
则会禁用该功能。 - 设置当前跟踪器:根据需要设置当前正在运行的跟踪器(如
function
、function_graph
等)。这可以通过向/sys/kernel/debug/tracing/current_tracer
文件写入跟踪器名称来完成。 - 启用跟踪:通过向
/sys/kernel/debug/tracing/tracing_on
文件写入 “1” 来启用跟踪。这将开始收集跟踪数据,包括启用了堆栈跟踪功能的函数调用。 - 查看跟踪数据:使用
cat
命令或其他文本查看工具来查看/sys/kernel/debug/tracing/trace
文件中的跟踪数据。该文件包含了从启用跟踪开始到当前时刻的所有跟踪事件,包括函数名和堆栈信息(如果启用了堆栈跟踪功能)。
trace文件
/sys/kernel/debug/tracing/trace
文件是Linux内核调试中非常重要的一个文件,它记录了通过ftrace等内核动态追踪技术捕获的内核或应用程序的运行事件。以下是对该文件的详细解释:
一、文件位置与访问
- 文件路径:在Linux系统中,
/sys/kernel/debug/tracing/trace
文件通常位于/sys/kernel/debug/tracing
目录下。 - 访问方式:该文件可以通过文件系统直接访问,使用常见的文件操作命令如cat、less、more等即可查看其内容。
二、文件内容
- 追踪信息:该文件记录了通过ftrace等技术捕获的内核或应用程序的运行事件。这些事件可能包括函数调用、中断处理、进程调度等。
- 格式:文件中的追踪信息通常以文本形式呈现,每行记录一个事件。事件的格式取决于所使用的追踪器和配置选项。
三、使用场景
- 内核调试:
/sys/kernel/debug/tracing/trace
文件是内核调试中常用的工具之一。通过分析该文件中的追踪信息,开发者可以深入了解内核的运行状态,从而定位并解决内核中的问题。 - 性能分析:除了调试外,该文件还可以用于性能分析。通过分析内核中的函数调用和中断处理等事件,可以找出性能瓶颈并进行优化。
四、相关配置与操作
- 启用/禁用追踪:在使用
/sys/kernel/debug/tracing/trace
文件之前,需要确保已经启用了相应的追踪器。这可以通过向/sys/kernel/debug/tracing/current_tracer
文件写入追踪器的名称来实现。同时,还需要确保已经挂载了debugfs文件系统,因为/sys/kernel/debug/tracing
目录是debugfs文件系统的一部分。 - 过滤追踪信息:为了只关注感兴趣的事件,可以使用
/sys/kernel/debug/tracing/set_ftrace_filter
文件来设置过滤条件。通过向该文件写入特定的函数名或正则表达式,可以过滤掉不相关的事件。 - 查看可用追踪器和事件:
可以使用/sys/kernel/debug/tracing/available_tracers和/sys/kernel/debug/tracing/available_events
文件来查看当前系统支持的追踪器和事件。