4. ftrace 环境搭建:内核配置选项、tracefs 挂载与常用工具

ftrace 是 Linux 内核内置的跟踪器,用于分析内核内部的事件、函数调用和抢占行为。要使用 ftrace 进行调度延迟分析,首先需要确保内核正确配置、文件系统挂载,并熟悉命令行工具。本节将系统性地讲解 ftrace 环境搭建的完整流程。

核心目标: 搭建一个可用的 ftrace 环境,能够通过 trace-cmd 和 kernelshark 采集并可视化调度延迟数据。

4.1 内核配置选项

ftrace 依赖于内核编译时的配置选项。大多数主流发行版(如 Ubuntu、CentOS、Fedora)的默认内核已启用 ftrace,但为了获得完整的调度延迟分析能力,建议确认以下关键选项已开启。

配置选项 功能描述 调度延迟分析中的必要性
CONFIG_FTRACE ftrace 主开关,启用内核跟踪基础设施 必须
CONFIG_FUNCTION_TRACER 启用函数跟踪,可记录内核函数调用 必须
CONFIG_FUNCTION_GRAPH_TRACER 启用函数图跟踪,显示函数调用层级与耗时 推荐
CONFIG_SCHED_TRACER 启用调度器跟踪,记录进程切换、唤醒、迁移事件 必须
CONFIG_PREEMPT_TRACER 启用抢占跟踪,记录抢占点触发与延迟 核心
CONFIG_IRQSOFF_TRACER 跟踪中断关闭时间,用于分析关中断导致的延迟 推荐
CONFIG_PREEMPTIRQSOFF_TRACER 综合跟踪抢占与中断关闭延迟 推荐
CONFIG_STACKTRACE 支持栈回溯,帮助定位延迟发生的代码路径 推荐
检查当前内核配置: 使用 cat /boot/config-$(uname -r) | grep CONFIG_FTRACE 查看当前内核是否已启用 ftrace。如果输出显示 CONFIG_FTRACE=y,则说明已启用。

如果内核未启用 ftrace,需要重新编译内核。以下是一个最小化的 ftrace 配置片段(.config 文件):

# 基础 ftrace 支持
CONFIG_FTRACE=y
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y

# 调度与抢占跟踪
CONFIG_SCHED_TRACER=y
CONFIG_PREEMPT_TRACER=y
CONFIG_IRQSOFF_TRACER=y
CONFIG_PREEMPTIRQSOFF_TRACER=y

# 辅助功能
CONFIG_STACKTRACE=y
CONFIG_DYNAMIC_FTRACE=y
CONFIG_FTRACE_SYSCALLS=y
CONFIG_TRACING_EVENTS=y

4.2 挂载 tracefs

ftrace 通过 tracefs 虚拟文件系统暴露控制接口和跟踪数据。默认挂载点为 /sys/kernel/tracing。如果该目录不存在或为空,需要手动挂载。

4.2.1 检查挂载状态

# 查看 tracefs 是否已挂载
mount | grep tracefs

# 或检查 /sys/kernel/tracing 目录是否存在且包含文件
ls /sys/kernel/tracing/

如果输出为空或显示 mount: (nothing),则需要挂载。

4.2.2 手动挂载 tracefs

# 创建挂载点(如果不存在)
sudo mkdir -p /sys/kernel/tracing

# 挂载 tracefs
sudo mount -t tracefs tracefs /sys/kernel/tracing

4.2.3 永久挂载(可选)

编辑 /etc/fstab 文件,添加以下行以实现开机自动挂载:

tracefs       /sys/kernel/tracing       tracefs       defaults        0       0
权限注意: 普通用户默认无法访问 tracefs 中的文件。建议将用户加入 trace 组(如果存在)或使用 sudo。生产环境中,可通过 chmod 或 udev 规则调整权限,但需谨慎评估安全风险。

4.3 tracefs 目录结构速览

挂载成功后,/sys/kernel/tracing 目录下会出现一系列控制文件和跟踪数据文件。以下是与调度延迟分析最相关的文件:

