Linux ftrace 内核跟踪入门

文章目录

    • ftrace介绍
    • 开启ftrace
    • 常用ftrace跟踪器
    • ftrace使用
      • ftrace跟踪指定内核函数
      • ftrace跟踪指定pid
    • ftrace原理
    • ftrace与strace
    • trace-cmd 工具
    • KernelShark
    • 参考

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_ullmintreport-tray-6561    [003] ...1. 23204.688260: seq_put_decimal_ull <-do_task_statmintreport-tray-6561    [003] ...1. 23204.688260: seq_put_decimal_ull_width <-seq_put_decimal_ullmintreport-tray-6561    [003] ...1. 23204.688260: seq_put_decimal_ull <-do_task_stat
##### CPU 2 buffer started ####<idle>-0       [002] d.h2. 23204.749361: __sysvec_apic_timer_interrupt <-sysvec_apic_timer_interrupt<idle>-0       [002] d.h2. 23204.749362: hrtimer_interrupt <-__sysvec_apic_timer_interrupt<idle>-0       [002] d.h2. 23204.749362: _raw_spin_lock_irqsave <-hrtimer_interrupt

如果你想关闭该tracer,直接将nop写入current_tracer文件即可。

function_graph是另外一种function tracer,它不仅跟踪函数入口,还跟踪函数的返回,允许你创建函数流的调用图,并以类似 C 语言的风格输出跟踪数据,其中包含每个函数的持续时间信息。

# cat trace | head -20
# tracer: function_graph
#
# CPU  DURATION                  FUNCTION CALLS
# |     |   |                     |   |   |   |2)   0.151 us    |                } /* seq_printf */2)   0.152 us    |                seq_printf();2)   0.152 us    |                seq_printf();2)   0.149 us    |                seq_printf();2)   0.112 us    |                _raw_spin_lock_irqsave();2)   0.153 us    |                seq_printf();2)   0.160 us    |                seq_printf();2)   0.159 us    |                seq_printf();2)   0.153 us    |                seq_printf();2)   0.156 us    |                seq_printf();2)   0.111 us    |                seq_putc();2)   0.112 us    |                _raw_spin_unlock_irqrestore();2)   0.117 us    |                __rcu_read_unlock();2)   4.759 us    |              } /* show_interrupts */2)   0.109 us    |              int_seq_next();2)   0.109 us    |              int_seq_stop();

ftrace跟踪指定内核函数

available_filter_functions文件展示了ftrace支持的跟踪内核函数的集合,我们可以从这里寻找需要跟踪的内核函数,或者自己指定。

# grep fork available_filter_functions
ret_from_fork
__do_sys_fork
__do_sys_vfork
tsk_fork_get_node
__traceiter_sched_process_fork
__probestub_sched_process_fork
__sched_fork
sched_fork
sched_cgroup_fork
sched_post_fork
sched_mm_cid_fork
task_fork_fair
task_fork_dl
sched_core_fork
sched_autogroup_fork
timens_on_fork
cgroup_css_set_put_fork
cgroup_fork
cgroup_cancel_fork
cgroup_post_fork
cgroup_css_set_fork
cgroup_can_fork
freezer_fork
pids_cancel_fork
pids_can_fork
cpuset_cancel_fork
cpuset_can_fork
cpuset_fork
perf_event_fork
anon_vma_fork
mem_cgroup_fork
tty_audit_fork
register_random_vmfork_notifier
unregister_random_vmfork_notifier
add_vmfork_randomness
proc_fork_connector

尝试跟踪__do_sys_fork函数,很遗憾目前环境中的内核在创建进程时不使用该函数,而是使用kernel_clone这个函数

#ifdef __ARCH_WANT_SYS_FORK
SYSCALL_DEFINE0(fork)
{
#ifdef CONFIG_MMUstruct kernel_clone_args args = {.exit_signal = SIGCHLD,};return kernel_clone(&args);
#else/* can not support in nommu mode */return -EINVAL;
#endif
}
#endif

查找该函数:

# grep kernel_clone /sys/kernel/tracing/available_filter_functions
kernel_clone

跟踪该函数:

root@linuxdev:/sys/kernel/tracing# echo nop >current_tracer 
root@linuxdev:/sys/kernel/tracing# echo kernel_clone>set_graph_function 
root@linuxdev:/sys/kernel/tracing# echo function_graph >current_tracer 
root@linuxdev:/sys/kernel/tracing# cat trace
# tracer: function_graph
#
# CPU  DURATION                  FUNCTION CALLS
# |     |   |                     |   |   |   |0)               |  kernel_clone() {0) # 1520.654 us |    copy_process();0)   2.568 us    |    add_device_randomness();0)   1.289 us    |    get_task_pid();0)   0.757 us    |    pid_vnr();0)   0.673 us    |    _raw_spin_lock();0)   3.660 us    |    lru_gen_add_mm();0)   0.690 us    |    _raw_spin_unlock();0) + 47.696 us   |    wake_up_new_task();0)   1.016 us    |    put_pid();0) # 1592.533 us |  }1)               |  ret_from_fork() {1) ! 122.284 us  |    schedule_tail();1)   0.859 us    |    syscall_exit_to_user_mode_prepare();1)   0.638 us    |    mem_cgroup_handle_over_high();1)   0.666 us    |    blkcg_maybe_throttle_current();1) + 60.708 us   |    __rseq_handle_notify_resume();1)   0.768 us    |    fpregs_assert_state_consistent();1)   1.831 us    |    switch_fpu_return();1) ! 197.731 us  |  }3)               |  kernel_clone() {3) # 1391.121 us |    copy_process();3)   2.695 us    |    add_device_randomness();3)   1.232 us    |    get_task_pid();3)   0.783 us    |    pid_vnr();3)   0.669 us    |    _raw_spin_lock();3)   3.709 us    |    lru_gen_add_mm();3)   0.654 us    |    _raw_spin_unlock();3) + 54.441 us   |    wake_up_new_task();3)   1.083 us    |    put_pid();3) # 1469.054 us |  }------------------------------------------0)   bash-7769    =>    cat-8888   ------------------------------------------0)               |  ret_from_fork() {0) + 69.115 us   |    schedule_tail();0)   0.804 us    |    syscall_exit_to_user_mode_prepare();0)   0.689 us    |    mem_cgroup_handle_over_high();0)   0.677 us    |    blkcg_maybe_throttle_current();0) + 37.261 us   |    __rseq_handle_notify_resume();0)   0.756 us    |    fpregs_assert_state_consistent();0)   1.950 us    |    switch_fpu_return();0) ! 120.873 us  |  }

ftrace跟踪指定pid

# echo $PID > set_ftrace_pid

以监控top进程为例:

# pidof top
8963
# echo 8963 > set_ftrace_pid
# cat trace | head -30
# tracer: function
#
# entries-in-buffer/entries-written: 13655/8126400   #P:4
#
#                                _-----=> irqs-off/BH-disabled
#                               / _----=> need-resched
#                              | / _---=> hardirq/softirq
#                              || / _--=> preempt-depth
#                              ||| / _-=> migrate-disable
#                              |||| /     delay
#           TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION
#              | |         |   |||||     |         |top-8963    [001] d..2. 27383.603413: <stack trace>=> 0xffffffffc12840ad=> _raw_spin_unlock=> finish_task_switch.isra.0=> __schedule=> __cond_resched=> mutex_lock=> process_output_block=> n_tty_write=> iterate_tty_write=> file_tty_write.isra.0=> tty_write=> vfs_write=> ksys_write=> __x64_sys_write=> x64_sys_call=> do_syscall_64=> entry_SYSCALL_64_after_hwframe

需要注意的是每次进行新的tracing的时候需要清除下上一次tracing的配置,如果上次设置了某些过滤条件,那么可能会对本次的tracing结果产生影响

更进一步的使用建议参考Debugging Linux Kernel using ftrace着一系列文章。

ftrace原理

参考Ftrace 实现原理与开发实践
在这里插入图片描述

ftrace与strace

参考Ftrace 实现原理与开发实践
在这里插入图片描述
他们的底层原理不同,表现出来的区别是ftrace可以跟踪内核中的函数,而strace只能跟踪到系统函数调用。

strace is a utility which allows you to trace the system calls that an application makes. When an application makes a system call, it is basically asking the kernel to do something, eg file access. Use the command man strace to get strace documentation and man syscalls to get information on system calls.
ftrace is a tool used during kernel development and allows the developer to see what functions are being called within the kernel.

参考这张著名的linux性能分析工具图:
在这里插入图片描述

trace-cmd 工具

trace-cmd工具是Steven Rostedt创建的用于ftrace的命令行工具。

KernelShark

KernelShark是一个图形工具,作为一个前端来处理trace-cmd工具生成的tracing数据——trace.dat。

