1.前言

本文主要是根据阅码场 《Linux内核tracers的实现原理与应用》视频课程在aarch64上的实践。这是整个系列文章的第一篇,本篇主要解决如下几个问题:

  1. ftrace是什么?
  2. ftrace框架包含哪些tracer?
  3. 这些tracer的基本使用方法有哪些?

kernel版本:5.10
平台:arm64

2. ftrace是什么?

ftrace是一个内核跟踪工具,旨在帮助系统开发人员和设计人员了解内核内部的情况。从2008年由Steven Rostedt 开发并在合并到2.6.27主线内核, 它主要源于两个工具:来自Ingo Molnar的延迟追踪器和来自Steven的logdev工具。

ftrace 是 Function Trace 的简写,它可以让你观察和记录内核函数的执行流,但它能做的远不止这些:
记录函数的执行流程;
测量函数执行时间,并发现瓶颈和性能问题;
测量实时进程花费的时间并发现延迟问题;
测试内核栈使用情况并发现可能的栈溢出;
检查禁用和启用中断之间发生了什么
抢占和从唤醒任务到实际调度任务的时间

3. ftrace如何实现?


Ftrace uses the tracefs file system to hold the control files as well as the files to display output.

Ftrace 有两大组成部分,一是 framework,另外就是一系列的 tracer 。
ftrace框架是整个ftrace功能的纽带,包括对内核的修改,Tracer的注册,RingBuffer的控制等等。
每个 tracer 完成不同的功能,它们统一由 framework 管理。 ftrace 的 trace 信息保存在 ring buffer 中,由 framework 负责管理。 Framework 利用 debugfs 系统在 debugfs 下建立 tracing 目录,并提供了一系列的控制文件。
Tracer有很多种,主要几大类:

  • 函数类:function, function_graph, stack
  • 延时类:irqsoff, preemptoff, preemptirqsoff, wakeup, wakeup_rt, waktup_dl
  • 其他类:nop, mmiotrace, blk

注: trace event和kprobe是特殊的traer,他们不同于function tracer和function graph tracer,而只是借用了tracefs的框架,以及用到了ftrace的ring buffer

4. ftrace如何工作?

There are two main types of tracing: static tracing and dynamic tracing.

  • Static tracing is implemented through static probes added in the source code. They have a low processing load, but the traced code is limited and defined at build time.
  • Dynamic tracing is implemented through dynamic probes injected into code, allowing to define at runtime the code to be traced. It has a certain processing load, but the range of source code to be traced is much larger.

Ftrace uses a combination of both static probes (function tracing, event tracing, etc) and dynamic probes (kprobes, uprobes, etc).

5. 几种tracer的概要说明

  • function tracer
    通过在编译阶段在函数入口插入空指令,运行时对于指定的跟踪函数,将空指令替换为要执行的钩子回调,在钩子回调函数中记录函数调用关系,并写入ftrace的ring buffer
  • function graph tracer
    编译阶段在要跟踪函数的入口处和返回处分别放置了钩子函数,这两个钩子函数会记录函数的执行时间,同时也会记录函数的调用栈,并写入ftrace的ring buffer:
  • trace event
    trace event可以理解成为一种特殊的tracer,它没有像function tracer和function graph tracer那样向trace子系统注册trace, 它通过TRACE_EVENT宏静态定义了一系列的trace event,每个 trace event都会与一个回调关联,一般用于打印一些信息到ring buffer。trace event 由内核在初始化时批量执行trace event的创建及初始化。函数中通过trace_xxx来执行相应trace event的回调。
  • kprobe
    是一种特殊的trace event,trace event是静态定义,kprobe可实现动态定义,它主要通过动态注册kprobe,kprobe中包含了相关的回调函数,通过提前在探测处插入一条断点指令,当函数执行到探测处触发断点异常,从而通过断点异常执行到注册的kprobe回调,默认回调函数将会打印函数的参数。
  • kretprobe
    同kprobe,不同之处是在函数返回处插入断点指令

参考文档

https://docs.kernel.org/trace/index.html
Welcome to ftrace & the Start of Your Journey to Understanding the Linux Kernel!
https://blogs.vmware.com/opensource/author/steven-rostedt/
https://blogs.vmware.com/opensource/2018/10/11/embedded-recipes-kernel-recipes/
https://blogs.vmware.com/opensource/2018/10/11/embedded-recipes-kernel-recipes/
Analyze the Linux kernel with ftrace
ftrace tutorial
https://alex.dzyoba.com/blog/ftrace/
https://andreasch.com/2017/12/06/ftrace/
https://www.brendangregg.com/blog/2014-08-30/ftrace-the-hidden-light-switch.html
https://lwn.net/Articles/608497/

https://www.kernel.org/doc/Documentation/trace/ftrace.txt
https://www.kernel.org/doc/html/latest/trace/ftrace-design.html

