Linux内核ftrace的使用

文章目录

    • ftrace使用
      • 一、ftrace的功能与用途
      • 二、ftrace的实现原理
      • 三、ftrace的使用步骤
        • 1. 查看tracer:通过查看available\_tracers文件,了解当前内核中可用的插件追踪器
        • 2. 选择tracer
        • 3. 设置参数和过滤器
        • 4.开启追踪
        • 5. 读取追踪结果
      • 四、ftrace的常用tracer
    • available_tracers 文件
      • 一、文件内容
      • 二、使用方式
    • current_tracer文件
      • 一、可用的跟踪器类型
      • 二、使用步骤
    • tracing_on 文件
      • 一、 功能
      • 二、位置
      • 三、 使用方法
    • func_stack_trace文件
      • 一、 功能
      • 二、 使用方法
    • trace文件
      • 一、文件位置与访问
      • 二、文件内容
      • 三、使用场景
      • 四、相关配置与操作

ftrace是Linux内核中的一种强大跟踪工具,自2.6版本之后被引入内核中,主要用于分析和调试内核和应用程序的性能问题。:

ftrace使用

在这里插入图片描述

一、ftrace的功能与用途

ftrace可以帮助开发人员跟踪各种事件,如函数调用、系统调用、中断事件、定时器事件等,并生成相应的跟踪数据。通过分析这些数据,开发人员可以了解代码执行路径、函数耗时、资源使用情况等信息,从而进行性能优化或故障排查。ftrace提供了多个功能组件,如函数图谱(function graph)、事件追踪(event tracing)和动态追踪(dynamic tracing),使得它在不同场景下都有广泛的应用价值。具体来说,ftrace可用于快速排查以下问题:

  • 特定内核函数调用的频次。
  • 内核函数在被调用的过程中路径(调用栈)。
  • 内核函数调用的子函数流程(子调用栈)。
  • 由于抢占导致的高延时路径等。

二、ftrace的实现原理

ftrace通过在编译时在每个函数入口插入函数探针来实现记录功能。这些探针在函数实际运行之前被触发,用于记录本次函数调用。为了减少对系统运行效率的影响,ftrace在不使用时通过替换函数探针指令为NOP(无操作指令)来减少性能开销,并能动态启用和切换不同类型的探针。

初始化时,ftrace会扫描_mcount_loc段并修改为NOP,然后在需要时将NOP替换为函数探针,通过二级指针概念实现快速切换。此外,ftrace还允许动态配置,实现不同探针的切换和配置。

三、ftrace的使用步骤

要使用ftrace,首先需要确保内核支持该功能,并将其编译进入内核。同时,还需要激活对debugfs文件系统的支持,因为ftrace通过debugfs向用户态提供了访问接口。接下来,可以挂载debugfs文件系统,并通过访问/sys/kernel/debug/tracing/目录下的文件来配置和使用ftrace。

使用ftrace的一般步骤如下:

1. 查看tracer:通过查看available_tracers文件,了解当前内核中可用的插件追踪器

可选追踪器


2. 选择tracer

根据查找到的追踪器选择 function 写入current_tracer文件来设置当前要使用的tracer。
function图上表示追踪的为函数调用


3. 设置参数和过滤器

可以使用set\_ftrace\_filter文件来指定要追踪的函数名称,函数名称可以包含一个通配符。
例如追踪 sync()系统调用
start


4.开启追踪

通过写入tracing\_on文件来启用追踪功能
sat


5. 读取追踪结果

通过读取trace文件来查看追踪结果。此外,还可以使用文件以管道方式实时读取追踪信息。
sync


四、ftrace的常用tracer

ftrace提供了多种tracer供用户使用,以下是一些常用的tracer及其功能:

  • function:函数调用追踪器,用于跟踪哪个函数在何时被调用。
  • function_graph:函数调用图表追踪器,用于显示函数调用关系图,包括哪个函数被哪个函数调用以及何时返回。这对于观察函数的执行时间和确定代码执行流程非常有用。
  • wakeup:进程调度延迟追踪器,用于追踪普通进程从唤醒到真正得到执行之间的延迟。
  • wakeup_rt:与wakeup相同,但以实时进程为对象。
  • irqsoff:当中断被禁止时,系统无法响应外部事件,造成系统响应延迟。irqsoff跟踪并记录内核中哪些函数禁止了中断,并标示出禁止中断时间最长的函数。
  • preemptoff:追踪并记录禁止内核抢占的函数,并显示禁止内核抢占时间最长的函数。
  • preemptirqsoff:追踪并记录禁止内核抢占和中断时间最长的函数。
  • sched_switch:进行上下文切换的追踪,可以得知从哪个进程切换到了哪个进程。

