跳到主要内容

4 篇博文 含有标签「技术解读」

查看所有标签

AIOps实践中常见的挑战:故障根因与可观测性数据的割裂

· 阅读需 8 分钟
Kindling-OriginX
故障根因推理引擎

AIOps实践中常见的挑战:故障根因与可观测性数据的割裂

运维的挑战与责任

在数字化时代,运维团队面临的挑战前所未有。他们不仅要确保系统的高可用性和高性能,还要快速响应并解决故障,以减少对业务的影响。在这种背景下,运维团队急需工具和技术,能够帮助他们提高效率,减轻负担。AIOps(人工智能运维)应运而生,旨在通过应用人工智能和机器学习技术来自动化监控、预测、优化和故障排除过程。

AIOps实践中常见的挑战:故障根因与可观测性数据的割裂

AIOps当前技术与输出

AIOps核心功能包括事件聚合、异常检测、自动化根因分析等。这些技术能够帮助运维团队从海量的监控数据中快速识别问题,预测潜在故障,并自动化常见问题的解决过程。通过AIOps,许多组织已经显著提高了故障响应时间,减少了误报,优化了运维流程,提升了IT系统的整体可靠性和性能。

AIOps仍然存在挑战:故障根因与可观测性数据割裂

尽管AIOps技术取得了显著进步,但在故障根因分析方面仍面临一个重大挑战:故障根因与可观测性数据(如日志、指标、追踪)之间的割裂。AIOps系统虽然能够推荐可能的故障根因,但往往难以直接将这些推荐与具体的可观测性数据紧密关联。这就要求运维人员依靠自己的经验和知识,在海量的数据中寻找证据来验证这些推荐,这一过程既耗时又容易出错。

Gartner 魔力象限中领先象限做到的效果

Dynatrace 效果

Dynatrace 的AI故障推理效果和介绍详情可参见 Dynatrace 官方网站。

AIOps实践中常见的挑战:故障根因与可观测性数据的割裂

从 Dynatrace 的视频中,如果发生了故障之后,AI推荐出AI根因之后,用户仍然需要使用根据 Visual resolution path 去从众多的Trace以及各种可观测性数据中筛选出证据来证明这个AI的推断。

Dynatrace 做到全球最牛的地方,就是能够将各种可观测性数据融为一体,并以时间线为维度还原故障现场,这个本质上还是人为分析,所谓的AI推荐,给出的是关键节点。

如果没有这个故障根因推荐,用户使用 Dynatrace 怎么做呢?仍然是围绕着故障时间点,利用 Dynatrace 的 Visual resolution path 人为分析故障根因。

结论:故障根因的推荐聊胜于无,还是需要人为在可观测性数据中分析找证据。

Datadog 效果

AIOps实践中常见的挑战:故障根因与可观测性数据的割裂

AIOps实践中常见的挑战:故障根因与可观测性数据的割裂

Datadog 的 Watchdog RCA给出仍然是可能性,具体从可观测性中找证据来证明这点,仍然需要用户自己来做。

结论:故障根因的推荐聊胜于无,还是需要人为在可观测性数据中分析找证据。

可观测性盲区的存在导致AIOps的根因结论与可观测性数据存在割裂

AIOps实践中常见的挑战:故障根因与可观测性数据的割裂

举例说明:Dynatrace 的根因例子为节点CPU利用率达到100%,其实绝大多数运维人员都能识别出100% CPU利用率是有问题的。但是如果CPU利用率是50%,这个时候人是很难判断程序是否会受到CPU供给瓶颈,需要额外提供更多的数据去判断CPU利用50%的时候,程序的执行是否会受到调度器的影响,这取决于很多因素,比如机器上需要调度的程序多少,CPU调度器排队的长度等,总而言之,可观测性数据存在盲区。

可观性数据由于存在盲区,导致人都很难根据可观测性数据推理出故障,只能根据事后的结论去关联出CPU利用率50%在某些场景下也是存在可能性导致故障根因的(资深运维人员在判断这两点的时候CPU利用率为50%,是故障根因也是需要非常深厚的经验)。

可观测性数据盲区更详细的介绍,请参考之前的文章。

内核视角持续剖析解决AIOps的故障根因结论与可观测性的割裂问题

