pwl999's blog

  • 首页

  • 关于

  • 标签

  • 分类

Linux Perf 1.1、perf_event内核框架

发表于 2018-07-25 | 更新于 2019-01-14 | 分类于 Trace |
为什么有了ftrace又出来一个perf?因为ftrace只管抓trace数据并没有分析,perf在trace数据分析方面做出了很多成果。 在trace数据采集方面,perf复用了ftrace的所有插桩点,并且加入了采样法(硬件PMU)。PMU是一种非常重要的数据采集方法,因为它大部分是硬件的,所以可以做到一些软件做不到的事情,获取到一些底层硬件的信息。 perf的基本包装模型是这样的,对每一个event分配一个对应的perf_event结构。所有对event的操作都是围绕perf_event来 ...
阅读全文 »

Linux Ftrace 1.5、syscall event

发表于 2018-06-15 | 更新于 2019-01-14 | 分类于 Trace
1、函数插桩 1.1、”events/raw_syscalls/sys_enter”、”events/raw_syscalls/sys_exit” trace event的插桩在系统调用的出口、入口路径上,系统布置了两个tracepoint格式的trace event。 el0_svc为用户态系统调用的入口,arch\arm64\kernel\entry.S: 12345678910111213141516171819202122232425262728293031323334353637383 ...
阅读全文 »

Linux Ftrace 1.4、kprobe event

发表于 2018-06-14 | 更新于 2019-01-14 | 分类于 Trace
从前面几章看:trace event使用静态tracepoint插桩,function tracer使用“bl _mcount”的插桩点来动态插桩。既然都是插桩,为什么我们不使用功能强大的kprobe机制? kprobe event就是这样的产物。krpobe event和trace event的功能一样,但是因为它采用的是kprobe插桩机制,所以它不需要预留插桩位置,可以动态的在任何位置进行插桩。开销会大一点,但是非常灵活,是一个非常方便的补充机制。 1、函数插桩1.1、插桩原理kprobe ...
阅读全文 »

Linux Ftrace 1.3、tracer (function、function_graph、irq_off)

发表于 2018-06-08 | 更新于 2019-01-14 | 分类于 Trace
如trace event一章的描述,任何一种trace都离不开以下流程: 函数插桩。使用各种插桩方式把自己的trace函数插入到需要跟踪的probe point上; input trace数据。在trace的probe函数被命中时,会存储数据到ringbuffer当中;这里还包括filter和trigger功能; ouput trace数据。用户或者程序需要读出trace数据,根据需要输出ram数据或者是方面用户阅读的数据;对数据的解析,遵循谁存储谁提供解析规则的原则; 以function ...
阅读全文 »

Linux Ftrace 1.2、trace event

发表于 2018-05-30 | 更新于 2019-01-14 | 分类于 Trace
Linux trace中,最基础的就是:function tracer和trace event。鉴于他们搭建的良好的框架(ringbuffer、tracefs),各种trace纷纷投奔而来。 tracer发展出了function、function_graph、irqsoff、preemptoff、wakeup等一系列tracer。 而event也发展出tracepoint、kprobe、uprobe等一系列的event。 不论是哪种trace,主要的工作都离不开上图的主要流程: 函数插桩 ...
阅读全文 »

Linux Ftrace 2.4、uprobe event的使用

发表于 2018-05-24 | 更新于 2019-01-14 | 分类于 Trace
uprobe是用户态的探针,它和kprobe是相对应的,kprobe是内核态的探针。uprobe需要制定用户态探针在执行文件中的位置,插入探针的原理和kprobe类似。 参考原文:Uprobe-tracer: Uprobe-based Event Tracing 1、Overviewuprobe event类似于kprobe event。在编译内核时配置CONFIG_UPROBE_EVENTS=y使能这个特性。 它的active不是通过current_tracer接口,而是通过“/sys/ker ...
阅读全文 »

Linux Ftrace 2.3、kprobe event的使用

发表于 2018-05-24 | 更新于 2019-01-14 | 分类于 Trace |
原始的trace event插桩是静态的:使用TRACE_EVENT()定义tracepoint,并且在代码中显式调用tracepoint。而kprobe机制可以实现在内核运行时动态的插桩,利用kprobe机制我们可以动态的插入trace event,实现和静态trace event同样的功能。 参考原文:Kprobe-based Event Tracing 1、Overview这些event和基于tracepoint的event非常类似,使用kprobe机制来替代tracepoint机制。所以 ...
阅读全文 »

Linux Ftrace 2.2、trace event的使用

发表于 2018-05-23 | 更新于 2019-01-14 | 分类于 Trace |
参考原文:Event Tracing 1、Introduction:Tracepoints用来创建event tracing框架,而不需要使用创建模块来注册probe函数。 不是所有的tracpoint都能够使用event tracing系统来跟踪。内核开发者必须提供代码定义信息怎么保存到tracing buffer、已经信息怎么打印出来。 2、 Using Event Tracing2.1、Via the ‘set_event’ interface有哪些有效的trace event,可以查看“ ...
阅读全文 »

Linux Ftrace 2.1、ftrace的使用

发表于 2018-05-23 | 更新于 2019-01-14 | 分类于 Trace
关于Ftrace的使用,最权威的解读就在”Documentation/trace”文件夹下,我们挑选其中最经典的几个文件来进行翻译,加上自己理解的解读。 参考原文:ftrace - Function Tracer 1、背景:Ftrace本来设计作为一个内部的tracer提供给系统的开发者和设计者,帮助他们弄清kernel正在发生的行为。它能够调试分析延迟和性能问题。 Ftrace发展到现在已经不仅仅是作为一个function tracer了,它实际上成为了一个通用的trace工具框架: 一方面 ...
阅读全文 »

Linux Ftrace 1.1、ring buffer

发表于 2018-05-17 | 更新于 2019-01-14 | 分类于 Trace
1、简介ringbuffer是trace框架的一个基础,所有的trace原始数据都是通过ringbuffer记录的。ringbuffer的作用主要有几个: 1、存储在内存中,速度非常快,对系统性能的影响降到了最低; 2、ring结构,循环写。可以很安全的使用又不浪费内存,能够get到最新的trace信息; 但是,难点并不在这。真正的难点是系统会在常规上下文、中断(NMI、IRQ、SOFTIRQ)等各种场景下都会发生trace,怎么样能既不影响系统的逻辑,又能处理好相互之间的互斥把trace的 ...
阅读全文 »
123
pwl999

pwl999

RTFSC(Read The Fucking Source Code)

30 日志
3 分类
22 标签
© 2019 pwl999
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Gemini v6.6.0