在这里插入图片描述

available_tracers 文件

available_tracers文件位于/sys/kernel/debug/tracing/目录下。这个目录通常挂载了debugfs虚拟文件系统,提供了与ftrace交互的接口。

一、文件内容

当你查看available_tracers文件时,它会列出当前内核支持的ftrace跟踪器类型。这些跟踪器类型包括但不限于以下几种:

  • function:用于跟踪内核函数的调用情况,是ftrace最基本的跟踪功能之一。
  • function_graph:不仅跟踪指定的函数,还跟踪该函数调用的所有子函数,以图形化的方式展示函数调用关系。
  • hwlatosnoiseblkmmiotrace等:这些跟踪器类型用于跟踪特定的系统行为,如硬件延迟、系统噪声、块I/O操作等。
  • nop:这是一个特殊的跟踪器,它实际上不执行任何跟踪操作,可以作为重置跟踪器的选项。

二、使用方式

要使用特定的ftrace跟踪器,你需要将跟踪器的名字写入/sys/kernel/debug/tracing/current_tracer文件。例如,要使用function_graph跟踪器,你可以执行以下命令:

echo function_graph > /sys/kernel/debug/tracing/current_tracer

之后,你可以通过配置其他相关文件(如set_ftrace_filtertracing_on等)来控制跟踪行为,并查看/sys/kernel/debug/tracing/trace文件来获取跟踪信息。

在这里插入图片描述

current_tracer文件

  • 文件位置current_tracer文件位于/sys/kernel/debug/tracing/目录下,这个目录是ftrace与用户空间交互的主要接口。
  • 功能current_tracer文件用于设置或显示当前正在使用的ftrace跟踪器类型。通过向该文件写入特定的跟踪器名称,可以切换到相应的跟踪模式。

一、可用的跟踪器类型

可以通过查看/sys/kernel/debug/tracing/available_tracers文件来了解当前内核支持哪些ftrace跟踪器类型。常见的跟踪器类型包括:

  • function:跟踪内核函数的调用情况,是ftrace最基本的跟踪功能。
  • function_graph:不仅跟踪函数本身,还跟踪函数的调用关系,以图形化的方式展示函数调用链。
  • wakeupwakeup_rtwakeup_dl:用于调试系统唤醒和调度过程中的延迟。
  • mmiotrace:跟踪内核中的内存映射I/O(如GPU、磁盘等)的访问情况。
  • blkblocktrace:用于跟踪块层的一些延迟情况。
  • nop:不执行任何跟踪操作,相当于关闭跟踪器。

二、使用步骤

  1. 查看可用的跟踪器
    通过查看available_tracers文件,了解当前内核支持哪些跟踪器类型。

  2. 选择跟踪器
    根据调试需求,选择一个合适的跟踪器类型。

  3. 设置当前跟踪器
    通过向current_tracer文件写入选定的跟踪器名称,来设置当前正在使用的跟踪器。例如,要切换到function_graph跟踪器,可以执行以下命令:

    echo function_graph > /sys/kernel/debug/tracing/current_tracer
    
  4. 配置其他参数(可选):
    根据需要,可以配置其他与跟踪相关的参数,如跟踪过滤器(set_ftrace_filter)、跟踪开关(tracing_on)等。

  5. 查看跟踪结果
    开启跟踪后,可以通过查看/sys/kernel/debug/tracing/trace文件来获取跟踪信息

在这里插入图片描述

tracing_on 文件

tracing_on 文件是 Linux 内核 ftrace 跟踪工具中的一个关键文件,它用于控制是否将跟踪数据写入到追踪缓冲区。ftrace 是 Linux 内核中的一种强大工具,用于分析和调试内核和应用程序的性能问题。通过启用和配置 ftrace,开发人员可以跟踪函数调用、系统调用、中断事件、定时器事件等各种事件,并生成相应的跟踪数据。