在之前的文章介绍了可以使用内核视角下持续剖析,能够形成基于北极星指标的排障体系。可参见:内核视角下持续剖析 VS 代码视角下的持续剖析

AIOps实践中常见的挑战:故障根因与可观测性数据的割裂

基于这个标准化排障体系进行故障根因推导的时候,就能够同时自动化关联相关指标。比如如果发现网络时间很长,这个时候就可以关联网络相关性指标,必要时还可以同步 DeepFlow 等关键网络事件及数据,提供证据证明网络确实有问题。

Trace实践的常见挑战:客户端数据与服务器端时延不一致

· 阅读需 8 分钟
Kindling-OriginX
故障根因推理引擎

Trace实践的常见挑战:客户端数据与服务器端时延不一致

背景

在现代应用开发中,链路追踪技术(Trace)扮演着至关重要的角色。它不仅帮助开发者监控和调试应用程序,还对性能优化提供了极大的支持。然而,在实际操作中,客户端与服务器端的数据时延不一致问题经常出现,这对业务流程和技术实施造成了显著的影响。本文将探讨这一问题的具体表现、根源以及它带来的挑战,并讨论如何有效地解决这些问题。

Trace 技术概述

Trace 技术是一种监控和记录应用程序运行状态的方法,它可以帮助开发者了解程序在特定时间点的行为。通过 Trace,开发者可以获得请求路径、执行时间、关键代码函数执行细节等详细信息,这对于定位问题、监控系统性能以及进行后续的优化至关重要。Trace 技术在多种场景下都有应用,包括但不限于性能监控、故障诊断和系统调试。

Trace深入使用的挑战:客户端与服务器端时间不一致的表现

只要深入使用过Trace的用户,一定会有这样的体验,Trace反映出客户端调用时间很长,但是Server端的执行很短。这会带来以下的问题

1. 归因错误

时间不一致会导致误导性的性能指标,使得开发和运维团队难以准确评估系统的真实性能表现。例如,如果客户端时间显著长于服务器端处理时间,可能错误地将问题归咎于服务器的处理能力,而实际上问题可能出在网络延迟或客户端处理上。

2. 浪费更多的人力成本

准确地定位问题源头变得更加困难。时间不一致可能掩盖了真正的性能瓶颈或错误所在,导致团队花费大量时间在错误的方向上进行调试和优化。

3. 数据准确性和信任度下降

长期的时间不一致问题可能会损害团队对 Trace 数据的信任度。如果分析和报告经常基于不准确的时间数据,团队可能会对使用这些数据做出的决策持怀疑态度,从而影响到决策制定的质量和速度。

造成数据不一致的原因

为了能让Cient调用时间和Server执行时间不一致原因更容易理解,我们先理解下Trace数据是如何来的:Trace数据来源是通过拦截某些函数而获得,Trace数据本质上反映的是函数执行时间。

接下来让我们细化一次RPC函数调用的细节,从而分析可能造成故障的原因:

因为RPC的函数调用被封装成了本地函数调用,有些开发可能都不知道自己调用的函数其实是远程RPC调用,所以他们印象中的程序执行是这样的:client端执行RPC之后,Server端立马响应。

Trace实践的常见挑战:客户端数据与服务器端时延不一致

对网络有一定概念的开发,会认为rpc调用应该包含部分网络时间是如下图所示,server端开始时间比client端开始时间要晚,server端结束时间比client端结束要早。在这部分人的认知当中,一旦时延不一致,那就是网络的问题,但是网络很可能其实没有问题,请读者接着往下看。

Trace实践的常见挑战:客户端数据与服务器端时延不一致

另外如果从client角度来看,调用就是rpc封装的函数,这个函数的实现绝大多数是没有问题的,但是也可能出现以下这种情况:client端出现GC,或者DNS寻址出现问题,也就是问题出现在了认知盲区,不知道client可能会出现问题。

Trace实践的常见挑战:客户端数据与服务器端时延不一致

Server端实际执行过程如下图:

Trace实践的常见挑战:客户端数据与服务器端时延不一致

在一切正常的时候,图中紫色部分消耗的时间是非常少的,基本可以忽略。但是一旦可能出现故障,每个紫色框都可能是个故障原因。

