目录
一、概述
在 Linux 中,ftrace 是一种用于跟踪内核函数调用和事件的工具。它是一个功能强大的跟踪框架,可用于分析和调试内核性能问题。
ftrace 提供了多种功能,包括函数跟踪、事件记录和性能分析等。它能够记录函数的调用和返回信息,以及函数执行的路径和时间。通过跟踪这些信息,我们可以了解到内核函数的执行情况,从而定位和解决性能问题。
ftrace 使用了内核中的一些机制来实现跟踪功能。其中一个关键的机制是函数预编译器,它会在每个内核函数的入口和出口处插入一些特殊的指令,用于记录函数的调用和返回信息。这些指令可以通过内核配置选项来启用或禁用。
此外,ftrace 还支持事件跟踪,可以记录系统中发生的各种事件,比如中断、系统调用、定时器事件等。通过分析这些事件的发生频率和顺序,可以帮助我们找出系统中的瓶颈和性能问题。
除了记录和分析跟踪信息外,ftrace 还提供了一些工具和接口,用于配置和控制跟踪功能。其中最常用的工具是 trace-cmd 和 trace-cmd-report,它们可以用来收集和分析跟踪数据。
二、ftrace 的使用
1、常用信息
ftrace 是一个自 Linux 2.6 版本起就支持的内核调试工具。最初,ftrace 主要用于函数级别的跟踪(function trace),但经过不断发展,ftrace现已成为一个通用的调试框架,能够实现多种跟踪目的。
ftrace通过 debugfs 虚拟文件系统向用户空间提供访问接口。通常,debugfs 会挂载在 /sys/kernel/debug 目录下,而 ftrace的控制和输出文件位于该目录下的 tracing子目录中,完整路径为 /sys/kernel/debug/tracing。所以要使用 ftrace,就要先进入到 sys/kernel/debug/tracing 目录中(仅对 root 用户可用):
$ cd /sys/kernel/debug/tracing
这个目录下的内容如下:

其中的核心文件介绍如下表:
| 文件 | 描述 |
|---|---|
| available_tracers | 可用跟踪器,hwlat blk function_graph wakeup_dl wakeup_rt wakeup function nop,nop 表示不使用跟踪器 |
| current_tracer | 当前使用的跟踪器 |
| function_profile_enabled | 启用函数性能分析器 |
| available_filter_functions | 可跟踪的完整函数列表 |
| set_ftrace_filter | 选择跟踪函数的列表,支持批量设置,例如 tcp、tcp 和 tcp 等 |
| set_ftrace_notrace | 设置不跟踪的函数列表 |
| set_event_pid | 设置跟踪的 PID,表示仅跟踪 PID 程序的函数或者其他跟踪 |
| tracing_on | 是否启用跟踪,1 启用跟踪;0 关闭跟踪 |
| trace_options | 设置跟踪的选项 |
| trace_stat(目录) | 函数性能分析的输出目录 |
| kprobe_events | 启用 kprobe 的配置 |
| uprobe_events | 启用 uprobe 的配置 |
| events ( 目录 ) | 事件(Event)跟踪器的控制文件: tracepoint、kprobe、uprobe |
| trace | 跟踪的输出 (Ring Buffer) |
| trace_pipe | 跟踪的输出;提供持续不断的数据流,适用于程序进行读取 |
更详细的信息查阅 ftrace 官方文档。
2、指定 ftrace 跟踪器
ftrace 支持多种追踪类型,包括函数调用、函数图、硬件延迟、中断关闭、抢占关闭等,我们可以用上一小节提到的 available_tracers 来查看可用的跟踪器:
$ sudo cat /sys/kernel/debug/tracing/available_tracers
timerlat osnoise hwlat blk mmiotrace function_graph wakeup_dl wakeup_rt wakeup function nop
如下是其中一些特性的介绍:
- function : 一个无需参数的函数调用跟踪程序
- function_graph : 一个使用子调用的函数调用跟踪程序
- blk: 一个与块 I/O 跟踪相关的调用和事件跟踪程序(它是 blktrace 使用的)
- mmiotrace: 一个内存映射 I/O 操作跟踪程序
- nop :最简单的跟踪程序,就像它的名字所暗示的那样,它不做任何事情
其中比较常用的是 function 和 function_graph。如要要设置跟踪器类型,需要把类型写入到 current_tracer 文件。比如设置类型为 function_graph 可以这样操作
sudo sh -c "echo function_graph > /sys/kernel/debug/tracing/current_tracer"
3、设置要跟踪的函数
set_ftrace_filter 表示要跟踪的函数,比如追踪 epoll_wait 可以这样操作:
sudo sh -c "echo SyS_epoll_wait > /sys/kernel/debug/tracing/set_ftrace_filter"
set_graph_function 用于设置 function_graph 跟踪器的触发函数

最低0.47元/天 解锁文章
798

被折叠的 条评论
为什么被折叠?



