linux内核存储-trace相关

芯片内核调优开发和存储、文件系统几乎是紧密相连的

ftrace (Function Tracer)是一个针对Linux内核的跟踪框架。虽然它最初的名字是Function Tracer,来自于ftrace记录内核运行时执行的各种函数调用相关信息的能力,但ftrace的跟踪能力覆盖了更广泛的内核内部操作。linux内核存储-trace相关_第1张图片

1,宽泛介绍

ftrace是Linux内核中的一种跟踪工具,用于分析和调试内核和应用程序的性能问题。它可以帮助开发人员跟踪函数调用、系统调用、中断事件、定时器事件等各种事件,并生成相应的跟踪数据

1.1 Tracing Tools

Linux 跟踪工具使用前面描述的事件探针的基础上(tracepoints、USDT、kprobes、uprobes)进行高级性能分析。 Linux 也提供了一系列的动态追踪机制工具,比如:
(1)perf:官方的 Linux 分析器。 它非常适合 CPU 分析(堆栈跟踪采样)和 PMC 分析,并且可以检测其他事件,通常记录到输出文件以进行后处理。

(2)ftrace:官方的 Linux 追踪器,它是一个由不同的追踪工具组成的多功能工具。 它适用于内核代码路径分析和资源受限的系统,因为它可以在没有依赖关系的情况下使用。

(3)BPF(eBPF) :它支持高级跟踪工具,主要是 BCC 和 bpftrace。 BCC 提供了强大的工具,而 bpftrace 提供了用于 custom one-liners and short programs的高级语言。

(4)SystemTap:一种高级语言和跟踪器,带有许多用于跟踪不同目标的 Tapsets(库)。是一个允许我们来编写简单的脚本来检查正在运行的Linux系统活动状态的一个工具,可以快速、安全地提取、过滤和总结数据,以实现复杂性能或功能问题的诊断。linux内核存储-trace相关_第2张图片

linux内核存储-trace相关_第3张图片

由于ftrace 工具已经移植到Linux系统中,内核一般会默认配置debugfs,但是所需要的tracer追踪器默认可能只提供nop, 如果需要其他的tracer 

整个ftrace框架可以分为几个部分:ftrace核心框架,RingBuffer,debugfs,tracepoint、kprobe、uprobe等收集内核信息的方式,各种tracer。

ftrace核心框架是整个ftrace功能的纽带,包括对内核的修改,tracer的注册,RingBuffer的控制等。

RingBuffer是静态动态ftrace的载体。

debugfs则提供了用户空间对ftrace设置接口。

tracepoint是静态trace,它需要提前编译进内核,可以定制打印内容,自由添加,并且内核对主要subsystem提供了tracepoint.

tracer有很多种,主要几大类:

(1)函数类:function, functin_graph, stack

(2)延时类:irqsoff, preemptoff, preempirqsoff, wakeup, wakeup_rt, wakeup_dl

(3)其他类:nop, mmiotrace, blk

ftrace 最常见的用途之一是事件跟踪(event tracing,用于显示tracepoint等收集到的内核数据),整个内核中有数百个静态事件点,可以通过 tracefs 文件系统启用这些事件点,以查看内核某些部分发生的情况。

当内核启动的时候,用户可以进入/sys/kernel/debug/tracing 目录查看当前支持的trance 命令。README文件提供了一个简短的使用说明,展示了 ftrace 的操作命令序列可见这个是一套东西,细节比较多

linux内核存储-trace相关_第4张图片

linux内核存储-trace相关_第5张图片

trace 文件给出的信息格式很清晰。
首先,字段“tracer:”给出了当前所使用的跟踪器的名字,这里为 function 跟踪器。然后是跟踪信息记录的格式,TASK 字段对应任务的名字,PID 字段则给出了任务的进程 ID,字段 CPU# 表示运行被跟踪函数的 CPU 号,这里可以看到 idle 进程运行在 0 号 CPU 上,其进程 ID 是 0 ;字段 TIMESTAMP 是时间戳,其格式为“.”,表示执行该函数时对应的时间戳;FUNCTION 一列则给出了被跟踪的函数,函数的调用者通过符号 “<-” 标明,这样可以观察到函数的调用关系。

1.2脚本示例:

trace内容太多,一般你只需要看一些特定的内容,所以需要用脚本来处理

linux内核存储-trace相关_第6张图片

用户空间通过tracefs文件系统控制ftrace的输出,tracefs挂载在/sys/kernel/tracing。通过mount命令查看挂载点

babylon: # mount | grep tracefs tracefs on /sys/kernel/tracing type tracefs (rw,seclabel,relatime,gid=3012) tracefs on /sys/kernel/debug/tracing type tracefs (rw,seclabel,relatime,gid=3012)

/sys/kernel/tracing目录下的关键文件:

linux内核存储-trace相关_第7张图片

  • 代码中打开ftrace  在bootargs中添加参数打开

  • linux内核存储-trace相关_第8张图片

常用的tracer

使用方法:echo xxx > current_tracer

nop:不使用tracer      

  • function:用于追踪函数,显示函数是被谁调用的(后面是调用者)

  • function_graph

与function类似,但是会显示函数调用的详细信息

在ftrace中添加log

printk常用于打印内核debug信息,但是由于其引入的开销比较大,在某些场合不适用。ftrace使用trace_printk代替printk(用时相比printk很少),trace_printk可以用在任何代码中,用法与printk一致,打印内容不输出在控制台而是被写入ftrace ring buffer,并且能通过目录下的trace文件读取

linux内核存储-trace相关_第9张图片

2,解决问题实例

很重要,但是现在没有,hh

内核要处理各种冻屏橙屏卡死问题,

2.1 自动化测试执行过程中橙屏-enter-QPST-mode

橙屏-抓dump-解dump-定位到最后卡死位置,如下图

linux内核存储-trace相关_第10张图片

2.2 47度关机

linux内核存储-trace相关_第11张图片

linux内核存储-trace相关_第12张图片

3,其他

kernel_platform/common-gki/Documentation/trace/tracepoints.rst

linux内核存储-trace相关_第13张图片

kernel_platform/common-gki/Documentation/trace/ftrace.rstlinux内核存储-trace相关_第14张图片

linux内核存储-trace相关_第15张图片

Using the TRACE_EVENT() macro (Part 1) [LWN.net]

https://lwn.net/Articles/383362/

Using the TRACE_EVENT() macro (Part 3) [LWN.net]

参考文章:

ftrace工具的介绍及使用-CSDN博客

Linux 追踪技术 ftrace 简介(一)-CSDN博客

你可能感兴趣的:(linux,运维,服务器)