可能原因如下:

  • 内核处理网络连接: 半连接,全连接队列满,导致连接建立很长,通常在大并发流量的场景下出现。

  • Tomcat容器耗尽可用业务线程: server端业务线程耗尽,通常在server端可能在雪崩中受到级联影响。

  • 读网络请求: 如果网络质量出现问题,这段时间也会变长,还有网络带宽被打满的场景也会出现。

  • 写网络请求: 如果网络质量出现问题,这段时间也会变长。还有网络带宽被打满也会出现。因为通常resposne是比较大的,这个时候如果client 与 server端的网络缓存配置不合理,出现网络full窗口或者0窗口也会出现问题。

  • 任何在网络IO之前或者网络IO之后(Trace的拦截点位)可能的耗时操作。

挑战与问题

希望以上的说明帮助大家理解了client 和 server端执行时间不一致的可能根因。要能分析这个client与server端的时延不一致问题,要具备以下条件

  • 深入理解程序执行过程的专家

  • 深入理解网络执行原理

  • 构建了非常丰富的可观测性数据

这些能力的积累可不是短期就能积累起来的,但是Kindling-OriginX 自带专家经验,自动对接Trace、DeepFlow、Prometheus等可观测性数据,在需要看什么指标数据之时,提供故障相关指标帮助用户深入理解故障根因。

内核视角下持续剖析 VS 代码视角下的持续剖析

· 阅读需 15 分钟
Kindling-OriginX
故障根因推理引擎

内核视角下持续剖析 VS 代码视角下的持续剖析

火热的eBPF技术当下在可观测性领域的应用热点有两个主要的方向:

  • 从内核中打开网络黑盒拿到相关的数据
  • 利用eBPF技术实现Continues Profiling

在GitHub上,国内外的 eBPF 主流开源软件是打开网络黑盒提高可观测性,另外一部分就是Continues Profiling,其中Continues Profiling最有名的就是Pyroscope项目,并被Grafana收购。

什么是Continues Profiling?

以下内容来自于GPT4的回答:

持续剖析(Continuous Profiling)是一种软件性能优化技术,旨在实时收集程序运行时的性能数据,如CPU使用率、内存分配、线程锁等待时间等。这些数据通常通过在代码中嵌入剖析器(Profiler)来收集,剖析器能够监测和记录应用程序在执行过程中的各种性能指标。

持续剖析的目标是帮助开发者理解应用程序在生产环境中的实际运行性能,从而发现性能瓶颈和优化机会。与传统的剖析(通常在开发或测试阶段进行)不同,持续剖析强调在应用程序的整个生命周期内,尤其是在生产环境中不断进行性能监控和优化。

持续剖析的好处包括:

  • 实时性能监控:通过持续收集性能数据,开发者可以实时监控应用性能,及时发现和解决问题。
  • 发现隐蔽的性能问题:某些性能问题可能只在特定条件下或在生产环境中出现,持续剖析帮助发现这些难以在测试阶段发现的问题。
  • 优化资源使用:分析性能数据可以帮助开发者优化代码,减少资源浪费,提升应用效率和响应速度。
  • 提升用户体验:通过优化应用性能,可以直接提升最终用户的体验。

持续剖析通过集成到CI/CD流程、自动化工具和监控系统中,成为现代软件开发和运维的重要组成部分。它使得性能优化成为一个持续的过程,而不是一次性的任务,有助于构建更高效、更稳定的软件系统。

最原始的Continues Profiling概念主要停留在CPU代码上的采集,形成火焰图帮助大家理解代码在CPU上是如何运行的。但是这点对于分析清楚线上的性能问题是不够的,因为线上代码是复杂的,程序依赖的条件不仅仅有CPU,还有锁、网络IO、磁盘iO等各种事件, 所以可观测性巨头如Datadog在他们的Continues Profiling理解中已经增加了很多。

代码视角下的持续剖析

Datadog对Continues Profiling的理解,可观测性的终极大杀器

