LWN:用户空间trace event合入一年之后……

告别printk:用Linux内核Tracepoint给你的驱动调试换个活法(附ext4实战代码) 本文探讨了Linux内核调试中printk的局限性,并介绍了Tracepoint技术的优势。通过ext4文件系统的实战代码,展示了Tracepoint如何实现高性能、低开销的内核调试,包括动态监控、精准过滤和用户空间工具trace-cmd的使用。文章还提供了自定义Tracepoint的进阶技巧和性能对比数据,帮助开发者提升调试效率。 阅读详情

关注了就能看到更多这么棒的文章哦~

User trace events, one year later

By Jonathan Corbet
April 3, 2023
DeepL assisted translation
https://lwn.net/Articles/927595/

内核有一套完善的机制来控制对内核空间各种 event 的追踪(tracing)。开发者经常希望能够使用同样的接口来对用户空间的活动进行追踪,但是还没有什么比较好的支持。一年前,有人试图添加控制用户空间跟踪事件的 API,但是没能成功,一直没有被完全启用起来。现在,Beau Belgrave 带着重新设计的 API 回来了,这可能最终可以使得这个机制能广泛使用起来。

用户空间的 trace event 就跟内核中的 event 一样,在大多数时候都是没有打开的;没有人在监听这些事件,所以不应该产生数据。在内核中,这些未激活的 tracepoint 在二进制文件中会直接修改来取消掉,但这种运行时大 patch 的做法在用户空间中并不容易实现。因此,用户空间的代码必须真的要去检查指定的 trace event 是否被启用了,如果启用了就产生相应的数据记录。由于大多数情况下指定 event 应该都是没有启用的,所以这种检查必须要尽可能地快。

在 2022 年,Belgrave 提出的 API 要求程序用 mmap() 将一个特殊的 page 来映射到他们的地址空间。每一个在内核中注册的 event 都会在这个映射出来的 page 中分配一个字节;每当一个 event 被启用时,内核会在相应的字节中存储一个非零值。然后程序可以在 tracepoint 触发时检查该字节,从而确定是否应该产生 tracing data。

人们对这个 API 有一些抱怨。使用整个字节来存储一个 bit 的信息有些浪费。损失 7 个 bit 的内存似乎并不是一个沉重的代价,但真正的问题在于 cache 利用率方面的损失。对每个 event 使用一个 bit 就可以使存储在 cache line 中的 event flag 的数量增加到 8 倍。由于这些 flag 会在程序的最繁忙的代码执行路径中也可能会需要频繁检查,所以 cache 的效率会对支持 tracing 引入的整体开销产生重大影响。此外由于需要对单个 page 进行映射,也不利于那些可能跟所链接的程序独立的 tracing 库文件的情况。

这些抱怨是在开发过程后期出现的,在代码被合入 tracing tree 之后。尽管有这些批评,这些 patch 还是进入了 5.18 版本的内核,但是整个机制在内核配置系统中被标记为 "broken"。因此,user-event 接口在默认情况下是不启用的,而且现在大多数内核都没有缺省打开。

新的 API 完全取消了这个 page mapping 的需求。在希望向内核注册一个 event 时,相应的程序应该打开/sys/kernel/tracing/user_events_data,并发出 DIAG_IOCSREG ioctl()调用,将下面的结构作为参数传递进去:

struct user_reg {
  __u32 size;
  __u8 enable_bit;
  __u8 enable_size;
  __u16 flags;
  __u64 enable_addr;
  __u64 name_args;
  __u32 write_index;
};

user_reg 结构本身的 size 应该被存储在 size 成员变量中;这就可以让内核在今后需要增加这个结构内容的时候保持向后兼容。ioctl()调用将在 enable_addr 地址来注册一个长度为 enable_size 字节的内容;在 64 位系统中,这个 size 必须是 4 或 8 字节。该值中控制 event 的 bit 由 enable_bit 来指定;每当 event 被激活或停用时,内核就会 set 或 clear 这个 bit(而不干扰其他 bit)。flags 值应该是 0,name_args 指向一个字符串,描述 trace event 使用相应 format 所返回的数据。

注册成功后,内核将把一个值存入 write_index,每当程序为指定 event 生成数据时都应该使用这个值。还有一个操作(DIAG_IOCSUNREG),可以用来取消 event 的注册。

新的 API 可以让启用这些 event 的 bit 打包得更密集一些,如果应用程序关注到这一点的话。否则的话,也可以把每个 bit 都放到独立的数据当中,而每个数据中的其他 bit 可以用于其他目的,也许可以由 user-space tracer 来自定义使用。这样就得到了一个更灵活的 API,如果顺利得话就可以解决针对其前身的批评。

