4. tracefs 文件系统:挂载与关键文件解析

Ftrace 的所有控制接口和追踪数据都通过 tracefs 伪文件系统暴露给用户空间。理解 tracefs 的挂载方式以及 available_tracers、current_tracer 等核心文件的作用,是进行函数追踪和参数配置的第一步。本章将系统梳理 tracefs 的挂载流程、关键文件的语义以及它们之间的协作关系。

4.1 tracefs 挂载与验证

tracefs 通常自动挂载在 /sys/kernel/tracing 目录下。如果未自动挂载,或需要手动挂载到其他路径,可以使用以下命令:

# 挂载 tracefs 到默认路径
mount -t tracefs tracefs /sys/kernel/tracing

# 验证挂载是否成功
mount | grep tracefs
ls /sys/kernel/tracing/

挂载成功后,/sys/kernel/tracing/ 目录下会出现一系列控制文件和追踪结果文件。下表列出了最核心的几个文件及其功能分类:

文件名称 功能分类 核心作用
available_tracers 追踪器枚举 列出当前内核支持的所有追踪器类型
current_tracer 追踪器选择 读取或设置当前激活的追踪器
tracing_on 全局开关 控制整个追踪系统的启停(0 关闭,1 开启)
trace 数据输出 以人类可读格式输出追踪结果
trace_pipe 数据输出 以流式管道输出追踪结果,支持实时读取
set_ftrace_filter 函数过滤 设置需要追踪的函数白名单(支持通配符)
set_ftrace_notrace 函数过滤 设置不需要追踪的函数黑名单
available_filter_functions 函数枚举 列出所有可被 ftrace 追踪的内核函数
调试提示: 如果 /sys/kernel/tracing 目录为空或不存在,请先执行 mount -t tracefs tracefs /sys/kernel/tracing。部分嵌入式系统可能需要在内核配置中启用 CONFIG_TRACING 和 CONFIG_TRACEFS。

4.2 available_tracers:查看内核支持的追踪器

available_tracers 文件列出了当前内核编译时启用的所有追踪器类型。读取该文件可以快速了解当前环境支持哪些追踪能力:

cat /sys/kernel/tracing/available_tracers
# 输出示例:
# function function_graph wakeup_dl wakeup_rt wakeup irqsoff preemptoff preemptirqsoff nop

常见的追踪器及其适用场景如下:

  • nop:空追踪器,不执行任何追踪操作,用于关闭追踪。
  • function:函数调用追踪器,记录每个内核函数的调用事件。
  • function_graph:函数调用图追踪器,以缩进格式显示函数调用层级和耗时。
  • irqsoff:中断关闭延迟追踪器,用于测量中断被关闭的最大时长。
  • preemptoff:抢占关闭延迟追踪器,用于测量抢占被关闭的最大时长。
  • wakeup / wakeup_rt / wakeup_dl:进程唤醒延迟追踪器,分别针对普通进程、实时进程和 deadline 进程。

4.3 current_tracer:激活与切换追踪器

current_tracer 文件用于读取当前激活的追踪器,或写入新的追踪器名称来切换追踪模式。切换时,Ftrace 会自动重置内部状态并开始新模式的追踪。

# 查看当前追踪器
cat /sys/kernel/tracing/current_tracer
# 输出示例:nop

# 切换到 function 追踪器
echo function > /sys/kernel/tracing/current_tracer

# 验证切换结果
cat /sys/kernel/tracing/current_tracer
# 输出示例:function
注意事项: 切换追踪器前,建议先执行 echo 0 > tracing_on 暂停追踪,切换完成后再 echo 1 > tracing_on 恢复。这样可以避免在切换过程中产生不完整的追踪数据。

4.4 关键文件协作关系:从配置到数据输出

tracefs 中的各个文件并非孤立存在,它们构成了一个完整的追踪工作流。下面的 SVG 图展示了从挂载到数据输出的核心协作关系:

tracefs 关键文件协作关系图 tracefs 关键文件协作关系 mount -t tracefs available_tracers current_tracer tracing_on set_ftrace_filter set_ftrace_notrace available_filter_functions trace(静态输出) trace_pipe(流式输出) 追踪结果分析与故障定位 说明:箭头方向表示数据流或配置依赖关系,实际使用时可跳过部分中间步骤直接操作输出文件

4.5 典型操作流程:从挂载到获取追踪数据

以下是一个完整的操作流程,展示了如何利用 tracefs 关键文件完成一次函数追踪:

  1. 挂载 tracefs:mount -t tracefs tracefs /sys/kernel/tracing
  2. 查看可用追踪器:cat available_tracers,确认 function 或 function_graph 存在。
  3. 设置追踪器:echo function_graph > current_tracer
  4. 设置过滤函数(可选):echo 'do_sys_open*' > set_ftrace_filter
  5. 开启追踪:echo 1 > tracing_on
  6. 触发目标操作:执行需要追踪的系统调用或驱动操作。
  7. 读取追踪结果:cat trace 或 cat trace_pipe(实时流式输出)。
  8. 关闭追踪:echo 0 > tracing_on,然后 echo nop > current_tracer 恢复默认状态。
实践要点: 在排查内核探针驱动问题时,建议优先使用 function_graph 追踪器配合 set_ftrace_filter 精确过滤目标驱动函数。这样既能获得完整的调用层级信息,又能避免产生过多无关数据导致性能下降。