跳到主要内容

Kindling-OriginX工作原理

· 阅读需 9 分钟

传统可观测性产品在落地过程中的局限性

很多公司已经落地了 Tracing、Metrics、Logging,但是在实际使用中效果不如预期主要由以下几个原因:

  • Tracing、Metrics、Logging 数据之间归属于不同产品,排查问题之时需要再不同产品之间跳转,对于问题排查效率影响较大。
  • Tracing、Metrics 对于开发和运维而言不熟悉,不会使用,对指标代表的技术含义理解不深入,最终排障都是依赖于专家牛人的个人经验。可观测性系统推广之后,业务团队使用起来效果差强人意。
  • 专家排障的时候也受限于已有经验,缺乏标准化流程,在不断猜测验证过程中,容易丢失掉 1-5-10 的目标。
  • 耗费人力和物力资源建设了一系列的可观测性项目,但是最终仍然很难落地1分钟识别故障、5分钟识别故障初因、10分钟回复业务。

什么是 eBPF 技术

eBPF(extended Berkeley Packet Filter)是一种先进的系统内核技术,最初源自于 Berkeley Packet Filter(BPF)。它是一种在 Linux 内核中执行高度优化的程序的框架,允许用户编写并插入小型程序(称为 eBPF 程序)来对系统内核的行为进行扩展和控制。 eBPF 允许用户在不更改内核源代码或重新编译的情况下,通过加载在内核中运行的小型程序来扩展内核功能。这些程序可以捕获和分析系统运行时的事件、执行网络分析、实现安全策略、执行性能调优等操作。 eBPF 的一些关键特性和优势包括:

  • 安全性:eBPF 程序在一个受限的虚拟机中运行,不会影响系统稳定性和安全性。
  • 灵活性:可以动态加载、卸载和更新eBPF程序,无需重新启动系统。
  • 性能:eBPF 程序经过优化,能够在内核中高效执行。
  • 可观察性:能够捕获和分析系统运行时的各种事件,有助于故障排除和性能分析。

eBPF 技术在多个领域得到应用,包括网络编程(例如网络包过滤、路由)、性能分析、安全监控、容器技术等。它已经成为许多现代系统中实现高级功能和控制的重要工具之一。

什么是 TraceProfiling 技术

用户开发的代码都是以线程形式运行在操作系统之上,即便Go语言有协程的概念,go协程在执行过程中仍然绑定在操作系统内核线程上执行。操作系统内核线程的完整运行周期如下图所示。

image.png

利用 eBPF 技术能够深入内核,拦截线程执行用户代码的关键点位获取信息,在获得线程执行关键信息之后能够还原线程的执行过程。 如果只从线程维度看程序执行过程是很难分析出故障的,因为开发和运维的谈的故障都是URL维度的用户请求调用,所以光有线程维度程序执行过程是不够的,需要和 Tracing 系统关联。 当线程执行过程与 Tracing 系统关联之后,即可完整还原用户一次请求的执行过程。 TraceProfiling中关联了可观测性所需要的数据:

  • 指标
  • 日志

北极星排障指标体系(龙蜥社区与 Kindling 社区联合发布了北极星排障指标体系)

通过分析 TraceProfiling 数据,能够得到一次请求在Span中执行具体花了多少时间在CPU、网络、存储、等待。将 TraceProfiling 数据进行聚合可以得到北极星排障指标体系,从而指导标准化的排障过程。 image.png

指标说明

北极星排障指标-CPU时间

程序在CPU资源上所消耗的时间

  • OnCPU

程序代码执行所消耗的CPU cycles,可以通过程序火焰图确认代码在 CPU上执行消耗的时间与代码堆栈.

  • Runqueue

线程的状态是Ready,如果CPU资源是充分,线程应该被调度到 CPU上执行,但是由于各种原因,线程并未调度到CPU执行,从而产生的等待 时间。

北极星排障指标-网络时间

网络时间属于两次OnCPU时间之间的OffCPU时间

  • 网络时间打标过程

第一次OnCPU最后一个系统调用执行为sock write与第二次 OnCPU第一个系统调用为sock read,也可以理解为网络包出网卡至网络包从网卡收回的 时间。

  • 网络时间分类

DNS,TCP建连,常规网络调用

北极星排障指标-存储时间

属于两次OnCPU时间之间的OffCPU时间

  • 存储时间打标过程

第一次OnCPU最后一个系统调用执行为VFS read/write与第二次 OnCPU第一个系统调用为VFS read/wirte。

  • 存储时间真实情况

存储真实执行情况,由于内核的pagecache存在,所以绝大多数VFS read/write从程序视 角看:执行时间不超过1毫秒。

北极星排障指标-等待时间

  • futex

通常指的是一个线程在尝试获取一个futex锁时因为锁已经被其他线程占用而进入等待状态的时间。在这段时间内,线程不会执行任何操作,它会被内核挂起。

  • mutex_lock

线程在尝试获取互斥锁时,因为锁已经被其他线程持有而进入等待状态的时间长度。这段时间对于程序的性能至关重要,因为在等待期间,线程不能执行任何有用的工作。

Kindling-OriginX 的故障根因推导

依据标准北极星排障指标体系,Kindling-OriginX 能够自动化推导出故障根因,从根本上解释一次请求慢的根源是在于CPU、网络、磁盘中的具体哪一部分。 Kindling-OriginX 不仅仅给出依据北极星排障指体系的故障根因,还将整个故障根因的推导过程呈现出来,帮助用户更好的理解系统运行的过程。 Kindling-OriginX 为了能够让结论更有可解释性,Kindling-Originx通过与Skywalking,deepflow, prometheus等数据对接获得更多的指标,并依赖专家经验自动化组织和关联分散的监控指标与日志,用户在一个界面就可以将所需要的指标与日志收集齐全,并确认故障根因是否推导合理。

更多信息参考

KubeCon 2023 中国 :Trace-Profiling: A New Way About How to Track Application Behavior - Cheng Chang

KCD 杭州 :基于 eBPF 采集的排障北极星指标构建故障根因推导流程