文件/目录 用途
available_tracers 列出当前内核支持的跟踪器类型(如 function、function_graph、preemptirqsoff)
current_tracer 设置或查看当前激活的跟踪器
tracing_on 全局开关,写入 1 开启跟踪,写入 0 停止跟踪
trace 以人类可读格式输出跟踪结果
trace_pipe 以流式输出跟踪结果,适合实时查看
set_event 启用或禁用特定跟踪事件(如 sched_switch、sched_wakeup)
buffer_size_kb 设置每个 CPU 的跟踪缓冲区大小(KB)
per_cpu/ 每个 CPU 的独立跟踪数据目录
快速验证: 执行 sudo cat /sys/kernel/tracing/available_tracers,如果输出包含 preemptirqsoff 或 preemptoff,说明抢占跟踪器可用。

4.4 常用命令行工具

虽然可以直接操作 tracefs 文件,但使用专用工具可以大幅提升效率。以下两个工具是 ftrace 生态中的核心。

4.4.1 trace-cmd

trace-cmd 是 ftrace 的命令行前端,封装了 tracefs 的复杂操作,支持录制、回放和过滤跟踪数据。

安装:

# Ubuntu/Debian
sudo apt-get install trace-cmd

# CentOS/RHEL/Fedora
sudo yum install trace-cmd

# 从源码编译(可选)
git clone git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git
cd trace-cmd
make
sudo make install

常用命令示例:

# 列出所有可用事件
trace-cmd list -e

# 记录调度切换事件,持续 5 秒
sudo trace-cmd record -e sched_switch -e sched_wakeup -o trace.dat sleep 5

# 以人类可读格式查看记录
trace-cmd report trace.dat

# 实时查看跟踪输出(类似 trace_pipe)
sudo trace-cmd start -e sched_switch
sudo trace-cmd show
sudo trace-cmd stop

4.4.2 kernelshark

kernelshark 是 trace-cmd 的图形化前端,提供时间轴视图、过滤器、搜索和统计功能,非常适合分析调度延迟的时间分布。

安装:

# Ubuntu/Debian
sudo apt-get install kernelshark

# CentOS/RHEL/Fedora
sudo yum install kernelshark

# 从源码编译(与 trace-cmd 同仓库)
cd trace-cmd
make gui
sudo make install_gui

使用流程:

  1. 使用 trace-cmd 录制数据:sudo trace-cmd record -e sched_switch -o trace.dat
  2. 启动 kernelshark 加载数据文件:kernelshark trace.dat
  3. 在图形界面中,使用时间轴缩放、事件过滤、CPU 视图等功能分析调度延迟。
生产环境建议: 在嵌入式或服务器环境中,优先使用 trace-cmd 命令行工具,避免图形界面的依赖。kernelshark 更适合在开发或调试工作站上使用。

4.5 ftrace 环境架构图

下图展示了 ftrace 环境的核心组件及其交互关系,从内核配置到用户态工具的数据流。

ftrace 环境架构图 ftrace 环境架构:从内核配置到可视化分析 内核编译配置层 CONFIG_FTRACE=y | CONFIG_SCHED_TRACER=y | CONFIG_PREEMPT_TRACER=y | CONFIG_FUNCTION_TRACER=y tracefs 虚拟文件系统 挂载点:/sys/kernel/tracing | 控制文件:current_tracer, tracing_on, set_event 用户态工具层 trace-cmd(命令行) | kernelshark(图形化) | 直接读写 tracefs 文件 输出与可视化层 trace.dat 文件 | 时间轴视图 | 延迟分布直方图 | 抢占点标记 说明:数据流自上而下,内核配置决定 ftrace 功能,tracefs 提供接口,用户态工具封装操作,最终输出可视化分析结果。

4.6 环境验证清单

完成上述步骤后,建议执行以下验证流程,确保环境可用:

  1. 检查内核配置: cat /boot/config-$(uname -r) | grep -E "CONFIG_FTRACE|CONFIG_SCHED_TRACER|CONFIG_PREEMPT_TRACER"
  2. 确认 tracefs 挂载: mount | grep tracefs
  3. 列出可用跟踪器: sudo cat /sys/kernel/tracing/available_tracers
  4. 测试基本跟踪: sudo trace-cmd record -e sched_switch -o /tmp/test.dat sleep 1
  5. 验证数据文件: trace-cmd report /tmp/test.dat | head -20
常见问题排查:
  • 如果 available_tracers 为空,说明内核未编译 ftrace 或配置不完整,需重新编译内核。
  • 如果 trace-cmd record 报权限错误,请使用 sudo 或将用户加入 trace 组。
  • 如果 kernelshark 无法启动,检查是否安装了 libtraceevent 和 libtracefs 开发库。