参考

ftrace - Function Tracer
Debugging Linux Kernel using ftrace
Analyze the Linux kernel with ftrace
从Ftrace开始内核探索之旅
Tracing the Linux kernel with ftrace
Debugging the kernel using Ftrace - part 1
Debugging the kernel using Ftrace - part 2
Secrets of the Ftrace function tracer
Using KernelShark to analyze the real-time scheduler
Ftrace Kernel Hooks: More than just tracing
ftrace系统实现原理
Linux性能工具(二)ftrace基础篇
linux性能分析工具–ftrace的原理与使用
Linux内核性能调试工具之ftrace
Ftrace 实现原理与开发实践
Linux 原生跟踪工具 Ftrace

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/15902.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VUE项目中实现权限控制,菜单权限,按钮权限,接口权限,路由权限,操作权限,数据权限实现

VUE项目中实现权限控制&#xff0c;菜单权限&#xff0c;按钮权限&#xff0c;接口权限&#xff0c;路由权限&#xff0c;操作权限&#xff0c;数据权限实现 权限系统分类&#xff08;RBAC&#xff09;引言菜单权限按钮权限接口权限路由权限 菜单权限方案方案一&#xff1a;菜单…

Pdf手册阅读(1)--数字签名篇

原文阅读摘要 PDF支持的数字签名&#xff0c; 不仅仅是公私钥签名&#xff0c;还可以是指纹、手写、虹膜等生物识别签名。PDF签名的计算方式&#xff0c;可以基于字节范围进行计算&#xff0c;也可以基于Pdf 对象&#xff08;pdf object&#xff09;进行计算。 PDF文件可能包…

CSS3+动画

浏览器内核以及其前缀 css标准中各个属性都要经历从草案到推荐的过程&#xff0c;css3中的属性进展都不一样&#xff0c;浏览器厂商在标准尚未明确的情况下提前支持会有风险&#xff0c;浏览器厂商对新属性的支持情况也不同&#xff0c;所有会加厂商前缀加以区分。如果某个属性…

微信小程序分包异步化

分包1引入分包2的组件或者js 引入组件&#xff1a; 主包里的pages/tabbars/tabbar1/tabbar1页面 引入分包sub1的sub1/components/sub1-component/sub1-component组件 1、分包预下载 首先在app.js定义preloadRule "preloadRule": {"pages/tabbars/tabbar1/tabb…

后端java工程师经验之谈,工作7年,mysql使用心得

mysql 工作7年&#xff0c;mysql使用心得 mysql1.创建变量2.创建存储过程2.1&#xff1a;WHILE循环2.2&#xff1a;repeat循环2.3&#xff1a;loop循环2.4&#xff1a;存储过程&#xff0c;游标2.5&#xff1a;存储过程&#xff0c;有输入参数和输出参数 3.三种注释写法4.case …

基于 GEE 利用插值方法填补缺失影像

目录 1 完整代码 2 运行结果 利用GEE合成NDVI时&#xff0c;如果研究区较大&#xff0c;一个月的影像覆盖不了整个研究区&#xff0c;就会有缺失的地方&#xff0c;还有就是去云之后&#xff0c;有云量的地区变成空值。 所以今天来用一种插值的方法来填补缺失的影像&#xf…

unity学习34:角色相关3,触发器trigger,铰链 hingejoint 等 spring joint, fixed joint

目录 1 触发的实现条件 1.1 碰撞的的实现条件 1.2 触发的实现条件 1.3 触发器trigger&#xff0c;直接拿 碰撞器collider修改下配置即可 2 触发器相关实验&#xff1a;触发开门效果 2.0 目标 2.1 player物体的属性 2.2 新建一个trigger 物体 2.3 新建一个被trigger 控…

(1/100)每日小游戏平台系列

每日小游戏平台 项目简介以及地址 准备开发一个一百天小游戏平台&#xff0c;使用Flask构建的简单游戏导航网站&#xff0c;无需登录&#xff0c;让大家在返工的同时也可以愉快的摸鱼玩耍。 每天更新一个小游戏上传&#xff0c;看看能不能坚持一百天。 这些小游戏主要使用前端…

从零到一:基于Rook构建云原生Ceph存储的全面指南(上)

文章目录 一.Rook简介二.Rook与Ceph架构2.1 Rook结构体系2.2 Rook包含组件1&#xff09;Rook Operator2&#xff09;Rook Discover3&#xff09;Rook Agent 2.3 Rook与kubernetes结合的架构图如下2.4 ceph特点2.5 ceph架构2.6 ceph组件 三.Rook部署Ceph集群3.1 部署条件3.3 获取…

