4. /sys/kernel/debug/tracing/ 目录结构详解与关键文件作用
ftrace 的核心控制接口全部位于 /sys/kernel/debug/tracing/ 目录下。这个虚拟文件系统(tracefs)是用户态与内核 ftrace 框架交互的唯一通道。理解该目录的结构和每个关键文件的作用,是熟练使用 ftrace 调试调度器的基础。
挂载检查: 如果该目录为空或不存在,请先执行
mount -t tracefs tracefs /sys/kernel/debug/tracing 或 mount -t debugfs debugfs /sys/kernel/debug 挂载。
4.1 顶层目录结构总览
以下表格列出了 /sys/kernel/debug/tracing/ 下最核心的文件和子目录,按功能分类说明。
| 文件/目录名 | 类型 | 核心作用 | 调度调试相关度 |
|---|---|---|---|
available_tracers |
文件 | 列出当前内核支持的 tracer 列表(如 function、function_graph、wakeup 等) | ★★★★★ |
current_tracer |
文件 | 读取/设置当前激活的 tracer | ★★★★★ |
tracing_on |
文件 | 全局追踪开关(1 开启,0 关闭) | ★★★★★ |
trace |
文件 | 输出追踪结果(人类可读格式) | ★★★★★ |
trace_pipe |
文件 | 流式输出追踪结果(阻塞读取,实时查看) | ★★★★☆ |
set_ftrace_filter |
文件 | 设置函数过滤白名单(只追踪匹配的函数) | ★★★★★ |
set_ftrace_notrace |
文件 | 设置函数过滤黑名单(不追踪匹配的函数) | ★★★★☆ |
available_filter_functions |
文件 | 列出所有可被 ftrace 追踪的内核函数 | ★★★★★ |
events/ |
目录 | 存放所有 trace event 的控制文件(调度事件在此目录下) | ★★★★★ |
buffer_size_kb |
文件 | 设置每个 CPU 的追踪缓冲区大小(KB) | ★★★☆☆ |
per_cpu/ |
目录 | 存放每个 CPU 独立的追踪缓冲区和统计信息 | ★★★☆☆ |
trace_options |
文件 | 控制追踪行为的选项(如是否显示时间戳、进程名等) | ★★★★☆ |
saved_cmdlines |
文件 | 保存已追踪进程的 PID 与 comm 映射关系 | ★★★☆☆ |
4.2 控制类核心文件详解
4.2.1 current_tracer — 选择追踪器
写入 tracer 名称即可切换。调度调试最常用的 tracer 是 function_graph 和 wakeup。
# 查看当前 tracer
cat /sys/kernel/debug/tracing/current_tracer
# 设置为 function_graph(显示函数调用图)
echo function_graph > /sys/kernel/debug/tracing/current_tracer
# 设置为 nop(关闭追踪)
echo nop > /sys/kernel/debug/tracing/current_tracer
4.2.2 tracing_on — 全局开关
写入 0 暂停追踪,写入 1 恢复。注意:切换 tracer 时该文件会自动置 0,需要重新开启。
# 暂停追踪
echo 0 > /sys/kernel/debug/tracing/tracing_on
# 恢复追踪
echo 1 > /sys/kernel/debug/tracing/tracing_on
4.2.3 trace 与 trace_pipe — 读取结果
- trace:静态快照。读取后缓冲区内容不变,可反复查看。
- trace_pipe:流式输出。读取后数据从缓冲区移除,适合实时监控。
# 查看静态追踪结果
cat /sys/kernel/debug/tracing/trace
# 实时流式查看(Ctrl+C 退出)
cat /sys/kernel/debug/tracing/trace_pipe
性能注意: 使用
trace_pipe 时,每次读取都会触发内核数据拷贝,高频率读取可能影响系统性能。生产环境建议先写入 trace 文件,事后分析。
4.3 过滤类核心文件详解
4.3.1 set_ftrace_filter — 函数级白名单
只追踪匹配的函数。支持通配符 *。调度器核心函数 __schedule、try_to_wake_up 等常用此文件过滤。
# 只追踪 __schedule 函数
echo __schedule > /sys/kernel/debug/tracing/set_ftrace_filter
# 追踪所有以 sched 开头的函数
echo sched* > /sys/kernel/debug/tracing/set_ftrace_filter
# 追加多个函数(用换行符分隔)
echo '__schedule
try_to_wake_up' > /sys/kernel/debug/tracing/set_ftrace_filter
4.3.2 available_filter_functions — 可追踪函数清单
该文件列出了所有可以被 ftrace 动态插桩的内核函数。调度器相关的函数通常以 __schedule、sched_、dequeue_task、enqueue_task 等命名。
# 查看所有可追踪的调度相关函数
grep sched /sys/kernel/debug/tracing/available_filter_functions | head -20
4.4 事件类目录:events/ 详解
events/ 目录是 trace event 的入口。每个子系统(如 sched、irq、timer)都有一个子目录,每个事件又包含 enable、filter、format 等控制文件。
4.4.1 调度事件子目录结构
| 事件路径 | 触发时机 | 关键字段 |
|---|---|---|
events/sched/sched_switch/ |
进程切换时 | prev_comm, prev_pid, next_comm, next_pid |
events/sched/sched_wakeup/ |
唤醒进程时 | comm, pid, target_cpu |
events/sched/sched_wakeup_new/ |
唤醒新创建进程时 | comm, pid, target_cpu |
events/sched/sched_migrate_task/ |
任务跨 CPU 迁移时 | comm, pid, orig_cpu, dest_cpu |
events/sched/sched_process_exec/ |
进程执行 exec 时 | filename, pid |
events/sched/sched_process_exit/ |
进程退出时 | comm, pid |
4.4.2 事件控制文件说明
每个事件目录下都有以下三个核心文件:
- enable:写入
1开启该事件追踪,写入0关闭。 - filter:设置事件过滤条件(如只追踪特定 PID 的切换)。
- format:显示该事件的字段格式,用于编写过滤表达式。
# 开启 sched_switch 事件追踪
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable
# 只追踪 PID 为 1234 的进程切换
echo 'next_pid == 1234' > /sys/kernel/debug/tracing/events/sched/sched_switch/filter
# 查看 sched_switch 事件的字段格式
cat /sys/kernel/debug/tracing/events/sched/sched_switch/format
调度调试最佳实践: 同时开启
sched_switch 和 sched_wakeup 事件,可以完整还原一个进程从被唤醒到获得 CPU 的完整生命周期。
4.5 缓冲区与选项配置
4.5.1 buffer_size_kb — 缓冲区大小
每个 CPU 的追踪缓冲区独立。默认大小通常为 1408 KB(约 1.4 MB)。高频调度事件可能需要增大缓冲区以避免丢失事件。
# 查看当前缓冲区大小(每个 CPU)
cat /sys/kernel/debug/tracing/buffer_size_kb
# 设置为 4096 KB(4 MB)
echo 4096 > /sys/kernel/debug/tracing/buffer_size_kb
4.5.2 trace_options — 输出格式控制
该文件控制 trace 输出的详细程度。常用选项包括:
| 选项名 | 作用 | 推荐值 |
|---|---|---|
print-parent |
显示函数调用者信息 | 关闭(减少输出量) |
sym-offset |
显示符号偏移量 | 开启(便于定位代码) |
context-info |
显示进程名、PID、CPU、时间戳 | 开启(默认) |
latency-format |
显示延迟追踪格式(用于 wakeup tracer) | 按需开启 |
# 关闭 context-info(减少输出行长度)
echo nocontext-info > /sys/kernel/debug/tracing/trace_options
# 开启 sym-offset
echo sym-offset > /sys/kernel/debug/tracing/trace_options
4.6 per_cpu 目录与多核追踪
per_cpu/ 目录下包含每个 CPU 独立的追踪缓冲区文件。当需要分析特定 CPU 上的调度行为时非常有用。
# 查看 CPU0 的追踪缓冲区
cat /sys/kernel/debug/tracing/per_cpu/cpu0/trace
# 查看 CPU1 的追踪统计
cat /sys/kernel/debug/tracing/per_cpu/cpu1/stats
4.7 关键文件速查表
| 调试目标 | 操作文件 | 典型写入值 |
|---|---|---|
| 开启函数调用图 | current_tracer |
function_graph |
| 只追踪 __schedule | set_ftrace_filter |
__schedule |
| 开启调度切换事件 | events/sched/sched_switch/enable |
1 |
| 只追踪特定进程切换 | events/sched/sched_switch/filter |
next_pid == 1234 |
| 增大缓冲区 | buffer_size_kb |
4096 |
| 实时查看输出 | trace_pipe |
cat |
| 暂停/恢复追踪 | tracing_on |
0 或 1 |
学习建议: 打开一个终端,反复执行
ls -la /sys/kernel/debug/tracing/ 观察文件列表,然后对照本节表格逐一操作每个文件,形成肌肉记忆。