
概述FtraceFunction Tracer是 Linux 内核内置的追踪框架其设计目标是帮助开发人员与系统工程师了解内核的运行行为定位延迟、性能问题及异常执行路径。尽管名称源自函数追踪Ftrace 本质上是一个由多种追踪器tracer组成的可扩展框架涵盖函数调用、调度切换、中断延迟、内存映射 I/O 等多个维度。与外部工具不同Ftrace 直接运行在内核空间通过编译期插桩或动态探测技术在极低开销下获取追踪数据并通过 tracefs 文件系统向用户空间提供统一的配置与读取接口。这一设计使其成为内核问题定位的首选工具之一适用范围从开发调试延伸到生产环境的性能归因。Ftrace的基本工作原理是在内核函数中加入各种探测点利用探测点跟踪函数的运行信息然后将跟踪信息打印到内核的一个Ring Buffer中而用户可以通过tracefs/debugfs来访问Ring Buffer中的数据。Ftrace的架构示意如下该图来自于浅析Linux追踪技术之ftrace综述感谢博主 Aspiresky。基本原理就先讲到这接下来我们先看下怎么用。1. 问题定义我们聚焦于两个核心目标其一在最短路径内完成一次可验证的 Ftrace 采集闭环其二建立 tracefs 控制的基础结构认知。采集闭环为固定的操作序列“关闭历史状态、选择追踪器、开启追踪、触发工作负载、关闭追踪、读取结果、清理环境”控制认知为掌握各关键文件在采集控制、过滤控制、数据输出与会话隔离四个维度上的职责边界。2. 前置条件系统需要启用 ftrace 能力并可访问 tracefs。对 tracefs 控制文件的读写操作均需要 root 权限若以非 root 用户执行需在每条命令前加sudo或在会话开始时执行sudo -s切换为 root shell。建议先确认 tracefs 挂载路径再执行后续步骤。若环境同时存在 debugfs 与 tracefs优先使用 tracefs 路径以保证接口一致性。执行后续步骤前建议完成以下三项基础验证。以下命令均需在 root shell 下执行即已通过sudo -s或直接以 root 登录否则需在每条命令前加sudo。验证一tracefs 挂载点可访问ls/sys/kernel/tracing/若目录存在且可列出内容表明 tracefs 已正常挂载。若目录不存在或为空需手动挂载sudomount-ttracefs nodev /sys/kernel/tracing部分旧内核发行版仅挂载 debugfs此时 tracefs 入口位于/sys/kernel/debug/tracing/后续所有路径均需相应调整。验证二基础控制文件完整性ls/sys/kernel/tracing/{current_tracer,tracing_on,trace,trace_pipe,available_tracers}上述五个文件应全部可见。若缺少其中任意一项通常表明内核编译时未启用CONFIG_FTRACE需确认内核配置后重新构建。验证三function tracer 可用cat/sys/kernel/tracing/available_tracers输出示例blk function_graph wakeup_dl wakeup_rt wakeup function nop若输出中包含function表明编译器插桩CONFIG_FUNCTION_TRACER已启用可继续后续操作。若仅有nop则需检查内核编译选项。3. 操作步骤以下流程以 function tracer 为例完整演示采集闭环的执行序列及核心控制文件的使用方式。进入 tracefs 根目录并清理历史状态关闭追踪、切回 nop、清空历史 trace。选择 function 作为当前 tracer并按需设置函数过滤条件。打开追踪开关触发一个短时负载例如一次文件读取或进程启动。关闭追踪开关读取 trace 快照并保存。结束后恢复到 nop并再次清空 trace避免污染后续实验。建议将上述动作固化为脚本避免人工操作造成状态遗漏。最小命令序列如下路径按实际环境调整TR/sys/kernel/tracingcd$TRecho0tracing_onechonopcurrent_tracerechotraceechofunctioncurrent_tracer# 可选echo schedule set_ftrace_filterecho1tracing_oncat/etc/hosts/dev/nullecho0tracing_oncattrace/tmp/ftrace_minimal.traceechonopcurrent_tracerechotrace若需在多用户或多任务并行场景中隔离采集会话可在独立实例目录下执行相同闭环流程TR/sys/kernel/tracingINST$TR/instances/demomkdir-p$INSTecho0$INST/tracing_onechonop$INST/current_tracerecho$INST/traceechofunction$INST/current_tracerecho1$INST/tracing_oncat/etc/hosts/dev/nullecho0$INST/tracing_oncat$INST/trace/tmp/ftrace_demo_instance.traceechonop$INST/current_tracerecho$INST/trace4. 输出解读本节从两个维度说明输出解读方法其一判断采集是否成功的标准其二tracefs 控制面与数据面的职责分工。常用控制文件可按职责分组采集控制tracing_on、current_tracer。过滤控制set_ftrace_filter、set_ftrace_notrace。数据输出trace快照读取、trace_pipe流式读取。能力发现available_tracers、available_filter_functions。会话隔离instances/name/下同名控制文件。最小闭环成功通常满足以下特征。trace 输出包含时间戳、CPU 编号、任务上下文与函数名字段。负载触发窗口内存在连续函数记录而非零散单行数据。切回 nop 并清空后trace 文件回到空白或仅保留头部信息。在实例目录采集时默认实例与目标实例的数据互不污染。若输出仅包含头部注释而无函数记录应优先排查两点一是是否在tracing_on置 1 后触发了可观测负载二是过滤条件是否收敛到未被触发的函数范围。使用trace_pipe时需注意其消费式读取语义每条记录被读取后即从缓冲区移除重复读取不会返回同一批数据。5. 常见误判将历史残留记录误当成本次结果。根因通常是未在采集前执行清空操作。在tracing_on仍为 1 时读取并对比结果导致样本边界不稳定。误以为无输出即表示追踪失败。若过滤条件收敛到未被触发的函数范围同样会产生空结果。混用默认实例与自定义实例路径导致配置路径与读取路径不一致所得结果无法对应。将trace与trace_pipe当作等价的读取接口忽略二者在语义上的根本差异。在高频函数路径上直接启用完整 function 追踪因输出量过大导致判读噪声显著上升。6. 小结本篇建立了 Ftrace 的最小可用路径并完成了对 tracefs 控制面与数据面基础职责的系统说明。下一篇将聚焦于常用 tracer 的选型原则与实操方法系统说明面对不同问题类型时应如何选择与配置追踪器。