到目前为止,这项工作已经进行了第十次修订;过去几轮修订只带来了相对较小的改动。这表明 review 人员对目前的 API 很满意。这项工作似乎准备在 6.4 合并窗口期间推到 upstream 去,并同时提供一个 patch,指出新的 API "似乎在不使用水晶球(crystal ball)的情况下也会很稳定",并最终从配置选项中删除了 "broken" 标记。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

format,png

tracepoint tacepoint 阅读详情

相关推荐

【PT+Arduino+OneNET基础教程1】PacketTracer中MCU芯片编程教程(零基础入门)

PacketTracer软件内MCU芯片编程入门 零基础

ChloeMax_的博客 9453

使用TRACE_EVENT宏添加Tracepoint(1/3部分)

其他的追踪点的头文件必须使用除"sched"和"_TRACE_SCHED_H"之外,其他的内容。TP_fast_assign宏中的代码是普通的C语言代码。其中,"#define TRACE_SYSTEM sched"起到了这样的效果,TRACE_SYSTEM定义了头文件中的TRACE_EVENT()宏属于哪个组,同时也表明了TRACE_EVENT()宏中定义的追逐点属于"/sys/kernel/debug/tracing/events/"目录下的哪个子目录,这种分组决定了用户按组启用或者禁用追踪点。

生活需要深度 930

《哥谭神话-工程篇》02.Palantir的Ontology层(语义层) -企业操作系统的大脑

Ontology(语义层) 是Foundry 的核心层。Ontology 位于集成到 Foundry 中的数字资产(数据集和模型)之上,并将其连接到现实世界的对应物,从工厂、设备和产品等物理资产到客户订单或金融交易等概念。本篇将详细拆解Ontology(语义层)。

880

【翻译】 缓解失眠的微量元素

请考虑订阅LWN订阅是LWN.net的生命线。 如果您喜欢这些内容,并希望看到更多的内容,您的订阅将有助于确保LWN继续蓬勃发展。 请访问此页面加入我们,让LWN继续在网络上传播。 作者:Jonathan Corbet2020年10月29日 内核的跟踪基础架构被设计为快速,并尽可能少地干扰系统的正常运行。 这一要求的一个结果是,当跟踪...

超级码力 3472

Mac上IDEA的PlantUML插件报错‘找不到Graphviz’?手把手教你用Homebrew搞定(附阿里云镜像避坑)

本文详细解决了Mac上IDEA的PlantUML插件报错‘找不到Graphviz’的问题,通过Homebrew安装Graphviz并配置阿里云镜像源,特别针对Apple Silicon芯片用户提供了优化方案。文章还涵盖了IDEA中PlantUML插件的正确配置和常见问题排查,帮助开发者高效使用PlantUML进行UML图表设计。

weixin_42619742的博客 468

麒麟系统grub被锁怎么办?双密码遗忘救援指南(实测V10 SP3版本)

本文详细介绍了麒麟系统V10 SP3版本在GRUB和root密码双遗忘情况下的救援指南。通过ISO镜像进入救援模式,结合单用户模式操作,实现密码重置与系统权限恢复,特别适用于等保合规环境。

384

LWN:tracepoint如何支持睡眠!

关注了就能看到更多这么棒的文章哦~Relief for insomniac tracepointsBy Jonathan CorbetOctober 29, 2020DeepL assi...

Linux News搬运工 380

【Qt】Window环境下搭建Qt6、MSVC2022开发环境(无需提前安装Visual Studio)

本文介绍 Windows 环境下无需安装 Visual Studio,搭建 Qt6 与 MSVC2022 开发环境的方法,以节省磁盘空间。核心步骤包括:用中科大镜像提速 Qt6 在线安装,需勾选 Qt Creator 17.0.1、MSVC 2022 x64 等组件;配置环境变量,添加 mingw_64、msvc2022_64 及 Qt Creator 的二进制目录;安装 MSVC 2022 编译器与 Windows 10 SDK 并记录版本;配置 Qt Creator 构建套件,可选设置 vcvarsal

油炸自行车的博客 2922

Using the TRACE_EVENT() macro

原文地址: Part1:https://lwn.net/Articles/379903/ Part2:https://lwn.net/Articles/381064/ Part3:https://lwn.net/Articles/383362/  

zhtw90的专栏 259

激光雷达测距方式全解析:ToF、三角测距和FMCW到底怎么选?

本文深度解析激光雷达三种主流测距方式(ToF、三角测距和FMCW)的技术原理、环境适应性和成本模型,提供场景化选型决策指南。通过对比各技术在精度、抗干扰能力和维护成本等方面的表现,帮助工程师在自动驾驶、工业检测和消费电子等领域做出最优选择。

qqq44的博客 719

ESXI 7 :创建统信V20_1050d服务器系统虚拟机

记录一下在 X86 架构创建统信V20_1050d 虚拟机遇到的问题。已遇到的问题有①:常规服务器环境下网络连接失败重点:按照桌面版本,有问题处理简单。

guyuelin123的博客 1967

系统调用解析第一部分【翻译】

