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 图展示了从挂载到数据输出的核心协作关系:
4.5 典型操作流程:从挂载到获取追踪数据
以下是一个完整的操作流程,展示了如何利用 tracefs 关键文件完成一次函数追踪:
- 挂载 tracefs:
mount -t tracefs tracefs /sys/kernel/tracing - 查看可用追踪器:
cat available_tracers,确认function或function_graph存在。 - 设置追踪器:
echo function_graph > current_tracer - 设置过滤函数(可选):
echo 'do_sys_open*' > set_ftrace_filter - 开启追踪:
echo 1 > tracing_on - 触发目标操作:执行需要追踪的系统调用或驱动操作。
- 读取追踪结果:
cat trace或cat trace_pipe(实时流式输出)。 - 关闭追踪:
echo 0 > tracing_on,然后echo nop > current_tracer恢复默认状态。
实践要点: 在排查内核探针驱动问题时,建议优先使用
function_graph 追踪器配合 set_ftrace_filter 精确过滤目标驱动函数。这样既能获得完整的调用层级信息,又能避免产生过多无关数据导致性能下降。