Originx的创新解法之:应用程序故障篇

Originx并不期望做一个完整覆盖全栈的监控体系,而是利用北极星指标体系标准化找出故障方向,然后联动各种成熟的监控数据形成证据链条,并将各种数据融合在一个故障报告之中。更多信息请参考

Log | Metrics | Trace的联动方式探讨icon-default.png?t=N7T8http://mp.weixin.qq.com/s?__biz=Mzk0MTYzMjkwOA==&mid=2247483826&idx=1&sn=4b4a2e10d8f876d136551fb47c12b249&chksm=c2ce3d51f5b9b447d96c3c1d780c991fbea2a6a4d6933a7affcafe92d13b9e0bb3f0bb4d3aa4&scene=21#wechat_redirect

Oringinx智能化实现全栈故障定位

Originx的设计目标是力争实现全栈故障种类的定位,自身的eBPF探针采集北极星排障指标,然后北极星排障指标引导到故障根因,Originx的核心工作原理请参考下方网址,或者扫描下方二维码 

http://u6v.cn/6wIL7w

在已经识别出故障方向之后,利用各种成熟的开源监控作为数据来源,形成完整的证据链条,最终形成用户能够直接使用的故障根因报告。

下面我们将呈现如何利用Originx的功能实现应用程序故障的根因定位。


应用程序故障

代码缺陷导致应用崩溃或错误

○ 案例:2023年双11期间,某汽车在线订单平台的Tomcat服务节点出现了严重的线程池耗尽问题。事发当天上午10点多,随着大促活动的用户流量激增,结算服务的响应时间明显下降。到中午时,大量来自北京地区的用户反馈在提交订单结算时,页面卡顿严重,部分直接超时失败。经过一天的紧张排查,最终发现是Java结算模块存在循环等待的死锁问题。该模块中存在太多的锁粒度,再加上连接池等配置不合理,并发压力下更容易发生死锁。临时解决方案是扩容结算服务的资源,并重启Tomcat释放线程。次日即行修复死锁代码,并持续优化相关模块的并发能力。这次事故虽然只持续了一天,但给用户造成了极差的下订体验

如果出现案例描述中Tomcat服务节点由于代码锁粒度太大出现了严重的线程池耗尽问题, Originx轻松能够帮助用户分析出根因:

Originx的解决之道:

1、在Originx首页,Originx的SLO告警就会针对SLO违约告警

2、同时会分析出可能的故障根因节点,当点击详情之后,每个节点的故障初因列表会被呈现出来

大概率是真实故障原因的疑似故障根因节点效果如下:(因为真正故障点的初因应该是一致的,或者有极少数的初因不一致的情况)

被级联影响的疑似故障根因节点效果如下:(Originx会将Trace数据中突变变化前3的节点当成疑似根因节点,所以被级联影响的节点由于突变较大大概率会被当成疑似节点,而被级联影响的故障根因点大部分初因应该是下游节点耗时长,同时也可能存在因为采用池化调用框架导致出现隐藏锁而得到初因为锁的情况)

Originx下个版本会呈现所有疑似根因的依赖关系,这样就能让人更好的理解谁是根因节点了,大概率是被依赖最深的节点,但是其他节点的根因报告不能完全忽略,最好能够也随机花几秒钟查看下其他根因报告

3、在确认故障根因节点之后,可以从故障根因节点的任意根因报告中查看根因报告详情

4、在故障报告的报告头部呈现的是故障概览,这里关联了TraceId以及发生的时间,如果有必要可以使用TraceId去关联分析Tracing数据

5、在故障报告左边栏中,确认故障传播链路,近似于下图,通过这个数据可以确认在此次报告中故障节点判定是否正确

6、在故障根因中,能够看到根因结论,在多份报告中看到同样的根因报告,这个时候其实可以采取应急手段来恢复业务了,针对本案例的情况:比如重启应用或者扩容,具体的应急策略需要根据公司的政策来确定,有些企业的业务是不能重启的,那就只能扩容,有些企业的资源是有限的,那就只能在对业务影响最小的时候重启

7、在故障报告中,以下的数据都是为了提供证据链条来确认故障报告的准确性 

日志数据,关联了Trace在节点执行(也就是故障概览呈现的故障发生时间)时间段的日志数据

北极星指标(通过北极星指标,Originx给出了异常幅度最大的异常方向,本案例的方向就是Futex也就是锁的方向)

由于北极星指标已经明确了异常方向是锁的方向,所以以下的证据链条会重点分析锁的方向。在JVM实现中,GC也会采用内核Futex机制来实现线程等待,所以当分析Futex异常之时,Originx会先确认此时是否发生了GC,如果有GC发生,就会关联GC相关的数据 

