什么是 Trace Profiling
Skywalking 和 Kindling-OriginX 都对Trace Profiling做了定义,两者想要实现的目标是一致的,都是想看清楚Trace在某个环节到底是如何执行的,只是工作在不同层次,能够反应不同的问题。
Skywalking 的 Trace Profiling 工作原理是在代码层次上,看出每个线程周期性时间节点在代码上干什么 ,同时与Trace关联。
Kindling-OriginX 的 Trace Profiling 工作原理是在内核层次上,看出每个线程从资源上在干什么(在CPU上执行,网络等待、IO操作等),同时与Trace关联。
Trace Profiling 目标
在现代软件系统架构中,性能不仅仅是一个指标,它直接关系到用户体验和系统的可靠性。技术团队经常需要回答这样的问题:应用为什么这么慢?为什么会在这个时间点出现延迟?出现故障的原因到底是什么?故障时刻到底发生了什么?而Trace Profiling 就是一种可帮助我们找到这些问题答案的性能分析方法之一。
Trace Profiling 是一种详尽的性能分析方法,它通过记录软件运行时的具体事件来创建一个执行的时间线。这些事件可以包括函数调用、线程切换、I/O操作等。与传统的Sampling Profiling相比,Trace Profiling 提供了更细粒度的数据,使开发者能够精确地看到程序在任何给定时间点正在做什么。
Skywalking:Trace Profiling的工作原理
当你启用Trace Profiling时,分析器会跟踪程序的所有或特定部分的执行细节。通常,这涉及到插入额外的监控代码或使用特定的监控工具来捕获事件和时间戳。一旦数据被捕获,它就可以被用来生成报告,这些报告描绘了程序的行为,揭示了性能瓶颈和潜在的问题区域。更多信息可以参考 Trace Profiling - Skywalking
Kindling-OriginX:Trace Profiling的工作原理
用户开发的代码都是以线程形式运行在操作系统之上,即便Go语言有协程的概念,go协程在执行过程中仍然绑定在操作系统内核线程上执行。操作系统内核线程的完整运行周期如下图所示。
利用eBPF技术能够深入内核,拦截线程执行用户代码的关键点位获取信息,在获得线程执行关键信息之后能够还原线程的执行过程。
如果只从线程维度看程序执行过程是很难分析出故障的,因为开发和运维的谈的故障都是URL维度的用户请求调用,所以光有线程维度程序执行过程是不够的,需要和tracing系统关联。
当线程执行过程与tracing系统关联之后,即可完整还原用户一次请求的执行过程。
Trace Profiling中关联了可观测性所需要的数据:
- 指标
- 日志
Kindling-OriginX : Trace Profiling能够实现的效果
Kindling-OriginX 的Trace Profiling工作在内核中,所以能够反应程序的所有执行情况,比如程序执行过程当中,出现了CPU时间片用完,排队等待调度都可以被Kindling Trace Profiling所发现,这些数据从代码层面是获取不到的。
- 所有线程的执行情况都被记录下来,并可以被重放。
- 执行跟踪跨度的确切线程被突出显示。
- 每个线程打印的日志被收集并与相应线程的时间戳相关联。
- 代码执行火焰图与 CPU 繁忙时间序列相关联。
- 与网络系统调用执行相关的网络相关指标与时间序列相关联。
- 与文件系统调用执行相关的文件相关指标与时间序列相关联。
正是因为Trace Profiling完整的记录了请求是如何被执行的,所以可以被用来构建排障北极星指标,用以标准化排障。
参考资料:
Trace profiling: Scalable event tracing on high-end parallel systems