Linux ftrace 内核跟踪入门

ftrace介绍

Ftrace is an internal tracer designed to help out developers and designers of systems to find what is going on inside the kernel. It can be used for debugging or analyzing latencies and performance issues that take place outside of user-space.

ftrace 是内建于 Linux 内核的跟踪工具,从 2.6.27 开始加入主流内核。使用 ftrace 可以调试或者分析内核中发生的事情。ftrace 提供了不同的跟踪器,以用于不同的场合,比如跟踪内核函数调用、对上下文切换进行跟踪、查看中断被关闭的时长、跟踪内核态中的延迟以及性能问题等。系统开发人员可以使用 ftrace 对内核进行跟踪调试,以找到内核中出现的问题的根源,方便对其进行修复。

使用环境:Linux linuxdev 6.8.0-52-generic #53-Ubuntu SMP PREEMPT_DYNAMIC Sat Jan 11 00:06:25 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux

开启ftrace

一般的linux发行版都已经开启了ftrace支持,
在这里插入图片描述
最基础的是这几个选项:

  • CONFIG_FTRACE --> “Tracers”
  • CONFIG_FUNCTION_TRACER --> Kernel Function Tracer
  • CONFIG_FUNCTION_GRAPH_TRACER --> Kernel Function Graph Tracer
  • CONFIG_DYNAMIC_FTRACE --> enable/disable function tracing dynamically

更多的选项可以查看内核trace模块的makefile和kconfig文件:kernel/trace/Makefilekernel/trace/Kconfig

ftrace 使用 tracefs 文件系统来保存控制文件以及用于显示输出的文件,启用ftrace功能后,默认会挂载出来,目前的环境上是在:tracefs /sys/kernel/tracing tracefs rw,nosuid,nodev,noexec,relatime 0 0

查看tracefs挂载点下面的内容:

$ sudo ls /sys/kernel/tracing
available_events                  current_tracer            hwlat_detector   printk_formats         set_event_pid           stack_max_size      trace_marker         tracing_thresh
available_filter_functions        dynamic_events            instances        README                 set_ftrace_filter       stack_trace         trace_marker_raw     uprobe_events
available_filter_functions_addrs  dyn_ftrace_total_info     kprobe_events    rv                     set_ftrace_notrace      stack_trace_filter  trace_options        uprobe_profile
available_tracers                 enabled_functions         kprobe_profile   saved_cmdlines         set_ftrace_notrace_pid  synthetic_events    trace_pipe           user_events_data
buffer_percent                    error_log                 max_graph_depth  saved_cmdlines_size    set_ftrace_pid          timestamp_mode      trace_stat           user_events_status
buffer_size_kb                    events                    options          saved_tgids            set_graph_function      touched_functions   tracing_cpumask
buffer_subbuf_size_kb             free_buffer               osnoise          set_event              set_graph_notrace       trace               tracing_max_latency
buffer_total_size_kb              function_profile_enabled  per_cpu          set_event_notrace_pid  snapshot                trace_clock         tracing_on

tracing目录(/sys/kernel/tracing)中的文件控制着跟踪的能力。根据你在内核配置时的选项的不同,这里列的文件可能稍有差异。你可以在内核源代码目录下Documentation/trace目录中找到这些文件的信息。

下面介绍几个重要的文件:

  • available_tracers
    该文件列出所有当前内核支持的tracer
# cat available_tracers
timerlat osnoise hwlat blk mmiotrace function_graph wakeup_dl wakeup_rt wakeup function nop
  • current_tracer
    该文件指出当前正在运行的tracer
# cat current_tracer 
nop
  • available_events
    当前系统支持的事件
  • trace -> Contains the tracing data in human readable format
    该文件包含可阅读的tracing数据
# cat trace
# tracer: nop
#
# entries-in-buffer/entries-written: 0/0   #P:4
#
#                                _-----=> irqs-off/BH-disabled
#                               / _----=> need-resched
#                              | / _---=> hardirq/softirq
#                              || / _--=> preempt-depth
#                              ||| / _-=> migrate-disable
#                              |||| /     delay
#           TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION
#              | |         |   |||||     |         |
  • tracing_on
    该文件开启/关闭输出tracing数据到ring buffer(ftrace使用单独的ring buffer来存储tracing数据)
# cat tracing_on 
1
  • trace_options
    设置ftrace的一些相关选项

常用ftrace跟踪器

  • nop:不跟踪任何信息
  • function:跟踪内核函数执行情况
  • function_graph:显示函数调用关系
  • blk:块跟踪器, blktrace 用户应用程序使用的跟踪器。
  • hwlat:检测硬件是否产生任何延迟
  • wakeup:跟踪进程唤醒信息
  • wakeup_rt:跟踪并记录仅 rt任务所需的最大延迟(就像当前的“唤醒”一样),这对于那些对rt 任务的唤醒时间感兴趣的人很有用
  • wakeup_dl:跟踪并记录唤醒 SCHED_DEADLINE 任务所需的最大延迟(如“wakeup”和“wakeup_rt”所做的那样)
  • mmiotrace:用于跟踪二进制模块的特殊跟踪器,它将跟踪模块对硬件的所有调用,它也从 I/O 写入和读取的所有内容
  • irqsoff:跟踪关闭中断信息
  • preemptoff:跟踪关闭禁止抢占信息
  • preemptirqoff:综合了irqoff和preemptoff
  • sched_switch:对内核中的进程调度活动进行跟踪

ftrace使用

ftrace一般使用步骤:

  1. 写入一些特定文件以启用 / 禁用tracing。
  2. 写入一些特定文件以设置 / 取消设置过滤器以微调tracing。
  3. 根据步骤 1 和 2 从文件中读取生成的tracing输出。
  4. 清除文件中的早期输出或缓冲区。
  5. 缩小到你的特定用例(要跟踪的内核函数)并重复步骤 1、2、3、4。

指定某个tracer,我们只要将该tracer的名称写入current_tracer文件。

# echo function > current_tracer

随后我们可以通过trace或者trace_pipe文件读取输出

# cat trace | head -20
# tracer: function
#
# entries-in-buffer/entries-written: 205023/41961107   #P:4
#
#                                _-----=> irqs-off/BH-disabled
#                               / _----=> need-resched
#                              | / _---=> hardirq/softirq
#                              || / _--=> preempt-depth
#                              ||| / _-=> migrate-disable
#                              |||| /     delay
#           TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION
#              | |         |   |||||     |         |
 mintreport-tray-6561    [003] ...1. 23204.688260: seq_put_decimal_ull_width <-seq_put_decimal_ull
 mintreport-tray-6561    [003] ...1. 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值