接下来Originx会关联程序锁的相关数据

在锁具体相关信息中,可以看到锁的执行堆栈 

8、总结:通过锁的堆栈分析,可以确认程序出现了长时间的锁,这个时候可以进行patch快速修复,或者回滚代码至之前的版本规避锁的问题,或者扩容来人为提高并发


资源不足(CPU、内存、磁盘) 

○ 案例: 2023年5月12日,一家大型商业银行的新版网上银行系统在上线后不久遭遇了某些业务场景执行超时的错误。由于代码中存在一个未被发现的逻辑错误,导致在特定参数组合场景下,系统会重复执行某项业务逻辑,造成CPU使用率异常飙升。这种情况在测试环境中难以复现,因此未被及时发现。故障发生后,客户在进行转账和查询等操作时遇到了明显的延迟,严重时甚至导致服务不可用。银行紧急协调开发团队进行排查,在生产环境中利用jstack等工具查找CPU飙升的原因,最终在4小时内定位到了问题源头。通过快速发布补丁修复了BUG,并重新部署了服务。此次事件导致银行损失了大量客户交易,并对其声誉造成了一定影响

如果出现案例描述中代码在某些参数特定组合场景下,导致代码会递归执行导致CPU飙高,人为分析是比较困难的,只能等待场景复现才能去故障现场使用jstack等命令分析CPU高的线程在干什么,Originx轻松帮助用户分析出根因:

Originx的解决之道:

1、在Originx首页,Originx的SLO告警就会针对SLO违约告警

2、同时会分析出可能的故障根因节点,当点击详情之后,每个节点的故障初因列表会被呈现出来

3、根据不同节点的初因情况来确认根因节点,在这种案例中根因节点会是以下几种情况:

根因节点的表现形式应该有“初因CPU耗时长”的报告,同时根据容器或者虚拟机的资源规格,如果资源规格较小,CPU资源不足,就会出现很多请求“等待调度CPU耗时长”的初因表现

注意过滤掉其他受影响的级联节点,如果不确定节点是否是被级联影响,可以查看根因报告,稍微花个一分钟确认下

4 、在故障报告的报告头部呈现的是故障概览,这里关联了TraceId以及发生的时间,如果有必要可以使用TraceId去关联分析Tracing数据(具体截图可以参考之前的案例)

5、在故障报告左边栏中,确认故障传播链路,近似于下图,通过这个数据可以确认在此次报告中故障节点判定是否正确(具体截图可以参考之前的案例)

6、在故障根因中,能够看到根因结论,在多份报告中看到同样的根因报告,这个时候其实可以采取应急手段来恢复业务了,针对本案例的情况: 

比如回滚或者扩容,具体的应急策略需要根据公司的政策来确定,有些企业的业务是不能回滚的,那就只能扩容

7、在故障报告中,以下的数据都是为了提供证据链条来确认故障报告的准确性

日志数据这里不再截图和之前案例类似

北极星指标(通过北极星指标,Originx给出了异常幅度最大的异常方向,本截图的方向就是CPU)

北极星指标(通过北极星指标,Originx给出了异常幅度最大的异常方向,本截图方向就是RunQ方向,如果是RunQ方向,Originx会同时查看CPU是否也突变了很大幅度, 如果CPU也突变了很大幅度,那说明RunQ的产生就是由于CPU消耗过高导致线程等待调度所致,如果CPU没有太大突变,说明是由于其它进程抢占CPU导致的调度等待)

如果是RunQ突变较大,还会关联cpu_throuttled相关指标来证明程序存在此问题

在CPU 火焰图中可以看到哪些代码在循环执行


应用配置问题 

○ 案例: 2023年3月15日,一家领先的金融支付服务公司遭遇了支付处理延迟的问题。由于对高峰时段的实例数扩缩容配置人为操作错误,导致在线支付服务的实例数量未能满足既定需求。在随后的高峰交易时段,支付系统出现了严重的延迟,部分交易无法完成,影响了客户的支付体验,并导致公司损失了数百万的潜在交易额。经过紧急扩展服务实例并重新配置负载均衡策略,服务在2小时内逐步恢复。此次事件突显了容量规划在金融服务中的重要性,并促使公司加强了对服务容量和性能监控的投资

如果出现案例描述中实例数配置出错导致不足以应对高峰流量时, Originx轻松能够帮助用户分析出根因:

Originx的解决之道:

1、在Originx首页,Originx的SLO告警就会针对SLO违约告警

2、同时会分析出可能的故障根因节点,当点击详情之后,每个节点的故障初因列表会被呈现出来