第40天:Web开发-JS应用VueJS框架Vite构建启动打包渲染XSS源码泄露代码审计

#知识点 1、安全开发-VueJS-搭建启动&打包安全 2、安全开发-VueJS-源码泄漏&代码审计 一、Vue搭建创建项目启动项目 1、Vue 框架搭建->基于nodejs搭建&#xff0c;安装nodejs即可 参考&#xff1a;https://cn.vuejs.org/ 已安装18.3或更高版本的Node.js 2、Vue 创建…

DeepSeek做赛车游戏

赛车模型 2D生成图片 任意AI图片软件SD&#xff0c;MJ 图片生成3D模型 车身 车轮 场景 Rodin,Tripo和Meshy 询问deepSeek如何开发 拷贝代码 将汽车运行代码拖到汽车上 再让AI写个摄像头跟随代码 再去提问deepseek控制轮胎和一些处理细节

软考高级《系统架构设计师》知识点(一)

计算机硬件 校验码 码距&#xff1a;就单个编码A:00而言&#xff0c;其码距为1&#xff0c;因为其只需要改变一位就变成另一个编码。在两个编码中&#xff0c;从A码到B码转换所需要改变的位数称为码距&#xff0c;如A:00要转换为B:11&#xff0c;码距为2。一般来说&#xff0c;…

亚博microros小车-原生ubuntu支持系列:26手势控制小车基础运动

背景知识 手指检测&#xff1a;亚博microros小车-原生ubuntu支持系列&#xff1a;4-手部检测-CSDN博客 程序功能说明 功能开启后&#xff0c;摄像头捕获图像&#xff0c;识别手势来控制小车移动。 手势 “5”小车前进拳头小车后退手势 “1”小车向左手势 “2”小车向右 运…

OpenFeign远程调用返回的是List<T>类型的数据

在使用 OpenFeign 进行远程调用时&#xff0c;如果接口返回的是 List 类型的数据&#xff0c;可以通过以下方式处理&#xff1a; 直接定义返回类型为List Feign 默认支持 JSON 序列化/反序列化&#xff0c;如果服务端返回的是 List的JSON格式数据&#xff0c;可以直接在 Feig…

【hive】记一次hiveserver内存溢出排查,线程池未正确关闭导致

一、使用 MemoryAnalyzer软件打开hprof文件 很大有30G&#xff0c;win内存24GB&#xff0c;不用担心可以打开&#xff0c;ma软件能够生成索引文件&#xff0c;逐块分析内存&#xff0c;如下图。 大约需要4小时。 overview中开不到具体信息。 二、使用Leak Suspects功能继续…

【Docker】

一、概述 1、Docker为什么出现&#xff1f; 开发和运维两套环境&#xff0c;而环境配置十分麻烦。如在Windows上开发&#xff0c;要发布到Linux上运行。 Docker给以上问题提出解决方案&#xff1a;Java --- Jar(环境&#xff09;---打包项目带上环境&#xff08;镜像&#x…

游戏手柄Type-c方案,支持一边充电一边传输数据

乐得瑞推出LDR6023SS&#xff0c;专门针对USB-C接口手机手柄方案&#xff0c;支持手机快充&#xff0c;支持任天堂游戏机&#xff0c;PS4等设备~同时支持手机充电跟数据传输 1、概述 LDR6023SS SSOP16 是乐得瑞科技针对 USB Type-C 标准中的 Bridge 设备而开发的双 USB-C DRP …

【报错解决】Sql server 2022连接数据库时显示证书链是由不受信任的颁发机构颁发的

SSMS 20在连接Sql server 2022数据库时有如下报错&#xff1a; A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - 证书链是由不受信任的颁发机构颁发的。 原因是尝试使…

「vue3-element-admin」告别 vite-plugin-svg-icons!用 @unocss/preset-icons 加载本地 SVG 图标

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …

NineData云原生智能数据管理平台新功能发布|2025年1月版

本月发布 14 项更新&#xff0c;其中重点发布 6 项、功能优化 7 项、安全性更新 1 项。 重点发布 数据库 Devops - 数据导出功能增强 支持 AWS ElastiCache 数据源&#xff1a;现已支持通过 SQL 查询语句或直接通过库表导出 AWS ElastiCache 数据&#xff0c;方便用户快速提取…