- Published on
动态追踪技术
- Authors
- Name
- Foolgry
- @foolgryw
简介
动态追踪技术是一种高级高级调试技术。
一般基于操作系统内核实现,可以查询系统运行时的信息。
相当于把运行时的系统当作一个数据库,去查询这个系统的运行时状态,内存中的变量,堆栈,代码等等信息。
掌握了这门技术,对于排查紧急问题,疑难问题,做性能优化等等很有用处。
通用工具
Dtrace
Dtrace 是一种通用的调试工具,基于操作系统层面,不限制编程语言。由 sun 公司的工程师开发的。
适用于 Solaris,MacOS,FreeBSD 操作系统。 为什么不支持 liunx 系统呢,这又是历史原因了,感兴趣可以去搜索下。 Dtrace 使用 D 语言作为脚本语言。
关于如何使用,可以去找文章活着视频看,这里列出 Dtrace 的官方文档,中文版本的。 https://docs.oracle.com/cd/E24847_01/html/E22192/gcfbn.html
背景是这样的: Solaris 操作系统的几个工程师花了几天几夜去排查一个看似非常诡异的线上问题,开始他们以为是很高级的问题,就特别卖力,结果折腾了几天,最后发现其实是一个非常愚蠢的、某个不起眼的地方的配置问题。自从那件事情之后,这些工程师就痛定思痛,创造了 DTrace 这样一个非常高级的调试工具,来帮助他们在未来的工作当中避免把过多精力花费在愚蠢问题上面。毕竟大部分所谓的“诡异问题”其实都是低级问题,属于那种“调不出来很郁闷,调出来了更郁闷”的类型。
SystemTap
SystemTap provides free software (GPL) infrastructure to simplify the gathering of information about the running Linux system. This assists diagnosis of a performance or functional problem. SystemTap eliminates the need for the developer to go through the tedious and disruptive instrument, recompile, install, and reboot sequence that may be otherwise required to collect data.
上面一句是官方网站的简介,简单说明了 Systemtap 是干啥的。
翻译一下:
SystemTap 提供免费软件 (GPL) 基础设施来 简化有关正在运行的 Linux 的信息收集系统。这有助于诊断性能或功能问题。SystemTap 消除了开发人员去通过繁琐和破坏性的工具,重新编译,安装,和重新启动顺序,否则可能需要收集数据。
和 Dtrace 差不多同样的功能,但是不同的是 SystemTap 支持 linux 操作系统。
官方文档: https://sourceware.org/systemtap/tutorial/
eBPF
Linux内核一直是实现监视/可观察性,网络和安全性的理想场所。不幸的是,这通常是不切实际的,因为它需要更改内核源代码或加载内核模块,并导致彼此堆叠的抽象层。 eBPF是一项革命性的技术,可以在Linux内核中运行沙盒程序,而无需更改内核源代码或加载内核模块。通过使Linux内核可编程,基础架构软件可以利用现有的层,从而使它们更加智能和功能丰富,而无需继续为系统增加额外的复杂性层。
eBPF导致了网络,安全性,应用程序配置/跟踪和性能故障排除等领域的新一代工具的开发,这些工具不再依赖现有的内核功能,而是在不影响执行效率或安全性的情况下主动重新编程运行时行为。
eBPF 是近几年非常流行的技术,基于eBPF的工具层出不穷。
想了解的可以看看这个网站或查找其他资料。
https://ebpf.io/
Java 领域的追踪工具
因为目前的工作主要是在Java领域,所以单独把这块提出来说一下,上面的只是局限于简单了解,并没有实际的去使用,Java领域的 Arthas 是有一些使用经验的,所以单独列出来,后面应该还会单独写Arthas的文章
Arthas
简介
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
背景
通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂停。
开发人员可以尝试在测试环境或者预发环境中复现生产环境中的问题。但是,某些问题无法在不同的环境中轻松复现,甚至在重新启动后就消失了。
如果您正在考虑在代码中添加一些日志以帮助解决问题,您将必须经历以下阶段:测试、预发,然后生产。这种方法效率低下,更糟糕的是,该问题可能无法解决,因为一旦 JVM 重新启动,它可能无法复现,如上文所述。
Arthas 旨在解决这些问题。开发人员可以在线解决生产问题。无需 JVM 重启,无需代码更改。 Arthas 作为观察者永远不会暂停正在运行的线程。