当前位置: 首页 > news >正文

Linux内核中的ftrace详解

Linux内核中的ftrace详解

引言

ftrace是Linux内核中的一个强大的跟踪工具,它允许开发者和系统管理员跟踪内核函数的执行、系统调用、中断处理等。ftrace提供了丰富的跟踪功能,是内核调试和性能分析的重要工具。本文将深入探讨Linux内核中的ftrace机制,包括其原理、使用方法和应用。

ftrace的基本概念

1. ftrace的定义

ftrace是Linux内核中的一个跟踪框架,它允许用户跟踪内核函数的执行、系统调用、中断处理等。

2. ftrace的优势

  • 低开销:对系统性能影响小
  • 灵活性:支持多种跟踪器
  • 强大的功能:可以跟踪几乎所有内核活动
  • 易于使用:通过sysfs接口访问

3. ftrace的跟踪器类型

跟踪器描述
function跟踪函数调用
function_graph跟踪函数调用图
schedule跟踪调度事件
irqsoff跟踪关闭中断的时间
preemptoff跟踪关闭抢占的时间
preemptirqsoff跟踪关闭中断和抢占的时间
wakeup跟踪唤醒事件
branch跟踪分支预测
mmiotrace跟踪MMIO访问
blk跟踪块IO
nop禁用跟踪

ftrace的使用

1. ftrace的文件系统接口

# ftrace的挂载点 /sys/kernel/debug/tracing/ # 主要文件 current_tracer # 当前使用的跟踪器 available_tracers # 可用的跟踪器 set_ftrace_filter # 函数过滤器 set_ftrace_pid # PID过滤器 trace # 跟踪输出 options/ # 跟踪选项

2. 基本使用方法

# 查看可用的跟踪器 cat /sys/kernel/debug/tracing/available_tracers # 设置跟踪器 echo function > /sys/kernel/debug/tracing/current_tracer # 设置函数过滤器 echo schedule > /sys/kernel/debug/tracing/set_ftrace_filter # 开始跟踪 echo 1 > /sys/kernel/debug/tracing/tracing_on # 运行要跟踪的程序 ./my_program # 停止跟踪 echo 0 > /sys/kernel/debug/tracing/tracing_on # 查看跟踪结果 cat /sys/kernel/debug/tracing/trace

3. 高级使用方法

# 使用function_graph跟踪器 echo function_graph > /sys/kernel/debug/tracing/current_tracer # 设置函数深度 echo 5 > /sys/kernel/debug/tracing/max_graph_depth # 跟踪特定进程 echo <pid> > /sys/kernel/debug/tracing/set_ftrace_pid # 跟踪中断关闭时间 echo irqsoff > /sys/kernel/debug/tracing/current_tracer # 跟踪抢占关闭时间 echo preemptoff > /sys/kernel/debug/tracing/current_tracer # 清除跟踪缓冲区 echo > /sys/kernel/debug/tracing/trace

ftrace的实现

1. ftrace的架构

用户空间 ↓ sysfs接口 ↓ ftrace核心 ↓ 各种跟踪器 ↓ 内核代码

2. ftrace的核心结构

#include <linux/ftrace.h> struct ftrace_ops { void (*func)(unsigned long ip, unsigned long parent_ip, struct ftrace_ops *ops, struct pt_regs *regs); int (*flags); char *name; struct ftrace_ops *next; }; struct ftrace_event_call { const char *name; struct list_head list; struct ftrace_event_func *func; struct trace_event_class *class; };

3. ftrace的工作原理

  • 动态插桩:在函数入口处插入跟踪代码
  • 事件触发:当函数被调用时触发跟踪
  • 数据收集:收集跟踪数据
  • 数据输出:将跟踪数据输出到trace文件

ftrace的高级功能

1. 函数跟踪

# 跟踪特定函数 echo "*schedule*" > /sys/kernel/debug/tracing/set_ftrace_filter # 跟踪多个函数 echo "schedule,sys_open,sys_read" > /sys/kernel/debug/tracing/set_ftrace_filter # 排除函数 echo "!schedule" > /sys/kernel/debug/tracing/set_ftrace_notrace

2. 函数图跟踪

# 使用function_graph跟踪器 echo function_graph > /sys/kernel/debug/tracing/current_tracer # 设置函数深度 echo 3 > /sys/kernel/debug/tracing/max_graph_depth # 查看跟踪结果 cat /sys/kernel/debug/tracing/trace

3. 事件跟踪

# 查看可用的事件 ls /sys/kernel/debug/tracing/events/ # 启用事件 echo 1 > /sys/kernel/debug/tracing/events/sched/enable # 查看事件格式 cat /sys/kernel/debug/tracing/events/sched/sched_switch/format # 查看事件数据 cat /sys/kernel/debug/tracing/trace

4. 自定义跟踪点

// 定义跟踪点 #include <linux/tracepoint.h> DECLARE_TRACE(my_event, TP_PROTO(int value), TP_ARGS(value)); // 使用跟踪点 TRACE_EVENT(my_event, TP_PROTO(int value), TP_ARGS(value), TP_STRUCT__entry( __field(int, value) ), TP_fast_assign( __entry->value = value; ), TP_printk("value=%d", __entry->value) ); // 触发跟踪点 trace_my_event(42);

ftrace的应用

1. 性能分析

# 跟踪调度延迟 echo wakeup > /sys/kernel/debug/tracing/current_tracer # 跟踪中断延迟 echo irqsoff > /sys/kernel/debug/tracing/current_tracer # 跟踪抢占延迟 echo preemptoff > /sys/kernel/debug/tracing/current_tracer # 查看最大延迟 cat /sys/kernel/debug/tracing/trace_stat/irqsoff

