Linux 利用 ftrace 分析内核调用


一、概述

在 Linux 中,ftrace 是一种用于跟踪内核函数调用和事件的工具。它是一个功能强大的跟踪框架,可用于分析和调试内核性能问题。

ftrace 提供了多种功能,包括函数跟踪、事件记录和性能分析等。它能够记录函数的调用和返回信息,以及函数执行的路径和时间。通过跟踪这些信息,我们可以了解到内核函数的执行情况,从而定位和解决性能问题。

ftrace 使用了内核中的一些机制来实现跟踪功能。其中一个关键的机制是函数预编译器,它会在每个内核函数的入口和出口处插入一些特殊的指令,用于记录函数的调用和返回信息。这些指令可以通过内核配置选项来启用或禁用。

此外,ftrace 还支持事件跟踪,可以记录系统中发生的各种事件,比如中断、系统调用、定时器事件等。通过分析这些事件的发生频率和顺序,可以帮助我们找出系统中的瓶颈和性能问题。

除了记录和分析跟踪信息外,ftrace 还提供了一些工具和接口,用于配置和控制跟踪功能。其中最常用的工具是 trace-cmdtrace-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、tcptcp
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 :最简单的跟踪程序,就像它的名字所暗示的那样,它不做任何事情

其中比较常用的是 functionfunction_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 跟踪器的触发函数