以下是关于 tracing_on 文件的详细解释:

一、 功能

tracing_on 文件是一个简单的文本文件,其内容是数字 “0” 或 “1”。写入 “1” 到 tracing_on 文件会启用向追踪缓冲区写入跟踪数据的功能,而写入 “0” 则会禁用该功能。这使得开发人员可以在需要时轻松地开启或关闭跟踪。

二、位置

tracing_on 文件通常位于 /sys/kernel/debug/tracing//sys/kernel/tracing/ 目录下,这取决于 ftrace 的配置和挂载点。这些目录是 debugfs 文件系统的一部分,它提供了对内核内部数据结构的访问。

三、 使用方法

要使用 tracing_on 文件,通常需要执行以下步骤:

  1. 挂载 debugfs 文件系统:如果 debugfs 文件系统尚未挂载,需要将其挂载到某个目录(如 /sys/kernel/debug)上。这可以通过修改 /etc/fstab 文件或使用 mount 命令来完成。
  2. 导航到 tracing 目录:使用 cd 命令导航到包含 tracing_on 文件的目录(如 /sys/kernel/debug/tracing/)。
  3. 写入值到 tracing_on 文件:使用 echo 命令将 “1” 或 “0” 写入到 tracing_on 文件中,以启用或禁用跟踪功能。例如,echo 1 > tracing_on 会启用跟踪,而 echo 0 > tracing_on 则会禁用跟踪。
  4. 查看跟踪数据:启用跟踪后,可以使用 cat 命令或其他文本查看工具来查看 /sys/kernel/debug/tracing/trace 文件中的跟踪数据。这个文件包含了从启用跟踪开始到当前时刻的所有跟踪事件。
    在这里插入图片描述

func_stack_trace文件

func_stack_trace 文件是 Linux 内核 ftrace 工具中的一个配置选项,它允许在跟踪函数时启用或禁用函数堆栈跟踪。ftrace 是 Linux 内核中一种强大的跟踪和调试工具,它可以帮助开发人员分析和调试内核行为。

以下是关于 func_stack_trace 文件的详细解释:

一、 功能

func_stack_trace 文件通常位于 /sys/kernel/debug/tracing/options/ 目录下(取决于 ftrace 的配置和挂载点)。通过向该文件写入 “1” 或 “0”,可以启用或禁用函数堆栈跟踪功能。当启用该功能时,ftrace 在跟踪函数时不仅会记录函数名,还会记录函数调用时的堆栈信息,这有助于开发人员更深入地了解函数的调用关系和调用路径。

二、 使用方法

要使用 func_stack_trace 文件,通常需要执行以下步骤:

  1. 挂载 debugfs 文件系统:确保 debugfs 文件系统已经挂载到某个目录(如 /sys/kernel/debug)上。如果尚未挂载,可以使用 mount 命令将其挂载。
  2. 导航到 options 目录:使用 cd 命令导航到包含 func_stack_trace 文件的目录(如 /sys/kernel/debug/tracing/options/)。
  3. 写入值到 func_stack_trace 文件:使用 echo 命令将 “1” 或 “0” 写入到 func_stack_trace 文件中,以启用或禁用函数堆栈跟踪功能。例如,echo 1 > func_stack_trace 会启用函数堆栈跟踪,而 echo 0 > func_stack_trace 则会禁用该功能。
  4. 设置当前跟踪器:根据需要设置当前正在运行的跟踪器(如 functionfunction_graph 等)。这可以通过向 /sys/kernel/debug/tracing/current_tracer 文件写入跟踪器名称来完成。
  5. 启用跟踪:通过向 /sys/kernel/debug/tracing/tracing_on 文件写入 “1” 来启用跟踪。这将开始收集跟踪数据,包括启用了堆栈跟踪功能的函数调用。
  6. 查看跟踪数据:使用 cat 命令或其他文本查看工具来查看 /sys/kernel/debug/tracing/trace 文件中的跟踪数据。该文件包含了从启用跟踪开始到当前时刻的所有跟踪事件,包括函数名和堆栈信息(如果启用了堆栈跟踪功能)。

go

trace文件