2. 内核调试

# 跟踪系统调用 echo "sys_*" > /sys/kernel/debug/tracing/set_ftrace_filter # 跟踪文件系统操作 echo "ext4_*" > /sys/kernel/debug/tracing/set_ftrace_filter # 跟踪网络操作 echo "net_*" > /sys/kernel/debug/tracing/set_ftrace_filter # 查看跟踪结果 cat /sys/kernel/debug/tracing/trace

3. 系统行为分析

# 跟踪进程创建 echo "do_fork" > /sys/kernel/debug/tracing/set_ftrace_filter # 跟踪内存分配 echo "__kmalloc" > /sys/kernel/debug/tracing/set_ftrace_filter # 跟踪页错误 echo "handle_mm_fault" > /sys/kernel/debug/tracing/set_ftrace_filter # 查看跟踪结果 cat /sys/kernel/debug/tracing/trace

实际案例分析

1. 跟踪调度延迟

# 设置跟踪器 echo wakeup > /sys/kernel/debug/tracing/current_tracer # 开始跟踪 echo 1 > /sys/kernel/debug/tracing/tracing_on # 运行负载程序 stress --cpu 4 --io 2 --vm 1 --vm-bytes 128M --timeout 10s # 停止跟踪 echo 0 > /sys/kernel/debug/tracing/tracing_on # 查看跟踪结果 cat /sys/kernel/debug/tracing/trace_stat/wakeup

2. 跟踪文件系统操作

# 设置跟踪器 echo function > /sys/kernel/debug/tracing/current_tracer # 设置过滤器 echo "ext4_*" > /sys/kernel/debug/tracing/set_ftrace_filter # 开始跟踪 echo 1 > /sys/kernel/debug/tracing/tracing_on # 执行文件操作 cp large_file /tmp/ # 停止跟踪 echo 0 > /sys/kernel/debug/tracing/tracing_on # 查看跟踪结果 cat /sys/kernel/debug/tracing/trace | head -50

3. 跟踪网络操作

# 设置跟踪器 echo function > /sys/kernel/debug/tracing/current_tracer # 设置过滤器 echo "tcp_*" > /sys/kernel/debug/tracing/set_ftrace_filter # 开始跟踪 echo 1 > /sys/kernel/debug/tracing/tracing_on # 执行网络操作 wget https://example.com # 停止跟踪 echo 0 > /sys/kernel/debug/tracing/tracing_on # 查看跟踪结果 cat /sys/kernel/debug/tracing/trace | head -50

结论

ftrace是Linux内核中一个强大的跟踪工具,它为开发者和系统管理员提供了深入了解内核行为的能力。通过ftrace,我们可以跟踪内核函数的执行、系统调用、中断处理等,从而进行性能分析、内核调试和系统行为分析。理解ftrace的原理和使用方法,对于开发高性能的内核代码和系统调优都有重要意义。

http://www.jsqmd.com/news/637057/

相关文章:

  • 花十几万做的高端网站,为什么连个询盘都没有?
  • 拿下CV算法offer的25个硬核知识点,看完你就稳了
  • 2007-2020年税调与上市公司匹配结果
  • 深耕十余年!602游戏平台深度解析 + 必玩传奇游戏榜单(页游爱好者收藏)
  • MT-PXle【多路复用器】1线-单端信号类型,高负载能力,高密度通道
  • 深入openTCS车辆适配器开发:从模拟到实战的AGV/RGV控制
  • Trae国内版初体验:用豆包大模型和DeepSeek-R1,真能帮你从零撸一个项目吗?
  • COMET实战:GPU环境下的机器翻译质量评估系统搭建指南
  • 书匠策AI:毕业论文的“智慧工匠”,轻松雕琢学术瑰宝
  • 书匠策AI:毕业论文的“智能魔法棒”,让学术创作事半功倍!
  • 从零部署RKNN模型:在Ubuntu22.04上搭建Python3.8虚拟环境与RKNN Toolkit2-1.5.2开发环境
  • GetQzonehistory:如何一键备份你的QQ空间所有历史说说
  • 【算法精解】从偏好对到最优模型:DPO(Direct Preference Optimization)核心推导与实践指南
  • VCD 转 WGL,真正难的不是“改格式”,而是“怎么采样”
  • 5分钟部署Qwen3-Embedding-4B:支持100+语言的文本嵌入
  • Python 批量重命名文件
  • 书匠策AI大揭秘:毕业论文的“智慧工匠”,助你轻松筑梦学术殿堂!
  • 当 6912 个光模块成为常态,超节点是不是走错了路?
  • 每日一题day1(Leetcode 76最小覆盖子串)
  • YimMenu:重新定义GTA5游戏体验的开源安全增强框架
  • 源雀SCRM AI开源版V2.1:AI朋友圈功能开启私域运营新篇
  • 三相UVW的时间分配
  • 亲测好用的物联网开发服务商分享
  • Ace-Step-1.5-XL-Turbo ai歌曲生成一键整合包,解压即用!支持高保真长音频,AI音乐制作进入2.0时代
  • # MySQL InnoDB 隔离级别与 MVCC 完全解析
  • 书匠策AI:毕业论文的“智能魔法棒”,让学术创作不再难!
  • 亚古数据:查询土耳其公司可以获取哪些信息?
  • 【AIAgent架构核心机密】:3大注意力机制设计范式,90%工程师至今未掌握的工业级落地要点
  • jvm的三种类加载器简单说明
  • 阿里云专有云网络架构