3、根据不同节点的初因情况来确认根因节点,在这种案例中根因节点会是以下几种情况:

  • 此种情况并不常见,但是应用如果是CPU密集型的,产生以下这个现象还是非常有可能的。由于实例配置错误,扛不住流量高峰,表现为整个微服务链路上的容量瓶颈节点的出现CPU资源不足的初因,因为每个请求都需要消耗较多的CPU,流量高峰导致其CPU不足,从而产生以下这种根因节点。排查思路和资源不足思路基本类似

  • 接下来讲的情况比较常见,对于绝大多数在线业务而言是IO密集型,所以当实例配置错误,扛不住流量高峰,表现和第一种情况不一致。表现出来是故障根因节点的上游节点出现很多调用下游的故障初因。主要原因是由于非CPU密集型不会消耗很多的CPU,但是其线程数量有限,每个线程都会被消耗在某些网络IO等待上,这里和锁场景又不一样,并不会产生很多代码锁。如果从APM视角来看就是发现客户端执行时间很长,服务端执行时间完全不匹配客户端执行时间的APM经典问题。如果从网络监控来看,能够看出故障节点有问题,但是并不清楚为什么有问题,也不知道该如何应急和复盘。本质的原因是故障节点由于配置错误,导致在流量高峰时所有的业务线程都被耗尽,但是由于Accept线程和IO线程仍然能够读取请求,只是找不到可用线程来处理业务,所以看到的现象是server端网络时间比Trace开始时间早一段时间。在Originx未来规划中,会接入线程满指标,这样结合线程满指标和下游节点耗时长更容易确认故障根因节点

4、 在故障报告的报告头部呈现的是故障概览,这里关联了TraceId以及发生的时间,如果有必要可以使用TraceId去关联分析Tracing数据(具体截图可以参考之前案例)

5、在故障报告左边栏中,确认故障传播链路,近似于下图,通过这个数据可以确认在此次报告中故障节点判定是否正确(具体截图可以参考之前案例)

6、在故障根因中,能够看到根因结论,在多份报告中看到同样的根因报告,这个时候其实可以采取应急手段来恢复业务了,针对此种故障,恢复业务最好的手段就是扩容。这个故障其实还有其他几个可能,就是故障执行了长时间的GC导致线程不能执行,产生同样的现象。如何区分GC和线程慢?就是GC一般不会分布超过一分多钟,如果同样故障根因的故障报告分布在不同的时间段,那就明确了故障就是线程满

7、在故障报告中,以下的数据都是为了提供证据链条来确认故障报告的准确性

北极星指标(通过北极星指标,Originx给出了异常幅度最大的异常方向,本截图的方向就是网络)

然后列出来所有的对外网络调用,这个网络调用是从内核层获取,可能会比APM看到的数据要多 

针对最长的网络层面耗时,会对耗时进行分析,判断网络到底消耗在哪个网卡,我们可以看到标红的时间段说明了这段时间就是由于没有业务线程处理业务请求导致请求被io读取之后,而产生的额外时延

为了进一步证实不是由于网络导致的故障,会关联网络重传和丢包指标以证明网络没有问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/13376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iPhone携手ChatGPT?苹果OpenAI或将强强联手

近年来,人工智能技术的蓬勃发展掀起了一场席卷全球的科技浪潮,而智能手机作为人们日常生活中不可或缺的一部分,自然成为了这场AI竞赛的重要战场。各大科技巨头纷纷加码布局,力图在AI领域占据领先地位。 近日,据知情人士…

智慧城市新篇章:城市街道治理视频系统建设的探索与实践

一、背景分析 随着城市化进程的加快和社会治安形势的日趋复杂,街道治安管理面临着前所未有的挑战。对于街道治安的管理,面临着街道上机动车、非机动车违停、游商摊贩、垃圾堆积、人员监管等问题,既影响市容市貌,又有安全隐患。传…

Springboot+Shiro实现登录

Shiro的简单介绍 Shiro是Java的一个安全框架,旨在简化身份验证和授权。Shiro在JavaSE和JavaEE项目中都可以使用。它主要用来处理身份认证,授权,企业会话管理和加密等。 shiro由三部分组成: 1、Subject:当前操作的用…

自定义类似vite的命令行

一、第一步 随便新建一个文件夹,终端执行npm init,生成如图的结构 其中name就是命令行的名字 二、第二步 新建一个js文件,在其顶部加入这串代码#!/usr/bin/env node,#!就是告诉系统这个是可执行脚本,/usr/bin/env就是系统环境变量&#x…

Spring-Cloud 微服务

1. 微服务架构 1.1 单体应用架构---内部项目【OA WMS等】 将项目所有模块(功能)打成jar或者war,然后部署一个进程 优点: 1:部署简单:由于是完整的结构体,可以直接部署在一个服务器上即可。 2:技术单一:项目不需要复杂的技术栈,往往一套熟悉的…

