4. ftrace 环境搭建:内核配置选项、tracefs 挂载与常用工具
ftrace 是 Linux 内核内置的跟踪器,用于分析内核内部的事件、函数调用和抢占行为。要使用 ftrace 进行调度延迟分析,首先需要确保内核正确配置、文件系统挂载,并熟悉命令行工具。本节将系统性地讲解 ftrace 环境搭建的完整流程。
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
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
使用流程:
- 使用 trace-cmd 录制数据:
sudo trace-cmd record -e sched_switch -o trace.dat - 启动 kernelshark 加载数据文件:
kernelshark trace.dat - 在图形界面中,使用时间轴缩放、事件过滤、CPU 视图等功能分析调度延迟。
4.5 ftrace 环境架构图
下图展示了 ftrace 环境的核心组件及其交互关系,从内核配置到用户态工具的数据流。
4.6 环境验证清单
完成上述步骤后,建议执行以下验证流程,确保环境可用:
- 检查内核配置:
cat /boot/config-$(uname -r) | grep -E "CONFIG_FTRACE|CONFIG_SCHED_TRACER|CONFIG_PREEMPT_TRACER" - 确认 tracefs 挂载:
mount | grep tracefs - 列出可用跟踪器:
sudo cat /sys/kernel/tracing/available_tracers - 测试基本跟踪:
sudo trace-cmd record -e sched_switch -o /tmp/test.dat sleep 1 - 验证数据文件:
trace-cmd report /tmp/test.dat | head -20
- 如果
available_tracers为空,说明内核未编译 ftrace 或配置不完整,需重新编译内核。 - 如果
trace-cmd record报权限错误,请使用sudo或将用户加入trace组。 - 如果 kernelshark 无法启动,检查是否安装了
libtraceevent和libtracefs开发库。