Dynamic function tracing events

简介: 本文翻译自LWN文章“Dynamic function tracing events”,原文[链接](https://lwn.net/Articles/747256/) 从内核引入tracepoint开始,开发者们就对这些tracepoint是否为内核ABI的一部分而发生过争执。过去由于破坏了已有存在依赖的用户态程序,tracepoint相关变更被回退过。同时,对内部代码无法改变的恐慌使得在

本文翻译自LWN文章“Dynamic function tracing events”,原文链接

从内核引入tracepoint开始,开发者们就对这些tracepoint是否为内核ABI的一部分而发生过争执。过去由于破坏了已有存在依赖的用户态程序,tracepoint相关变更被回退过。同时,对内部代码无法改变的恐慌使得在多个内核子系统中新增tracepoint变得困难。如今,一个新的tracing功能被提了出来以避开这些问题。

tracepoint是否作为内核ABI的一部分并非是无关紧要的问题。内核ABI承诺运行应用程序不会因内核更新而遭到破坏。很明确这个承诺在过去就已扩展覆盖到tracepoint。尤其是2011年当一个tracepoint变更因破坏了powertop而不得不被回退。一些内核维护者禁止或严格控制其维护的子系统中新增tracepoint,就是担心类似的事情会同样发生在自己身上。其结果导致内核缺乏用户认为有用的tracepoint。

这个主题在多个会议上作为议程讨论过,包括2017年维护者峰会。正是那时提出一个更聪明的想法:与其将tracepoint放置到敏感位置,不如由开发者简单地做好标记,而这些标记可以在运行时显示地连接并转化成tracepoint。通过跳出束缚 (jump through some hoops) 以此期望保证这个新机制将不会创建任何新的ABI。接下来几个月一切归于平静。

但最近tracing的维护者Steve Rostedt面临该提案的一个变化,他称之为“动态创建基于函数的事件 (dynamically created function-based events) ”。细节上发生了一些变化,但ABI规避本质上保持一致。关键细节差异来源于其观察到内核已经在特定位置上有了tracing代码可以利用的一种类型的标记。内核代码通常带有正常用于代码分析的参数编译。结果,每个函数都以调用mcount() (或新编译器使用的__fentry()__ ) 开始。当分析用户态程序时,mcount()追踪每个函数的调用并因此很耗时。尽管内核使用支持诸如function tracing的特性版本来替换mcount()。但大多时候都是直接整体打上mcount()调用,只是可以在运行时需要tracing特定函数调用时启用。

也存在其他可能使用函数入口钩子的场景。Rostedt的补丁可在运行时任何内核函数的开始处启用创建tracepoint。在tracefs控制文件系统挂载的前提下,一个新tracepoint可通过如下命令创建:

echo 'SyS_openat(int dfd, string path, x32 flags, x16 mode)' \
    > /sys/kernel/tracing/function_events

SyS_openat()是openat()系统调用的内核实现,该命令请求在SyS_openat()入口处创建一个tracepoint。4个值将从tracepoint报告出来:目录文件描述符 (dfd),给定路径名(path),以及标记和模式参数。这个tracepoint将在events/functions下显示出来,跟内核中其他tracepoint看上去一样。也可以像平常那样被查询,启用和关闭。有趣地是,这个例子中的路径指向用户空间,但tracing系统能恰当地获取并打印出相应数据。

很明显还存在进一步的工作要做:“我需要重写function graph tracer,并且能在函数返回时增加动态事件”。其核心部分看上去已经有了且能正常工作。但这里遗留了一个重要问题:这是否已经足够确保避免创建一个新ABI的内核接口集?Mathieu Desnoyers担心仍然不够。

让这些工具在函数名/参数上挂个钩子无法解决该问题。一旦内核代码变更,广泛使用的trace分析工具将开始变得不正常。而此时,其内部函数签名将会成为ABI。

Linus Torvalds却不同意该担心。内核钩子需要的额外步骤隐含了不同状态视角:

每个人*理解*这像一个调试工具:如果你有一个gdb脚本显示某些信息,接着你到处修改源代码,*明显*你同样需要回过头来修改调试脚本。你并没有没有保持源代码不变来使gdb脚本无需变更,这看上去很傻。

相反,显示的tracepoint使人们相信它们有着长远的意义。

如果现实与该观点一致,那么新的动态tracepoint机制将在缓解ABI问题有很大帮助。大量内核新增的tracepoint将很可能被丢弃,因为开发者将简单地使用动态变种来替代。将来增加tracepoint时,相对可能的是这些tracepoint将被设计成支持某些系统管理工具,并且在外部看上去是ABI的一部分。

当然那是假定这个系列补丁最终会被合入。Alexei Starovoitov对此有些不同意见,他抱怨新接口在kprobe现有的基础上增加很少。同时他也不喜欢面向文本的接口,建议使用BPF来替代以提取内核数据的某些特定信息。但Rostedt指出,许多开发者因BPF上手复杂性而退却,而更偏向简单的。

Rostedt认为该接口将很有用,但如果其他人存在不同意见的话他将不再继续开发:“如果其他人认为这将有用,那么我想让他们现在大声地说出来”。然而迄今为止,几乎没有人明确表达出来。如果动态函数tracing机制的确是其他开发者想要的,他们需要显示发声以表示支持。

目录
相关文章
|
11月前
|
人工智能 自然语言处理 自动驾驶
技术与人性:探索人工智能伦理的边界####
本文深入探讨了人工智能技术飞速发展背景下,伴随而来的伦理挑战与社会责任。不同于传统摘要直接概述内容,本文摘要旨在引发读者对AI伦理问题的关注,通过提出而非解答的方式,激发对文章主题的兴趣。在智能机器逐渐融入人类生活的每一个角落时,我们如何确保技术的善意使用,保护个人隐私,避免偏见与歧视,成为亟待解决的关键议题。 ####
|
12月前
|
存储 数据采集 机器学习/深度学习
Star Tower Chain:以数据治理开启区块链智能时代
随着科技的进步,区块链步入智能时代,Star Tower Chain 以数据治理为核心,开启区块链新篇章。通过深度数据分析与挖掘,提供个性化推荐服务,并利用AI与机器学习提升数据质量与安全性,保障用户数据不被篡改。同时,智能升级的数据存储及查询系统提升了用户体验,Star Tower Chain 致力于持续深化数据治理,推动区块链智能时代的进一步发展,为用户提供更高效、安全的服务。
|
8月前
|
传感器 人工智能 数据可视化
数智入海,GIS赋能智慧海洋
随着科技发展,各国积极推进海洋数字化建设,建立全球海洋观测网络,获取实时数据并挖掘价值。我国从“十四五”规划到二十大报告强调海洋强国战略,利用地理空间信息技术和物联网整合监测数据,提供智能管理与决策支持,实现海洋环境的可视化三维场景、实时监测、环境保护、灾害预警及专题图件服务,推动海洋经济高质量发展。
|
12月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
389 15
Android 系统缓存扫描与清理方法分析
|
10月前
|
机器学习/深度学习 人工智能 前端开发
【AI系统】AI 编译器基本架构
本文承接前文关于AI编译器发展的三个阶段,深入探讨通用AI编译器架构。文章首先回顾现有AI编译器架构,如PyTorch的转换流程及优化策略,然后介绍理想化的通用AI编译器架构,涵盖从前端接收多框架模型输入到后端生成特定硬件代码的全过程。重点解析了编译器的中间表达IR、前端与后端优化技术,以及现有AI编译器全栈产品的层次结构,为读者提供了全面的技术概览。
368 2
|
12月前
|
人工智能 算法 决策智能
面向软件工程的AI智能体最新进展,复旦、南洋理工、UIUC联合发布全面综述
【10月更文挑战第9天】近年来,基于大型语言模型(LLM)的智能体在软件工程领域展现出显著成效。复旦大学、南洋理工大学和伊利诺伊大学厄巴纳-香槟分校的研究人员联合发布综述,分析了106篇论文,探讨了这些智能体在需求工程、代码生成、静态代码检查、测试、调试及端到端软件开发中的应用。尽管表现出色,但这些智能体仍面临复杂性、性能瓶颈和人机协作等挑战。
368 1
|
Java 数据安全/隐私保护 Sentinel
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
|
机器学习/深度学习 编解码 PyTorch
基于MeshCNN和PyTorch的三维对象分类和分割
基于MeshCNN和PyTorch的三维对象分类和分割
544 0
基于MeshCNN和PyTorch的三维对象分类和分割
|
存储 消息中间件 监控
SpringCloud Alibaba常见组件
Spring Cloud Alibaba是一套基于Spring Cloud的微服务解决方案,它集成了多个常见的组件,每个组件都有特定的功能和用途。以下是Spring Cloud Alibaba的常见组件及其解决的问题:
3221 0