Datadog其官网对Continues Profiling的能力定义:

  • Never miss production issues originating from your code by continuously profiling every line across all hosts and containers.
  • Enable engineers of all levels to swiftly spot and resolve problems using Watchdog AI's insights and suggested fixes.
  • Pinpoint methods and code lines that are inefficient under production load, despite having performed well in pre-production environments.
  • Find the root cause of slow requests by correlating spans with profiling data.
  • Gain thread-level visibility into your requests to investigate parallelization, deadlocks, inefficient garbage collection, locks, and more.
  • Determine exactly what your slow methods are spending time on — CPU, locks, I/O, garbage collection, and more.

从能力角度来看,Datadog的Continues Profiling能力像银弹一样,成为了可观测性的终极方案,无论什么问题,CPU, locks, I/O, garbage collection等各种问题,Datadog的Continues profiling都能够给轻松给出答案。

开源项目对Continues Profiling的理解,像Datadog学习

以Pyroscope为例,最开始的Pyroscope提供了eBPF为内核的OnCPU数据采集和内存相关数据采集能力,主要的分析的能力是CPU、内存分配对象、内存分配空间、在用对象、在用空间、Goroutines等多种类型。

最近去Pyroscope的官方Demo上看,发现其演进思路也基本上往Datadog的方向靠近了,出现了对于lock的持续剖析功能。

内核视角下持续剖析 VS 代码视角下的持续剖析

国内同行业专家也是非常认可Datadog的思路

某公有云可观测性软件发版了其持续剖析的功能,虽然没有实际使用过,从功能列表来看,已经很接近Datadog的能力了。

国内其他的可观测性公司也在致敬Datadog的方法论,提供类似的数据。

Datadog的Continues Profiling核心设计哲学

  • 内核是稳定的

  • 代码是业务开发的,开发者只关心代码要如何修改才能解决问题

  • 火焰图长时间执行的代码块能帮助用户理解问题,并启发用户产生解决思路

  • 正因为Datadog是沿着这个思路设计产品的,其持续剖析功能的实现就是从代码层面上去剖析问题,但是这样的设计哲学有一定局限性。

Datadog代码层面的持续剖析局限性

为了让大家更好的理解问题,举例说明,如果大家看到了这张火焰图能够得出什么结论:

内核视角下持续剖析 VS 代码视角下的持续剖析

从代码层面的持续剖析数据来看,代码是由于记录日志时间很长,那为什么呢?可能有常见的排查思路继续深入排查:

  • 日志由于并行写,产生了锁

  • 磁盘可能出现了问题,导致日志写变慢了

  • 长时间的GC

如果上述的排查思路都没有结果,方向就比较迷茫了。

从内核视角的持续剖析

基于TSA的性能定位问题方法论

有兴趣的朋友可以深入理解大神brendan的文章The TSA Method,或者参阅TSA方法:基于线程时间分布分析性能瓶颈

对于没有耐心的朋友,这里做个快速简介:就是将线程在不同状态下切换过程,按照下图所示对程序执行过程进行分析,从而理解线程在执行程序的时候到底卡在哪个环节。

内核视角下持续剖析 VS 代码视角下的持续剖析

从内核视角的持续剖析有什么优势和劣势

优势

  • 真实反应程序正卡在什么地方

  • 准确与精准没有任何其他可能性

  • 内核反应出来的卡住的问题比代码卡住的问题场景少很多,线程只可能卡在以下几个方面:CPU执行,CPU调度,网络IO,磁盘IO,锁。这个为后续的智能化分析提供很好的基础

劣势

  • 内核视角缺少业务属性,不知道哪个线程在哪个时间段为哪个业务服务,除非在性能压测场景,URL访问单一,可以在线程行为中找到模式匹配业务开始与结束,否则人很难分析

  • 内核系统调用和相关知识对于普通业务开发人员而言太陌生,导致即便看到了内核相关系统调用比如说futex执行时间很长,不能理解这在代码层面上意味着什么

TSA的方法论结合Trace带来不一样的视角

开源项目Kindling的Trace-Profiling解决了单独TSA的持续剖析方法的劣势之一:内核视角缺少业务属性。Trace-Profiling通过TSA的方法论产生的数据与Trace打通,做到了与业务关联,这样在生产环境就可以做到某个业务因为什么原因卡住了。

还是以这个火焰图为例,代码剖析反应程序卡住在了日志代码之上。

内核视角下持续剖析 VS 代码视角下的持续剖析 如果使用Trace-Profiling,应该能够明确给出当时业务是卡住下列事件之一

  • RunQ

  • Futex

  • CPU

  • DISKIO

