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 映射关系 ★★★☆☆
/sys/kernel/debug/tracing/ 核心文件与调度调试路径 /sys/kernel/debug/tracing/ 控制类文件 过滤类文件 事件类目录 current_tracer tracing_on trace / trace_pipe set_ftrace_filter set_ftrace_notrace available_filter_functions events/sched/ events/sched/sched_switch/ events/sched/sched_wakeup/ 调度调试核心操作路径 1. 选择 tracer:echo function_graph > current_tracer 2. 过滤函数:echo __schedule > set_ftrace_filter 3. 开启事件:echo 1 > events/sched/sched_switch/enable 4. 读取结果:cat trace 或 cat trace_pipe

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
per_cpu 目录结构示意图 per_cpu/ cpu0/ cpu1/ cpu2/ trace trace_pipe 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/ 观察文件列表,然后对照本节表格逐一操作每个文件,形成肌肉记忆。