https://linux.cn/article-9838-1.html
https://www.cnblogs.com/arnoldlu/p/7211249.html

trace系列0 - 概述相关推荐

  1. akka入门系列-0. 概述

    0. 概述 本节类似图书里的前言,旨在说明这一系列文章的写作目的.目标读者等内容. 写作目的 本系列写作的最主要目的是用输出倒逼输入,协助自己理清思路,分享是其次的. 由于最近的项目里使用到了akka ...

  2. 05_ClickHouse、MergeTree系列引擎概述与存储结构、建表模板、建表语句、MergeTree设置、建表示例、数据存储、数据片段(data part)

    2.MergeTree系列引擎概述与存储结构 2.1.建表模板 2.2.建表语句 2.3.MergeTree设置 2.4.建表示例 2.5.数据存储 2.6.数据片段(data part) 2.Mer ...

  3. Microsoft 解决方案框架版本 3.0 概述

    发布日期: 2004年06月04日 关于 Microsoft 解决方案框架的更多信息,请参阅 http://www.microsoft.com/china/technet/itsolutions/te ...

  4. Microsoft 解决方案框架版本 3.0 概述(MSF3.0)

    Microsoft 解决方案框架版本 3.0 概述 发布日期: 2004年06月04日 关于 Microsoft 解决方案框架的更多信息,请参阅 http://www.microsoft.com/ch ...

  5. 阵列信号DOA估计系列(一).概述

    阵列信号DOA估计系列 之 概述 1.从相位差说起 2.空间相位差的来源 3.从"空间相位差"到"DOA估计" 3.1 时域 3.2 空域 3.3 DOA估计 ...

  6. 《Visual C++ 开发从入门到精通》——第1章 Visual C++ 6.0的最初印象1.1 Visual C++ 6.0概述...

    本节书摘来自异步社区出版社<Visual C++ 开发从入门到精通>一书中的第1章,第1.1节,作者: 王东华 , 李樱,更多章节内容可以访问云栖社区"异步社区"公众号 ...

  7. Adobe Edge Animate 1.0 概述

    Adobe Edge Animate 1.0 概述 版权声明: 本文版权属于 北京联友天下科技发展有限公司. 转载的时候请注明版权和原文地址. 一.主界面 从主界面我们可以直接进入: 1.工程操作(P ...

  8. HDMI 2.0概述

    HDMI 2.0概述 HDMI 2.0产品的测试政策是什么? 采纳者每一类的第一款带有HDMI 2.0功能规格的产品,都需要在出货前提交到ATC通过所有可应用或适用的HDMI合规测试. 采纳者每一类的 ...

  9. 美国兰德公司《未来战争2030》(The Future of Warfare in 2030)系列研究报告概述(下)

    2020年5月11日,美国兰德公司官网发布<未来战争2030>(The Future of Warfare in 2030)系列研究报告. 该系列研究报告包括7份研究报告:分别为一份总报告 ...

最新文章

  1. 山有木兮木有枝,心悦君兮君不知
  2. edge chrome 浏览器 底色调黑 反色
  3. 时空AI技术:深度强化学习在智能城市领域应时空AI技术:深度强化学习在智能城市领域应用介绍...
  4. 前端基础之JavaScript_1(一)
  5. sql server 2008 报表部署:提示输入用户名密码
  6. LeetCode 275. H指数 II(二分查找)
  7. k8s核心技术-Helm引入---K8S_Google工作笔记0043
  8. 基于卷积神经网络的图像情感分析模型,Python实现
  9. head first 设计模式源码
  10. 软件工程专业的论文答辩_软件工程论文答辩开场白范例
  11. Pandas数据分析3-统计、可视化、创建数据框、时间序列、删除数据
  12. python 嵌入式webserver 服务器 状态监控
  13. PHP用特殊符号分割小说内容和章节
  14. python中code函数是干嘛的_[Code] Python简单小知识
  15. 股票6题(Aced)
  16. 引力魔方的特性和玩法
  17. matlab模糊工具箱使用,MATLAB中模糊神经网络工具箱的使用 - 全文
  18. 配电房环境智能监测系统及轨道巡检机器人
  19. 【今日CV 计算机视觉论文速览 第96期】 8 Apr 2019
  20. python新手教程全套_Python入门教程完整版(懂中文就能学会)

热门文章

  1. 区块链学习者终极指南
  2. 共模电感(扼流圈) 差模电感(扼流圈)
  3. MariaDB二进制安装步骤以及数据库的基本操作
  4. Git_WorkFlow
  5. 【Flutter 实战】全局点击空白处隐藏键盘
  6. k8s: pod has unbound PersistentVolumeClaims问题解决
  7. 使用SpringBoot的CommandLineRunner遇到的坑
  8. 18.06.27 POJ1054 The Troublesome Frog
  9. 将c语言程序转化成伪代码,「第9篇」「做编程题方法3」「来点伪代码」
  10. 什么是MySQL的预编译?