代表代码执行的线程卡在什么地方知道了,那接下来就是如何理解和翻译了。

开发人员对内核的理解是推广TSA方法论的阻碍

云原生环境内核由于资源竞争带来的问题

绝大多数开发人员在正常业务开发当中较少接触内核,而且也会认为内核是不会产生问题。也许从单机而言,出现任何问题都极少的可能是内核调度产生的。但是一旦涉及到云原生环境,要提高资源利用率的场景,就需要多业务都在竞争对内核的使用,这个时候产生的竞争就超出了普通开发人员的常规认识,也就意味着云原生产生的问题比以往问题更多。

开发者对于内核理解有限

CPU调度产生的RunQ对于绝大多数开发而言太遥远,上述例子可能事件中也就DISKIO是开发人员能够快速理解的,其它都需要花费更多的精力去学习。学习成本带来了推广难度,所以业界几乎没有看到基于TSA方法论的工业化产品在推广。

问题总结

  1. 基于代码的持续剖析虽然对于开发而言足够友好,开发能看懂哪段代码带来的问题,但是由于代码的丰富多样性,看到代码卡住了,很多时候仍然不知道代码为什么卡住,并且现象可能有一定随机性。

  2. 基于TSA内核持续剖析的方法虽然能够精准定位业务卡在了什么内核事件之上,但是对于开发者不友好,不利于推广。

智能运维中的决策树结合TSA实现对内核事件的自动化翻译,完美解决当前持续剖析存在的问题

对于可观测性领域,AIOPS已经推广了很久,但是由于缺少一锤定音的数据特征,从而难以高准确率方式判定故障根因。

基于TSA的线程模型机制给出了程序的精准内核事件,相比于代码或者日志的N种场景,内核事件要精简得多。

举例说明:

一旦线程出现上内核事件RunQ,这说明线程在执行代码的时候,由于内核CPU调度的原因卡住了,这个时候在代码层面上可能在做一些做普通业务操作,比如前文例子觉得记录日志的代码卡住了,在代码层面上也可能是做了个网络操作卡住,从代码层面分析非常复杂,可能性非常多。但是从RunQ事件分析,就非常精准,只有这一个事件特征,不存在其他事件特征。

为了帮助用户理解,这个RunQ的事件就可以翻译成为当前CPU资源不足,应该扩容了,这样开发和运维就能很容易理解。

基于内核事件统计分析,可以形成这样的决策树,最终就能完美定义出故障的根因。

内核视角下持续剖析 VS 代码视角下的持续剖析

故障注入是检验可观测性建设成熟度的有效方法

· 阅读需 10 分钟
Kindling-OriginX
故障根因推理引擎

故障注入是检验可观测性建设成熟度的有效方法

随着云原生、微服务等技术给企业带来竞争力的同时,也使得系统更加的复杂。日趋复杂的系统让故障根因难以排查,导致处理故障的大部分时间都用在了对问题的定位上。能够明确知道系统发生了什么是进行问题定位的前提之一,所以如何对系统进行监控,如何获取到规模庞大的系统的运行状态,也都成为了新的挑战,这种挑战反过来也促进了可观测性领域的发展。

可观测性的目标

故障注入是检验可观测性建设成熟度的有效方法

对于很多成熟企业,很多已经构建了APM、NPM等监控体系,以及Trace、Log分析系统等。而对于一些起步不久的企业,可能还处于可观测性建设的初期阶段。

那么对于不同阶段的企业和技术团队,是否对可观测性的要求有所差异呢?

总体上来说,可观测性代表了当前对系统形成洞察的能力,可观测性成熟度越高,对系统的洞察能力就越深入越完整,即系统的可观测性成熟度越高,就能越迅速、越准确地从发现的问题中找到根本原因。因此无论企业目前处于什么阶段,当前可观测能力的建设水平如何,其对于可观测性能力建设的目标应当都是一致的。

目标具体包括:

  • 更全面的数据采集
  • 更有效的关联各种类型数据
  • 更快速与自动化的确认问题根因

各个企业在观测性建设成熟度上的差异,也主要体现在对这些目标的达成程度的差异。

可观测性成熟度

