浅析Linux追踪技术之ftrace:Event Tracing

文章目录

概述

Event Tracing(事件追踪)利用在内核代码中加入的各种Tracepoint(追踪点)实现对系统的追踪。Tracepoint可以在不创建自定义内核模块的情况下使用,以使用Event Tracing基础结构注册探测函数。

使用Event Tracing

Event Tracing基于tracefs文件系统进行配置,与Event Tracing相关的控制文件如下:

  • /sys/kernel/tracing/available_events:查看系统可追踪的事件;
  • /sys/kernel/tracing/set_event:配置对特定事件的追踪;
  • /sys/kernel/tracing/set_event_notrace_pid:设置不追踪PID指定进程的事件;
  • /sys/kernel/tracing/set_event_pid:设置仅追踪PID指定进程的事件;
  • /sys/kernel/tracing/events:存放了系统所有可追踪的事件,在对应的事件目录下,存在enable文件,可用于使能对这个事件的追踪。

使用set_event接口

  • 启用对一个事件的追踪:echo sched_wakeup >> /sys/kernel/tracing/set_event
  • 禁用对一个事件的追踪:echo '!sched_wakeup' >> /sys/kernel/tracing/set_event
  • 禁用对所有事件的追踪:echo > /sys/kernel/tracing/set_event
  • 启用对所有事件的追踪:echo *:* > /sys/kernel/tracing/set_event

系统中的可追踪事件都会归属到某一个特定的subsystem,例如irq、block、scsi、net等,查看/sys/kernel/tracing/availabel_events文件可以看到每一个事件的完整名称格式应该是::,其中subsystem部分是可选的。

set_event接口支持启用对某一个subsystem中所有事件的追踪:

复制代码
echo 'irq:*' > /sys/kernel/tracing/set_event

使用enable接口

/sys/kernel/tracing/events目录按照subsystem分类存放了系统中所有可追踪的事件,如下:

对于每一个可追踪事件,系统都提供了名为enable的控制文件,用于配置特定事件的开关。操作方式如下:

  • 启用对事件的追踪:echo 1 > /sys/kernel/tracing/events/block/block_plug/enable
  • 禁用对事件的追踪:echo 0 > /sys/kernel/tracing/events/block/block_plug/enable

如果需要启用对某一个subsystem下所有事件的追踪,操作对应subsystem目录下的enable文件就可以了。

Event配置

/sys/kernel/tracing/events目录存放了所有系统追踪事件的信息,每个事件都会在tracefs文件系统提供一些配置接口。

  • enable:启用/禁用对事件的追踪;
  • filter:配置事件过滤;
  • format:描述了事件的格式;
  • id:事件ID;
  • trigger:配置Event Trigger。

Event format

每个跟踪事件都关联了一个format文件,文件中包含了跟踪事件记录中每个字段的描述,这些信息可用于解析二进制跟踪流,也可以用于Event Filter中的查询字段。

完整的format信息通常包括以下几个部分:

  • 事件名称;
  • 事件ID;
  • 公共字段:以common_开头,记录了跟踪事件通用的信息;
  • 特定于事件的字段;
  • 打印事件的格式字符串。

Event Filtering

Event Filtering(事件过滤)可以使用过滤规则对关联的跟踪事件进行过滤。当跟踪事件记录到跟踪缓冲区时,内核会根据与该事件关联的过滤器对字段进行检查,字段值与过滤器匹配的事件会打印到跟踪输出中;不匹配的事件则会被丢弃。默认情况下,Event Filtering没有配置,跟踪事件发生后都会打印出来。

过滤规则

过滤规则的格式如下:

复制代码
field-name relational-operator value

其中:

  • field-name:支持过滤的字段,可以通过查询format文件获取;
  • relational-operator:对于数字类型字段,支持的操作符包括==, !=, <, <=, >, >=, &;而对于字符串类型字段,支持==, !=, ~,其中~支持通配符(*,?)和字符类([)。
设置过滤器

跟踪事件提供了filter文件节点,用于配置过滤规则。简单的示例如下:

Event Trigger

跟踪事件可以配置Event Trigger(事件触发器)功能,使得在跟踪事件发生可以触发特定的操作。通过向给定事件trigger文件写入触发器规则可以添加触发器到特定事件中或从中删除触发器。

Trigger语法

Event Trigger使用trigger文件节点进行配置。添加trigger的格式如下:

复制代码
echo 'command[:count] [if filter]' > trigger

删除trigger的格式如下:

复制代码
echo '!command[:count] [if filter]' > trigger

Trace marker

Trace marker是一种可以跟踪应用程序的手段,它本质上是tracefs文件系统提供的一个文件节点/sys/kernel/tracing/trace_marker,应用程序可以向trace_marker文件中写入字符串,ftrace会同步记录写入执行该动作时的时间戳。通过与ftrace的其它手段配合,trace_marker可以观察应用程序在不同跟踪标记之间运行的内核事件。

相关参考

相关推荐
huangdong_17 小时前
1688商品图片批量下载与SKU图自动分类技术完整实现方案
运维·服务器
yyuuuzz17 小时前
独立站运营的几个技术层面常见问题
大数据·运维·服务器·网络·数据库·aws
utf8mb4安全女神17 小时前
MySQL8.0.43的下载安装【二进制安装】【shell脚本】【环境准备】【my.cnf配置】【修改密码】
linux·服务器·网络
凡人叶枫17 小时前
Effective C++ 条款33:避免遮掩继承而来的名字
linux·服务器·开发语言·c++·嵌入式开发
凡人叶枫17 小时前
Effective C++ 条款31:将文件间的编译依存关系降至最低
linux·开发语言·c++·php·嵌入式开发·effective c++
MXsoft61817 小时前
**用自动化脚本给MAC误阻断留条后路:可审计、可回滚的准入控制方案**
运维·macos·自动化
ai_coder_ai18 小时前
在自动化脚本中如何调用大语言模型?
运维·语言模型·自动化
冰帆<18 小时前
[特殊字符] 深度起底:突破火山引擎 Ark-Helper 的 Linux 底层环境死锁,顺手魔改一份 Windows 一键安装脚本!
linux·windows·火山引擎
我星期八休息18 小时前
Linux系统编程—mmap文件映射
java·linux·运维·服务器·数据库·mysql·spring
java_cj18 小时前
从kubectl源码学pprof:生产环境性能分析的实战指南
运维·云原生·容器·kubernetes