文章目录
- 概述
- Ftrace工作原理
- Ftrace追踪器
- Ftrace探测技术
- GCC的profile特性
- tracefs文件系统
- 控制文件
- trace信息
- Ftrace使用
- tracer配置步骤
- function tracer使用示例
- 相关参考
概述
Ftrace,全称Function Tracer,是一个内部跟踪器,旨在帮助系统的开发人员和设计人员了解内核内部的情况,可以用来调试或分析在系统中发生的延迟和性能问题。尽管ftrace通常被认为是函数跟踪器,但它实际上是由几个不同的跟踪实用程序组成的框架。
Ftrace工作原理
Ftrace的基本工作原理是在内核函数中加入各种探测点,利用探测点跟踪函数的运行信息,然后将跟踪信息打印到内核的一个Ring Buffer中,而用户可以通过tracefs/debugfs来访问Ring Buffer中的数据。Ftrace的架构示意如下:
Ftrace包含两个核心组成:
- Framework core:管理各种tracer,同时利用tracefs文件系统对用户空间提供配置选项以及输出trace信息;
- tracers:ftrace实现了多种类型的tracer(追踪器),例如Function tracer、Function graph tracer等。tracer负责将trace信息保存到Ring Buffer中。
Ftrace追踪器
- nop:空操作跟踪器,不会跟踪任何内核活动,将 nop 写入 current_tracer 文件可以删除之前所使用的跟踪器,并清空之前收集到的跟踪信息,即刷新trace文件;
- function:函数调用追踪器,可以看出哪个函数何时调用,可以通过过滤器指定要跟踪的函数;
- function_graph:函数调用图跟踪器,可以清晰展现出函数的调用层次关系以及返回情况;
- sched_switch:进程上下文切换跟踪器,用来跟踪系统中进程切换情况;
- irqsoff :中断跟踪器,跟踪禁止中断的函数及相关信息;
- preemptoff :抢占跟踪器,跟踪禁止内核抢占的函数及相关信息;
- preemptirqsoff :抢占与中断跟踪器, 可以看做irqsoff 与preemptoff 二者的组合;
- mmiotrace:内存映射输入输出跟踪器,跟踪记录Memory Mapped I/O相关信息;
- wakeup :进程调度延迟跟踪器,记录高优先级进程从被唤醒到被系统调度执行期间的最大延迟时间;
- wakeup_rt :实时进程调度延迟跟踪器, 与wakeup 跟踪器类似, 但跟踪对象为实时进程;
- wakeup_dl :跟踪并记录唤醒SCHED_DEADLINE任务所需的最大延迟(如"wakeup”和"wakeup_rt”一样)
- blk :I/O追踪器,blktrace用户应用程序使用的跟踪器;
- hwlat :硬件延迟跟踪器。它用于检测硬件是否产生任何延迟。
Ftrace探测技术
Ftrace本质上是一种代码插桩技术,根据插桩方式的差异,Ftrace的探测机制可以分为以下两种:
- 静态探针:静态探测是在内核代码中调用ftrace提供的相应接口实现,通过在代码流程中手动插入一些tracepoint,用于支持Event tracing(事件跟踪),在内核编译后,就不能再动态修改。这些tracepoint的开关由内核配置选项控制。内核已经在一些关键的地方设置了静态探测点,可以在需要的时候查看;
- 动态探针:动态探测利用了GCC编译的profile特性,在内核编译时,在每个函数入口保留数个字节,然后在使用ftrace时,将保留的字节替换为需要的指令,比如跳转到需要的执行探测操作的代码,包括function tracer、function graph tracer都是基于动态探测机制实现。
GCC的profile特性
GCC支持profile特性,profile特性是在编译时添加-pg
选项,这样GCC会在所有函数的入口处加入对mcount的指令调用。用户可以自定义mcount函数,从而实现对函数的跟踪。
tracefs文件系统
Ftrace利用tracefs文件文件系统向用户空间提供控制文件,同时输出trace信息。
为了使用ftrace,需要先挂载tracefs文件系统,可以使用手动挂载或者自动挂载的方式。手动挂载的命令如下:
mount -t tracefs nodev /sys/kernel/tracing
自动挂载需要修改/etc/fstab
文件,可以在/etc/fstab
添加下列配置:
tracefs /sys/kernel/tracing tracefs defaults 0 0
在Linux内核的早期版本,ftrace使用debugfs文件系统存放所有的控制文件,目录位于/sys/kernel/debug/tracing
。为了保持向后兼容,当挂载debugfs文件系统时,tracefs文件系统也会自动被挂载到/sys/kernel/debug/tracing
目录中,因此/sys/kernel/trace
和/sys/kernel/debug/tracing
目录中的内容是相同的。
控制文件
- available_tracers:可用的追踪器;
- current_tracer:正在运行的追踪器;
- function_profile_enabled:启用函数性能分析器;
- available_filter_functions:可跟踪的完整函数列表;
- set_ftrace_filter:选择跟踪函数的列表;
- set_ftrace_notrace:设置不跟踪的函数列表;
- set_event_pid:设置跟踪的PID,表示仅跟踪PID程序的函数或者其他跟踪;
- tracing_on:是否启用跟踪,1启用跟踪0关闭跟踪;
- trace_options:设置跟踪的选项;
- trace_stat:函数性能分析的输出目录;
- kprobe_events:启用kprobe的配置;
- uprobe_events:启用uprobe的配置;
- events:事件跟踪器的控制文件:tracepoint、kprobe、uprobe。
trace信息
tracefs提供了两个文件用于查看生成的trace信息:trace和trace_pipe,其中:
- trace:以文本格式输出内核中追踪缓冲区的内容,是查看trace日志的接口;
- trace_pipe:跟踪的输出,可以在每次事件发生时读出追踪信息,但是读出的内容不能再次读出。
Ftrace使用
Ftrace最常见的使用方式有两种:
- tracers:包含了不同的跟踪程序,有延迟跟踪来检查禁用和启用中断之间发生的情况,以及抢占和从任务被唤醒到任务实际被调度的时间,开发人员可以根据需要选择;
- Event Tracing:整个内核中有数百个静态探测点,可以通过tracefs文件系统启用这些探测点,以查看内核某些系统的运行情况。
这里仅对tracer的使用进行简单的说明。
tracer配置步骤
tracer的使用分为三个步骤:
- 设置tracer类型
- 设置tracer参数
- 使能tracer
function tracer使用示例
- 挂载tracefs文件系统:
mount -t tracefs tracefs /sys/kernel/tracing
- 查看可用的tracer:
cat /sys/kernel/debug/tracing/available_tracers
- 设置当前使用的tracer:
echo function > /sys/kernel/debug/tracing/current_tracer
- 设置跟踪的函数:
echo dev_attr_show > /sys/kernel/debug/tracing/set_ftrace_filter
- 开启追踪功能:
echo 1 > /sys/kernel/debug/tracing/tracing_on
- 查看trace信息:
cat /sys/kernel/debug/tracing/trace_pipe
- 关闭追踪功能:
echo 0 > /sys/kernel/debug/tracing/tracing_on
相关参考
- Ftrace实现原理
- 内核态调测工具:ftrace(一)-初识
- Linux性能工具(一)ftrace使用
- 宋宝华:关于Ftrace的一个完整案例
- Linux性能工具(二)ftrace基础篇
- 通过Ftrace实现高效、精确的内核调试与分析
- 从 Ftrace 开始内核探索之旅
- trace系列0 - ftrace初始化