浅谈Linux追踪技术

概述

随着计算机的发展,软硬件系统变得越来越复杂,于是衍生出了各类追踪技术和工具,用于验证和分析复杂系统内部运行的正确性,并为解决生产问题提供必要的帮助。从广义上来说,包括日志也是一种追踪技术,日志记录系统的运行信息,并且可以在系统出错时打印错误信息,但日志的功能通常限制于对系统的流程信息和错误进行打印,而无法记录系统更详细的运行信息。

时至今日,Linux系统上已经产生了太多的工具,例如perf、ftrace、BFP等,如何在面临问题时,选择和搭配合适的工具反而成了难题。如果希望在整体上对这些工具有个认识,了解这些追踪技术的底层机制是很有必要的。

事件源

追踪技术的核心是跟踪和记录系统在运行过程中发生的各种关键事件和行为。对于一个运行中的系统来说,时刻都会发生不同的事件,这些事件或由硬件触发,或由软件产生。根据事件的不同来源,我们可以将系统的事件源分为硬件事件和软件事件这两大类;另外, perf工具给出了更详细的事件源分类,可以查看perf文档进行了解。

硬件事件

硬件事件通常使用硬件提供的性能监控计数器 PMU(Performance Monitoring Monitor)进行收集,包括了各类硬件的性能情况,比如 CPU指令执行效率、CPU缓存命中率、指令周期、分支预测等;

软件事件

软件事件的收集使用到了一种称作探针的技术。

Linux追踪技术是利用探针机制来采集内核或者应用程序的运行信息,从而可以不用修改内核或应用程序的代码,就获得调试信息,对问题进行分析、定位。在Linux内核文档中,有专门的章节介绍了Linux内核使用的各种追踪技术。

探针

为了捕捉程序运行情况,我们在程序中设置一些 “ 陷阱 ”,并设置处理程序,我们称之为探针,有的探针是在代码中预定义的,称作静态探针;有的是在运行时动态添加的,称作动态探针。静态探针有文档完备且稳定的接口,动态探针提供所需的近乎无限的可观测性。基于静态探针实现的追踪技术可以称作静态追踪技术,而基于动态探针实现的追踪技术也可以称为动态追踪技术。

静态探针

静态探针是事先在代码中定义好,在程序编译时就添加到应用程序或者内核中的探针。静态探针只有被开启时才会运行,不开启就不会运行,常见的静态探针包括内核中的跟踪点(tracepoints)和 USDT(Userland Statically Defined Tracing)探针。

  • 跟踪点(tracepoints)是内核静态插桩技术,跟踪点在技术上只是放置在内核源代码中的跟踪函数,实际上就是在源码中插入的一些带有控制条件的探测点,这些探测点允许事后再添加处理函数。
  • USDT(User-level statically defined tracing)探针,全称是用户级静态定义跟踪, 提供了一个用户空间版的跟踪点机制,需要在源码中插入DTRACE_PROBE代码,并编译到应用程序中

动态探针

动态探针是应用程序没有定义,在程序运行时动态添加的探针。动态探针类似于异常处理机制,当系统产生一个异常,就会跳转去执行对应的 handle。动态探针会在函数流程中插入一些探测点,程序执行到探测点时候会去执行对应的 handle,从而达到观测应用程序的目的。 常见的动态探针有两种,即用于内核态的 kprobes 和用于用户态的 uprobes:

  • kprobes:内核动态插桩,用来跟踪内核态的函数,/proc/kallsym 中的函数几乎都可以用于跟踪,包括用于函数调用的 kprobe 和用于函数返回的 kretprobe。为非稳定的跟踪机制,数量比较多。
  • uprobes:uprobes是用户级的动态插桩,用来跟踪用户态的函数,包括用于函数调用的 uprobe 和用于函数返回的 uretprobe。

常用的追踪工具

Linux 跟踪工具使用前面描述的事件探针的基础上(tracepoints、USDT、kprobes、uprobes)进行高级性能分析。 Linux 也提供了一系列的动态追踪机制工具,比如:

  • perf:官方的 Linux 分析器。 它非常适合 CPU 分析(堆栈跟踪采样)和 PMC 分析,并且可以检测其他事件,通常记录到输出文件以进行后处理。
  • ftrace:官方的 Linux 追踪器,它是一个由不同的追踪工具组成的多功能工具。 它适用于内核代码路径分析和资源受限的系统,因为它可以在没有依赖关系的情况下使用。
  • BPF(eBPF) :它支持高级跟踪工具,主要是 BCC 和 bpftrace。 BCC 提供了强大的工具,而 bpftrace 提供了用于 custom one-liners and short programs的高级语言。
  • SystemTap:一种高级语言和跟踪器,带有许多用于跟踪不同目标的 Tapsets(库)。是一个允许我们来编写简单的脚本来检查正在运行的Linux系统活动状态的一个工具,可以快速、安全地提取、过滤和总结数据,以实现复杂性能或功能问题的诊断。

相关参考

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值