/sys/kernel/debug/tracing/trace文件是Linux内核调试中非常重要的一个文件,它记录了通过ftrace等内核动态追踪技术捕获的内核或应用程序的运行事件。以下是对该文件的详细解释:

一、文件位置与访问

  • 文件路径:在Linux系统中,/sys/kernel/debug/tracing/trace文件通常位于/sys/kernel/debug/tracing目录下。
  • 访问方式:该文件可以通过文件系统直接访问,使用常见的文件操作命令如cat、less、more等即可查看其内容。

二、文件内容

  • 追踪信息:该文件记录了通过ftrace等技术捕获的内核或应用程序的运行事件。这些事件可能包括函数调用、中断处理、进程调度等。
  • 格式:文件中的追踪信息通常以文本形式呈现,每行记录一个事件。事件的格式取决于所使用的追踪器和配置选项。

三、使用场景

  • 内核调试:/sys/kernel/debug/tracing/trace文件是内核调试中常用的工具之一。通过分析该文件中的追踪信息,开发者可以深入了解内核的运行状态,从而定位并解决内核中的问题。
  • 性能分析:除了调试外,该文件还可以用于性能分析。通过分析内核中的函数调用和中断处理等事件,可以找出性能瓶颈并进行优化。

四、相关配置与操作

  • 启用/禁用追踪:在使用/sys/kernel/debug/tracing/trace文件之前,需要确保已经启用了相应的追踪器。这可以通过向/sys/kernel/debug/tracing/current_tracer文件写入追踪器的名称来实现。同时,还需要确保已经挂载了debugfs文件系统,因为/sys/kernel/debug/tracing目录是debugfs文件系统的一部分。
  • 过滤追踪信息:为了只关注感兴趣的事件,可以使用/sys/kernel/debug/tracing/set_ftrace_filter文件来设置过滤条件。通过向该文件写入特定的函数名或正则表达式,可以过滤掉不相关的事件。
  • 查看可用追踪器和事件:可以使用/sys/kernel/debug/tracing/available_tracers和/sys/kernel/debug/tracing/available_events文件来查看当前系统支持的追踪器和事件。

go

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

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

相关文章

【笔记总结】华为云:应用上云后的安全规划及设计

一、背景和问题 数字化时代,随着信息技术的飞速发展,企业和各类组织纷纷将自身的应用程序迁移至云端。云计算凭借其诸多优势,如成本效益、可扩展性、灵活性以及便捷的资源共享等,已然成为了现代业务运营的重要支撑。 今年&#xf…

LeetCode-430. 扁平化多级双向链表-题解

题目链接 430. 扁平化多级双向链表 - 力扣(LeetCode) 题目介绍 你将得到一个双链表,节点包含一个“下一个”指针、一个“前一个”指针和一个额外的“子指针”。这个子指针可能指向一个单独的双向链表,并且这些链表也包含类似的特殊…

MySQL 慢查询日志记录 SQL优化 性能优化 日志查询 Explain

介绍 慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置针对这些慢查询的SQL语句进行优化。 #开启慢查询开关 s…

【RL Application】语义分割中的强化学习方法

📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…

Elasticsearch 入门

Elasticsearch安装 下载软件 Elasticsearch 的官方地址:Elastic — 搜索 AI 公司 | Elastic Elasticsearch 最新的版本是 8.16.1(截止2024.11),我们选择7.8.0版本。 下载地址:Elasticsearch 7.8.0 | Elastic Elasticsearch 分为Linux和 Windows版本&…

Pyside6-QTableView实战

使用效果 代码 import cv2 import osfrom ui.imageQuery import Ui_DialogImageQuery from utils.log_util import log_message from utils.sys_util import create_dirfrom PySide6.QtWidgets import QApplication, QDialog, QGraphicsPixmapItem, QGraphicsScene from PySid…

Redis开发03:常见的Redis命令

1.输入以下命令,启动redis。 sudo service redis-server start 如果你是直接安装在WSL的,搜索栏搜索Ubuntu或者点击左下角Windows图表找到U那一栏,直接打开Ubentu,输入账密后,输入“sudo service redis-server start”…

JAVA |日常开发中常见问题归纳讲解

