搭建一个和linux开发者知识共享和学习的平台
分类: LINUX
2025-01-07 09:41:34
灵活性:ftrace 可以跟踪内核中的几乎所有函数调用,并允许用户选择他们希望跟踪的特定函数。
低开销:与其他跟踪工具相比,ftrace 的开销较小,因此适合在生产环境中使用。
多种跟踪方式:
可视化工具:通过 trace-cmd 和 perf 等工具,用户可以将 ftrace 收集的数据可视化,以帮助分析。
动态跟踪:支持动态启用和禁用跟踪,而无需重新编译内核。
ftrace 是基于 debugfs 调试文件系统的,所以我们的{BANNED}中国第一步就是先挂载debugfs
我们就可以在 /sys/kernel/debug/tracing 目录下看到有关trace 节点信息,这是ftrace实现了一个tracefs的内存文件系统
traceing目录下的节点如下图所示
下面我只讲常用的节点信息,大家想了解更多可以看下README文件,里面详解了各个属性文件的含义。
tracing_on
trace
current_tracer
available_tracers
其中我用的比较多的是function_graph
available_filter_functions
set_ftrace_filter
set_graph_function
set_graph_function 通常与 function_graph 跟踪器一起使用
set_ftrace_pid
func_stack_trace
funcgraph-proc
funcgraph-tail
trace-cmd 的常见命令如下:
这个命令会启动跟踪。使用默认的跟踪事件。
具体可以跟踪哪些事件可以用trace-cmd list查看
列出所有可用的跟踪事件
显示当前跟踪的状态,包括跟踪的事件和相关信息。效果和 cat /sys/kernel/debug/tracing/trace一样
该命令停止当前的跟踪
记录跟踪数据并将其保存到文件中。默认情况下,数据将保存在 trace.dat 文件中
此命令将显示在 trace.dat 文件中记录的跟踪数据,便于分析
接下来我们用 trace-cmd 来实现前面 ftrace 观测ls进程打开文件调用到 do_sys_open 的函数调用图(function_graph)效果。
首先我们记录下 do_sys_open 的调用流程到 trace.dat,这步确定操作的目录是可读写目录否则无法生成 trace.dat
mount -t debugfs none /sys/kernel/debug
或者将如下内容添加到/etc/fstab文件:
debugfs /sys/kernel/debug debugfs defaults 0 0
traceing目录介绍
echo 1 > tracing_on # 启用跟踪
echo 0 > tracing_on # 禁用跟踪
cat trace # 查看跟踪记录
echo > trace # 清空跟踪记录
cat current_tracer
function #当前用function的trace
cat available_tracers # 查看当前支持的追踪器类型
blk function_graph function nop
cat available_filter_functions | grep "ip_rcv" # 搜索ip_rcv函数是否存在
# 将ip_rcv加入过滤列表
echo ip_rcv > set_ftrace_filter
注意:如果写入的参数不是 available_filter_functions 文件里,就会报无效参数写入
echo open > set_ftrace_filter
-bash: echo: write error: Invalid argument
# 系统追踪111号进程
echo 111 > set_ftrace_pid
echo 1 > options/func_stack_trace # 启用栈回溯
echo 1 > ./options/funcgraph-proc # 每行都会显示每个进程的命令。
echo 1 > ./options/funcgraph-tail # 结束花括号后增加函数尾部注释
ftrace 可以做很多事情,我们{BANNED}最佳常用的功能有观察指定函数被执行, 观察指定函数调用关系,以及查看每个函数执行时耗时的时间。进而可以优化系统瓶颈。下面我分别用 function 和 function_graph 两种追踪器同时追踪do_sys_open来看下效果
function跟踪器
# 进入 ftrace 的调试文件系统
cd /sys/kernel/debug/tracing
# 停止跟踪
echo 0 > tracing_on
# 清空trace下的输出
echo > trace
# 将do_sys_open加入脚本过滤列表
echo do_sys_open > set_ftrace_filter
# 启用function跟踪功能
echo function > current_tracer
# 启动跟踪
echo 1 > tracing_on
trace日志会自动保存在trace buffer里的在trace下进行输出
# 打开ls文件
ls
# 停止跟踪
echo 0 > tracing_on
# 查看跟踪结果
cat trace
function_graph跟踪器
# 进入 ftrace 的调试文件系统
cd /sys/kernel/debug/tracing
# 停止跟踪
echo 0 > tracing_on
# 清空trace下的输出
echo > trace
# 将do_sys_open函数加入函数图功能
echo do_sys_open > set_graph_function
# 启用function_graph跟踪功能
echo function_graph > current_tracer
# 每行都会显示TASK/PID
echo funcgraph-proc > trace_options
# 结束花括号后增加函数尾部注释
echo 1 > ./options/funcgraph-tail
# 启动跟踪
echo 1 > tracing_on
# ls打开文件
ls
trace日志会自动保存在trace buffer里的在trace下进行输出
# 查看跟踪结果
cat trace
从上面的例子看出使用 ftrace 还是挺麻烦的,我们需要手动的去控制多个文件,实际上使用 trace-cmd 更多一点。trace-cmd 是 ftrace 的前端工具,用于与 ftrace 进行交互。它提供了一个更方便的接口来配置和使用 ftrace,避免了直接操作 debugfs 文件系统的麻烦。
在使用 trace-cmd 之前,通常需要先安装它, 可以通过以下方式安装(以 Debian/Ubuntu 为例):
sudo apt-get install trace-cmd
trace-cmd start
trace-cmd start -e
使用 -e 选项可以指定要跟踪的特定事件。例如:
trace-cmd start -e sched_switch
trace-cmd list
trace-cmd show
trace-cmd stop
trace-cmd record
trace-cmd report
trace-cmd reset
清除当前的跟踪状态和数据, 效果和echo > /sys/kernel/debug/tracing/trace一样
接下来使用 report 读取 trace.dat 生成可读的文本数据进行输出
trace-cmd report trace.dat
实际上是和操作ftrace节点的命令查看效果差不多