<think>嗯,用户问的是如何利用Ftrace分析内核函数调用关系,并希望得到具体的命令步骤。首先,我需要回想一下Ftrace的基本用法和它在内核调试中的作用。FtraceLinux内核中的一个跟踪工具,主要用于跟踪内核函数的执行情况,帮助开发者分析性能问题和理解代码流程。 用户可能是一位开发人员,或者系统管理员,需要调试内核问题或者优化性能。他们可能已经知道一些基本的调试工具,但想深入使用Ftrace来跟踪函数调用。需要确保回答的步骤清晰,适合不同层次用户的理解,特别是具体命令部分,不能有错误。 首先,需要确认用户是否了解如何访问Ftrace的目录,通常是在/sys/kernel/debug/tracing下。然后,可能需要指导他们挂载debugfs文件系统,如果系统没有自动挂载的话。接下来,选择跟踪器,比如function_graph,这样可以看到函数的调用关系。然后设置要跟踪的函数,比如通过echo命令将函数名写入set_ftrace_filter。之后启用跟踪,执行相关操作,最后停止跟踪并查看结果。 需要注意的细节包括权限问题,可能需要root权限;不同的内核版本可能命令略有不同;还要提醒用户跟踪所有函数可能会导致系统负载增加,建议先过滤需要的函数。另外,可能需要解释如何解析输出结果,比如函数调用的层级和时间消耗。 用户可能不仅需要步骤,还希望了解每个步骤的作用,所以在回答中适当解释每个命令的意义是有必要的。比如,echo function_graph > current_tracer是设置使用函数调用图跟踪器,这样输出的信息会更详细,显示函数的进入和退出。 还要考虑用户可能的错误操作,比如写错函数名,或者忘记启用跟踪,导致没有输出。这时候可能需要提醒检查步骤是否正确,或者使用cat命令查看available_filter_functions来确认可用的函数名。 另外,用户可能想知道如何将跟踪结果保存到文件,方便后续分析,所以可以加入重定向输出的步骤,比如cat trace > /path/to/logfile。 最后,总结关键点,确保用户能够按照步骤操作,并理解每个步骤的目的,以及如何根据输出分析函数调用关系。</think>--- ### **Ftrace内核函数调用分析步骤** --- #### **1. 环境准备** ```bash # 挂载debugfs(内核>=2.6.3) sudo mount -t debugfs none /sys/kernel/debug # 进入ftrace目录 cd /sys/kernel/debug/tracing # 查看可用tracer类型 cat available_tracers # 输出示例: function_graph function blk wakeup_dl... ``` --- #### **2. 基础配置** ```bash # 清空现有过滤器 echo > set_ftrace_filter echo > set_ftrace_notrace # 选择function_graph跟踪器 echo function_graph > current_tracer # 设置要跟踪的函数(支持通配符) echo 'vfs_*' > set_ftrace_filter # 跟踪所有vfs_开头的函数 # 或跟踪特定函数 echo __alloc_pages > set_ftrace_filter # 开启函数调用耗时统计 echo 1 > options/funcgraph-abstime # 显示绝对时间 echo 1 > options/funcgraph-proc # 显示进程信息 ``` --- #### **3. 启动跟踪** ```bash # 清空现有trace日志 echo > trace # 开始跟踪 echo 1 > tracing_on # 执行要跟踪的操作(例如触发系统调用) dd if=/dev/zero of=/dev/null bs=1M count=10 # 停止跟踪 echo 0 > tracing_on ``` --- #### **4. 解析跟踪结果** ```bash # 查看原始跟踪数据 cat trace # 典型输出示例: # 1) dd-2377 | | vfs_read() { # 1) dd-2377 | 0.120 us | __fsnotify_parent(); # 1) dd-2377 | 0.345 us | rw_verify_area(); # 1) dd-2377 | | ext4_file_read_iter() { # 1) dd-2377 | | generic_file_read_iter() { ``` --- #### **5. 高级技巧** **过滤特定进程:** ```bash # 查看进程PID pidof sshd # 设置PID过滤(例如跟踪PID为4413的进程) echo 4413 > set_ftrace_pid # 组合使用函数过滤 echo 'tcp_*' > set_ftrace_filter ``` **跟踪内核模块:** ```bash # 加载模块后动态添加跟踪 echo ':mod:nvidia' > set_ftrace_filter # 跟踪nvidia模块所有函数 ``` **保存跟踪记录:** ```bash # 保存到文件(支持文本分析) cat trace > /tmp/ftrace.log # 生成FlameGraph火焰图(需额外工具) awk '/\.\.\./ { if ($3 ~ />/) { depth-- } else { depth++ } } !/\.\.\./ { print $1, depth }' /tmp/ftrace.log > folded.txt ./FlameGraph/flamegraph.pl folded.txt > output.svg ``` --- #### **6. 关键配置项解析** | 配置文件 | 作用描述 | |------------------------|--------------------------------------------------------------------------| | `tracing_on` | 1=启用跟踪,0=停止跟踪 | | `trace_options` | 控制输出格式(如添加`print-parent`显示父函数) | | `buffer_size_kb` | 调整环形缓冲区大小(默认1.4MB,可设为最大数MB) | | `set_ftrace_notrace` | 黑名单过滤(如`echo schedule >> set_ftrace_notrace`忽略调度函数) | --- #### **7. 典型应用场景** 1. **系统调用链路分析** ```bash echo 'SyS_*' > set_ftrace_filter # 跟踪所有系统调用入口 ``` 2. **中断处理延迟分析** ```bash echo 'irq_handler' > set_ftrace_filter echo 1 > options/funcgraph-duration # 显示每个函数耗时 ``` 3. **内存分配路径追踪** ```bash echo '__alloc_pages\|kmem_cache_alloc' > set_ftrace_filter ``` --- ### **注意事项** 1. **性能影响** - 全函数跟踪可能导致**系统性能下降50%以上** - 建议通过`set_ftrace_filter`缩小跟踪范围 2. **权限要求** ```bash sudo chmod 755 /sys/kernel/debug/tracing # 普通用户需要权限 ``` 3. **内核配置验证** ```bash grep CONFIG_FTRACE /boot/config-$(uname -r) # 确保包含: # CONFIG_FTRACE=y # CONFIG_FUNCTION_TRACER=y ``` 通过上述步骤可清晰呈现内核函数调用层级、耗时及执行路径,是分析内核行为的重要调试手段。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值