JAVA |日常开发中常见问题归纳讲解 前言一、语法错误相关问题1.1 分号缺失或多余1.2 括号不匹配1.3 变量未定义或重复定义 二、数据类型相关问题2.1 数据类型不匹配2.2 整数溢出和浮点数精度问题 三、面向对象编程相关问题3.1 空指针异常(NullPointerExc…

ubuntu的用户使用

ubuntu系统中的常规用户登录方式 在系统root用户是无法直接登录的,因为root用户的权限过大所以其安全性比较差 在登录系统时一般使用在安装系统时建立的普通用户登录 如果需要超级用户权限: Ubuntu用户密码破解 在系统安装完成后默认grub启动等待时间为0,建议改…

初始Python篇(6)—— 字符串

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: Python 目录 字符串的常见操作 格式化字符串 占位符 f-string 字符串的 format 方法 字符串的编码与解码 与数据验证相关的方法 …

38 基于单片机的宠物喂食(ESP8266、红外、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机,采用L298N驱动连接P2.3和P2.4口进行电机驱动, 然后串口连接P3.0和P3.1模拟ESP8266, 红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.…

GEE Landsat 8 可见光影像校正后下载

在遥感影像处理领域,Landsat 8 数据因其 30 米空间分辨率 和 多光谱波段 被广泛应用。处理这些数据时,研究者常常需要对数据进行裁剪、计算指数、图像增强等操作,以满足特定研究需求。 本文将介绍一个 Python 自动化脚本,使用 Goo…

Matlab Simulink HDL Coder开发流程(一)— 创建HDL兼容的Simulink模型

创建HDL兼容的Simulink模型 一、使用Balnk DUT模板二、从HDL Coder库中选择模块三、为DUT开发算法/功能四、为设计创建Testbench五、仿真验证设计功能六、Simulink模型生成HDL代码 这个例子说明了如何创建一个用于生成HDL代码的Simulink模型。要创建兼容HDL代码生成的MATLAB算法…

如何通过 JWT 来解决登录认证问题

1. 问题引入 在登录功能的实现中 传统思路: 登录页面时把用户名和密码提交给服务器服务器验证用户名和密码,并把检验结果返回给后端如果密码正确,则在服务器端创建 session,通过 cookie 把 session id 返回给浏览器 但是正常情…

像素流送api ue多人访问需要什么显卡服务器

关于像素流送UE推流,在之前的文章里其实小芹和大家聊过很多,不过今天偶然搜索发现还是有很多小伙伴,在搜索像素流送相关的问题,搜索引擎给的提示有这些。当然这些都是比较短的词汇,可能每个人真正遇到的问题和想获取的…

Uniad复现学习

在优云平台部署训练,加速训练。 关于UCloud(优刻得)旗下的compshare算力共享平台 UCloud(优刻得)是中国知名的中立云计算服务商,科创板上市,中国云计算第一股。 UCloud(优刻得)旗下的Compshare算力共享平台具有以下优点…

域名解析系统 DNS

1.域名系统概述 用户与互联网上某台主机通信时,必须要知道对方的IP地址。然而用户很难记住长达32 位的二进制主机地址。即使是点分十进制地址也并不太容易记忆。但在应用层为了便于用户记忆各种网络应用,连接在互联网上的主机不仅有P地址,而…

【软考网工笔记】网络基础理论——网络层

文章目录 中断处理过程数据包组装RIPRSVPipv4RIPv1 & RIPv2HFC 混合光纤同轴电缆(Hybrid Fiber Coax,简称HFC)BGP (边界网关协议)BGP-4 协议的四种报文ICMP 协议数字语音电子邮件协议MPLS 多协议标记交换ipv6DHCPDNS名称解析过程查询顺序…

go语言 Pool实现资源池管理数据库连接资源或其他常用需要共享的资源

go Pool Pool用于展示如何使用有缓冲的通道实现资源池,来管理可以在任意数量的goroutine之间共享及独立使用的资源。这种模式在需要共享一组静态资源的情况(如共享数据库连接或者内存缓冲区)下非 常有用。如果goroutine需要从池里得到这些资…

【Delphi】modbus-TCP 协议库

在日常开发中,也会遇到使用modbus的部件,比如温度控制器、读卡器等等,那么使用Delphi开发,也就必须遵守modbus-TCP协议,如果自己使用TCP控件写也没有问题,不过如果有开源的三方库,别人已经调试过…