故障注入是检验可观测性建设成熟度的有效方法

为了能够更好的帮助与指导企业进行可观测性的建设,衡量及评估自身当前可观测性建设水平,有很多机构与公司都发布过对可观测性成熟度模型的定义,本文以龙蜥社区与信通院稳定性保障实验室联合发布的《2023年可观测性成熟度模型白皮书》为例进行说明。该模型是一种用于衡量和评估企业软件系统内部可观测性的框架或方法,同时也是一种用于反馈企业可观测性体系建设成熟度水平的框架或方法。

该模型包含五个级别,分别是:

  • Level 1:监控。确定系统组件是否按预期正常工作。

  • Level 2:基础可观测性。确定系统为什么不工作。

  • Level 3:因果可观测性。找到问题的根本性原因,并确定它的影响面,避免再次发生。

  • Level 4:主动可观测性。自动化的找到问题根本性原因,自动化的响应处置,智能化的预测预防,阻止异常风险发展成为问题故障。

  • Level 5:业务可观测性。确定对业务的影响,如何降低成本、增加业务营收、提升转化率、辅助商业决策。

可观测性建设成熟度越高,团队越能够通过合适的数据自动发现和修复问题,甚至主动识别和预防问题。可以简单理解为越多的故障能够通过可观测性工具发现,甚至主动预防,说明其成熟度越高,如果仍旧有较多问题通过客服侧或其他渠道上报而来发现,那么说明其成熟度还不够。

使用故障注入对可观测性成熟度进行检验

什么是故障注入

混沌工程是一种方法论,而混沌工程的核心就是注入故障。通俗理解,以应用为出发点,在各种环境和条件下,给应用系统注入各种可预测的故障,以此来验证应用在面对各种故障发生的时候,它的服务质量和稳定性等能力。

故障注入是衡量可观测性建设质量的有效标准

在实际生产环境中,对可观测性建设成熟度及质量的最直接的衡量方式就是评估有多少故障是通过可观测性工具发现甚至预防的。

这是一个最直观的标准,如果花了很多精力、物力、人力做了完备的可观测体系建设,但是仍旧有大量的故障没有能够被观测到,甚至仍旧出现P0级别的故障,是没有人能够认同这个体系的建设是成熟的、是高质量的,只是单纯的可观测性数据和工具的堆砌。

而故障注入作为真实故障的模拟,与真实场景最为接近,也最能够有效地评估系统在面对实际故障时的响应和恢复能力,也最能够有效的反映出可观测性体系在实际问题场景中是否能够真实有效的发挥作用,为解决问题提供最切实有效的价值。业内技术领先的公司,也经常采用故障注入演练的方式对自身系统的健壮性进行检验,查漏补缺不断提高可观测性工具对问题发现和预防的比例。

故障注入虽不能涵盖全部的故障问题,但目前主流工具已能将大部分常见的网络、系统、代码、容器问题进行模拟,能够有效帮助组织评估、改进和发展其可观测性能力。Kindling-OriginX 在产品设计与开发过程中也使用这种方式进行能力的检验和产品的迭代。

总结

如果想要对自身可观测能力进行检验,也可与Kindling-OriginX Demo采用类似方式,在目标环境中部署soma-chaos。

soma-chaos 目前已支持的故障类型有:

  • 网络类故障案例。例如丢包率较高、重传率较高、带宽限制打满、DNS故障、TCP建连延时高

  • 存储类故障案例。例如IO延时高

  • CPU类故障案例。代码自身CPU使用率高、共享环境其它进程抢占CPU

  • 内存类故障案例。FULL GC频率很高、共享环境其他进程抢占Memory

  • 代码类故障。代码抛出异常导致错误码返回、HTTP请求返回错误码

soma-chaos 是一个开源模拟故障案例集系统。该项目开源在龙蜥社区系统运维联盟之下,其中包括复旦大学SELab开源的业务模拟系统Train-Ticket、Chaos-Mesh开源云原生混沌工程平台、收集整理的真实故障案例集。欢迎任何单位和个人提交贡献故障案例,一起讨论故障注入实践或在使用过程中产生的任何想法和问题。

参考资料

Train Ticket:A Benchmark Microservice System

gitee-soma

Chaos Mesh

故障注入使用指南