争议PCDN:限速、局停为哪般?

最近,在国内通信人聚集的有个话题特别火,那就是部分运营商给家庭宽带接入用户进行上行限速,甚至还会出现局停的极端现象,引起了不小争议。 “每个月按时交宽带费,运营商凭啥给我限速?”这是很多网友的疑问…

记PLSQL链接Oracle数据库

一、环境 Windows环境安装plsql工具 Oracle部署在服务器上面。 由于我之前在本地Windows安装了一个Oracle数据库,结果导致之前已经在连接的PLSQL链接不上。 二、操作 PLSQL工具正常安装,主要就是一些Oracle的一些配置,和oracle客户端。 o…

HashTable, HashMap, ConcurrentHashMap 三者区别

目录 1. HashMap 2. HashTable 3. ConcurrentHashMap 1. HashMap HashMap 是 Java 中非常常用的一个数据结构,它主要用于存储 键值对(K,V)。 在JDK 1.7中,HashMap的实现是基于 Table数组 和 Entry链表 的组合。 从…

在 pyGTK 中使用 visibility_notify 事件

问题背景 在 Windows 系统中开发 pygtk 应用程序时,需要知道何时一个窗口被另一个窗口遮挡或显示,以便停止繁重的绘图进程。为此,可以使用 visibility_notify_event 信号来获取窗口可见性状态的改变。 解决方案 可以使用 visibility_notif…

【Linux】缓冲区

目录 一、初识缓冲区 二、用户级缓冲区 三、内核级缓冲区 四、内核级缓冲区 VS 用户级缓冲区 五、用户级缓冲区在哪里? 一、初识缓冲区 缓冲区是什么?可以简单理解成一部分内存。例如用户缓冲区(char arr[])、C标准库提供的缓冲区、操作系统提供的缓…

【算法】网络图中的dfs

快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、单词搜索二、黄金矿工三、不同路径 |||四、图像渲染五、岛屿数量六、岛屿的最大面积七、被围绕的区域…

三磷酸腺苷(ATP)制备方法众多 主要应用于生化研究以及医药领域

三磷酸腺苷(ATP)制备方法众多 主要应用于生化研究以及医药领域 三磷酸腺苷(ATP)又称腺嘌呤核苷三磷酸、腺苷三磷酸,化学式为C10H16N5O13P3,是一种高能磷酸化合物。腺苷三磷酸外观呈白色粉末,无特…

2025秋招Java还是c++?

一、我的编程经 说说我的编程经历,在C和Java之间我经历了几个阶段: 大学期间,我浅尝辄止地学习了一段时间的Java,但后来放弃了,开始学习C/C。本科毕业后,我选择攻读硕士学位,并一直专注于C的学…

集成了Gemini的Android Studio,如虎添翼

今天将Android Studio升级到最新版(Jellyfish)。发现在new features中有一条: Code suggestions with Gemini in Android Studio 打开路径为: View > Tool Windows > Gemini 支持多国语言,英文、中文都能正确理解…

PPT为何无法复制粘贴?附解决办法!

PPT文件里的内容无法复制,或者复制后无法粘贴,这是怎么回事呢? 这种情况,一般是因为PPT被设置了保护,设置了以“只读方式”打开,就无法进行复制粘贴了。PPT的“只读方式”不同,解决方法也不同&…

Java入门基础学习笔记25——死循环和循环嵌套

死循环: 可以一直执行下去的一种循环,如果没有干预不会停下来。 死循环的写法: 例: package cn.ensource.loop;public class EndLessLoopDemo5 {public static void main(String[] args) {// 目标;掌握死循环的写法w…

力扣127.单词接龙讲解

距离上一次刷题已经过去了.........嗯............我数一一下............整整十天,今天再来解一道算法题 由于这段时间准备简历,没咋写博客。。今天回来了!!!!!!!&…

【React】如何让函数式组件也能使用state——useState(Hooks)

React的函数式组件不同于类式组件,函数式组件没有自己的 this,看似没有操作state的能力 但是React官方提供了一个Hooks叫useState,它解决了函数式组件和类式组件的差异,让函数式组件拥有了类式组件所拥有的 state ,同时…

在win10折腾Flowise:部署和尝试

Flowise 是一种低代码/无代码拖放工具,旨在让人们轻松可视化和构建 LLM 应用程序。 本地部署 操作系统: win10 由于网络、操作系统等各种未知问题,使用npm install -g flowise的方式,尝试了很多次,都没有部署成功&am…

Visual C++界面开发组件Xtreme Toolkit Pro v24测试版发布——完全支持SVG

Codejock软件公司的Xtreme Toolkit Pro是屡获殊荣的VC界面库,是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的Visual C MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Repo…