read()系统调用作为探索内核系统调用机制的一个例子。它实现在fs/read_write.c当中。它是一个很短的函数,它会调用vfs_read()完成具体的工作。从调用角度看,最有趣的事这个函数的定义方式,它用SYSCALL_DEFINE3()这个宏来定义。事实上从代码上看,这个函数到底调用了什么函数不是很清楚。这些SYSCALL_DEFINEn()宏是内核代码定义系统调用的标准方式。这里尾部的n代表参数的个数。这些宏定义在。

jason的专栏 265

SUMO仿真教程(1) ——安装环境的设置(Windows 10系统)

SUMO安装环境的设置 目录一.SUMO下载的官方网址二.下载步骤:三.环境设置:1.打开设置环境变量的界面2.用户(Administrator)变量设置3.系统变量设置四.总述 一.SUMO下载的官方网址 sumo的下载地址: 二.下载步骤: 1.以sumo1.8.0为示例进行演示,点击下载地址; 2.选择Windows64位的安装版本,如下图所示: 3.点击对应版本会跳转到如下图所示的界面,等待几秒后会自动下载(温馨提示:请将下载路径提前设置好): 4.到目标存储路径下查看下载完成的SUMO(本

weixin_50632459的博客 1万+

Linux系统编程入门:从基础到实践

Linux系统编程是深入操作系统底层的核心技术,涉及系统调用、进程管理和文件操作等基础概念。通过直接与内核交互,开发者能够高效控制硬件资源和系统功能,这在开发高性能服务器、嵌入式系统等场景中尤为重要。文章以文件复制工具为例,展示了如何使用open()、read()和write()等系统调用实现基础功能,同时强调了错误处理和内存管理的重要性。对于想要提升系统级编程能力的开发者,理解这些原理并掌握GCC、GDB等工具链的使用是必经之路。

weixin_34279246的博客 380

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

深入解析Linux IO调用链与性能优化

IO操作是Linux系统编程的核心基础,涉及从用户空间到内核的多层调用链。理解C标准库缓冲区、系统调用接口和内核页缓存的工作原理,对于优化IO密集型应用至关重要。通过分析文件流缓冲策略、VFS抽象层和块设备调度机制,开发者可以掌握减少系统调用开销、提升数据吞吐量的关键技术。在实际场景中,合理选择mmap内存映射、AIO异步IO或O_DIRECT直接IO等方案,能够显著提升数据库、大数据处理等应用的性能表现。本文结合Linux内核参数调优和SSD特别优化等实践技巧,为系统级软件开发提供全面的IO性能优化指南。

weixin_34111790的博客 457

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 223

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 149

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 328

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 115

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 194

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

Decorator

TaskDecorator 是异步场景下"跨线程传递上下文"的标准方案,主要用于传递 MDC、用户信息、数据源路由等上下文数据,核心价值是让异步任务的日志链路不中断、业务上下文不丢失。TaskDecorator 是 Spring 提供的一个钩子接口,用于在异步任务执行前对 Runnable 进行包装,常用于跨线程传递上下文。如果你在项目中遇到具体的异步上下文传递问题,可以把代码贴出来,我帮你给出最合适的 Decorator 方案 👍。✅ 核心能力:在线程切换时,把"父线程的上下文"搬到"子线程"

wlwork66的博客 104

数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南

Oracle 提供了ORA_ROWSCN伪列(System Change Number),记录最后修改行的 SCN,类似 PostgreSQL 的xmin。实践中通常仍使用 version 字段方案,逻辑与 MySQL 完全相同。-- Oracle:通过 ORA_ROWSCN 实现乐观锁-- 更新时比对 SCN// 自定义注解// AOP 切面@Aspect@Component@Slf4jtry {

yjc_1111的专栏 397

JDK 下载安装:装完 Java 提示「不是内部或外部命令」?环境变量没配

JDK 是写 Java 程序必须装的东西。它包含运行 Java 的虚拟机(JRE)和编译 Java 的编译器(javac)——装了它,能跑、.java文件能编译成可执行程序。免费,学习和小规模生产都不花钱。

科小怪的博客 626

C++ 多态详解:作用、原理与实战用法

多态是C++面向对象的核心特性,通过虚函数实现运行期动态绑定,使同一接口在不同对象上表现出不同行为。其核心作用包括统一接口、提升可扩展性、降低耦合、支持运行时分派与批量处理。实现依赖虚函数表(vtable)和虚指针(vptr),需注意虚析构函数、对象切片等陷阱。相比编译期多态(模板),运行期多态灵活性高但有调用开销。合理结合两者,可兼顾代码的灵活性与性能,是构建可扩展、低耦合系统的关键。

2402_85743155的博客 376

java框架大全

java框架大全

qq_39326137的博客 183
上一篇: LWN:Ubuntu 不再缺省提供Flatpak!
下一篇: LWN:塞一个文件系统进来!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值