您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Java微服务随机掉线排查思路解析

时间:2023-02-03 14:36:26  来源:今日头条  作者:Java灵风

背景

 

  • 我们的业务共使用11台(阿里云)服务器,使用SpringcloudAlibaba构建微服务集群,共计60个微服务全部注册在同一个Nacos集群
  • 流量转发路径:Nginxspring-gateway业务微服务
  • 使用的版本如下:
    spring-boot.version:2.2.5.RELEASE
    spring-cloud.version:Hoxton.SR3
    spring-cloud-alibaba.version:2.2.1.RELEASE
    JAVA.version:1.8
案发
  • 春节放假期间,收到反馈,网页报错服务未找到(gateway找不到服务的报错提示).
  • 查看nacos集群列表,发现个别服务丢失(下线).
  • 这个问题每几天出现一次,出现时间不固定,每次掉线的服务像是随机选的几个.
  • 服务手动kill+restart后能稳定运行2-3天
排查和解决怀疑对象一:服务器内存爆了

 

1.进阿里云控制台查看故障机器近期的各项指标,但是发现故障机器的指标有重要的几项丢失,内存使用率,CPU使用率,系统负载均不显示


 


2.控制台看不了只好进服务器内查看各指标
free -m 查看内存,无异常
3.提交阿里工单,授权阿里工程师帮忙修复控制台显示问题,怀疑这个问题对业务有影响


 


4.控制台修复后掉线问题依然存在

怀疑对象二:CPU满载

能感觉到执行命令很流畅,所以感觉不是这个原因, top查看后很正常

怀疑对象三:磁盘满了

虽然概率很小,但是看一下,du -sh *发现磁盘容量还能用到公司倒闭

怀疑对象四:网络有问题

  1. 服务器那三个基本故障暂时排除后,最大怀疑对象就是网络,毕竟服务掉线肯定是服务端一段时间内接收不到客户端心跳包,所以把客户端踢下线了.
  2. 通过te.NET,mtr -n *.*.*.*,netstat -nat |grep "TIME_WAIT" | wc -l这些命令也只能看个大概.
  3. echo "1" > /proc/sys/net/ipv4/tcp_tw_reuse修改内核参数,开启TIME_WAIT socket复用能力,提升实例的网络发送请求性能.
  4. 查看nacos客户端(微服务)的日志,在前面案发里提到没有日志记录
怀疑对象五:Nacos集群服务端故障
  1. 查看nacos集群部署的那几台服务器,查看服务器基础指标(内存,cpu,磁盘等),未发现异常(毕竟还有几十个微服务都很正常工作)
  2. 查看nacos服务端日志,发现确实有主动下线服务操作,那就奇怪了,这个机器上的有些服务还在正常工作,为什么会随机下线几个服务呢?
怀疑对象六:微服务占用资源太多
后来仔细想想,这个怀疑对象是不是有点离谱了?因为部署脚本都是同一个,而且负载均衡也是一样的,但其他机器的这个服务都好好的.

 

1.调大每个微服务的内存占用

2.添加堆栈打印


 

3.等待一段时间后,异常依然存在,并且,没有堆栈打印???因为进程好好的并没退出!

4.google搜索nacos服务掉线,找到一篇看起来极其靠谱的文章!


 

5.上文提到我使用的springcloud版本,恰好这个版本的nacos-client版本就是1.4.1,于是立马测试升级


 

6.观察几天后,发现问题依旧,只能将探查方向继续转回微服务本身.

7.使用arthas进行勘测各项指标,发现所有正常的服务各指标均正常.

8.想到服务掉线大概率是因为心跳包丢失,怀疑是心跳线程因为某些原因被杀死了.

9.翻看nacos-client源码,找到心跳函数(nacos2.x不是这个),使用arthas监听心跳包,尝试能找到心跳丢失的证据,贴上当时的记录


 


 


 

10.当异常再次发生......arthas监听卡死,无任何记录和响应........

11.无奈更换思路,写一个监听服务掉线的程序,期望可以在工作时间内及时获取到异常


 

12.终于在工作时间捕获到异常,第一时间进入服务器内查看情况,


 

13.确认服务器基础项没问题后,使用arthas查看服务进程堆栈情况,但是arthas无法进入进程!!!


 

14.用jstat查看GC情况,显示很正常


 

15.用jmap/jstack输出堆栈jstack -l 25944 >heap.txt,但是提示无法进入进程,无奈使用添加-F(这个参数的堆栈少了很多信息),jstack -F -l 25944 >heap.txt

16.查看堆栈文件,上万行记录,眼都看花了,但是没有死锁也没有发现异常

17.此时发现监听程序提示服务上线了???!!!检查后发现确实掉线的几个微服务自动恢复了,心想这就难排查了.

18.尝试复现BUG,此时离第一次案发已经过去一周多,必须尽快处理好这个BUG,否则可能得被迫离职了...

19.当第二次发生异常的时候,使用同样的方式,arthas无法进入->...->jstack输出堆栈,奇迹发生了,服务又恢复正常了

20.思考/猜测:因为jvm死了(假死),所以导致进程中的一切内容,包括心跳线程,日志等,都hold住.

20.Google搜索关键词jvm停止(假死)排查,终于找到一个极其靠谱的回答


 

21.连忙查看对比使用的几个机器内核版本号uname -r


 


 

22.那个低版本的就是故障机器,确认相关信息后,联系阿里云提交工单


 

23.升级完内核并重启后机器后,观察两天至今,这个问题不存在了,谁能想到这个问题居然是因为linux内核的BUG引起的,不得不佩服第一个发现这个BUG的大佬


 

完结感言

这个问题折磨了一周多,每日如鲠在喉!调试过程也是苦乐参半,乐的是突然有了调试思路,苦的是思路是一条死胡同,还好最终结果是满意的.
作为一名程序员,还是要时刻保持一颗探索的心,学海无涯!



Tags:微服务   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  Search: 微服务  点击:(5)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  Search: 微服务  点击:(120)  评论:(0)  加入收藏
九条微服务最佳实践,你学会了哪条?
微服务之间连贯一致的代码库对于可维护性至关重要。保持代码成熟度相似,可确保系统统一演进,防止服务间出现性能、安全性和功能差异。在开发微服务时,我们需要遵循哪些最佳实践...【详细内容】
2024-01-05  Search: 微服务  点击:(102)  评论:(0)  加入收藏
Go微服务入门到容器化实践
Go微服务入门到容器化实践Go 是一门高效、现代化、快速增长的编程语言,非常适合构建 Web 应用程序。而 Docker 是一种轻量级的容器化技术,能够使得您的应用程序在任何地方运行...【详细内容】
2024-01-01  Search: 微服务  点击:(69)  评论:(0)  加入收藏
微服务全做错了!谷歌提出新方法,成本直接降为1/9!
2023,微服务“水逆”之年。长期以来,不管大厂还是小厂,微服务都被认为是云原生服务应用程序架构的事实标准,然而2023,不止那位37signals的DHH决心下云,放弃微服务,就连亚马逊和谷歌...【详细内容】
2023-12-29  Search: 微服务  点击:(124)  评论:(0)  加入收藏
微服务架构中的数据一致性
在微服务中,一个逻辑上原子操作可以经常跨越多个微服务。即使是单片系统也可能使用多个数据库或消息传递解决方案。使用多个独立的数据存储解决方案,如果其中一个分布式流程参...【详细内容】
2023-12-27  Search: 微服务  点击:(147)  评论:(0)  加入收藏
监控 Spring Cloud 微服务的实践方案
一、简介Spring Cloud是一个基于Spring Boot实现的微服务框架,它提供了丰富的微服务功能,如分布式配置、服务注册与发现、服务熔断、负载均衡等。为了更好地管理和监控这样复...【详细内容】
2023-12-19  Search: 微服务  点击:(150)  评论:(0)  加入收藏
聊聊微服务链路服务
微服务架构图片如果有用户反馈某个页面很慢,我们知道这个页面的请求调用链是 A -----> C -----> B -----> D(图片有误),怎么来定位是由哪个服务引起的问题呢? 更进一步,如果...【详细内容】
2023-12-15  Search: 微服务  点击:(129)  评论:(0)  加入收藏
选择适合微服务的编程语言,让你的工作事半功倍!
讨论编程语言就像是一场政治辩论。每个开发者都会过分捍卫他/她所使用的编程语言。然而,编程语言应该被看作是它们真正是的东西,即一种工作工具。每种编程语言都有特定的目的...【详细内容】
2023-12-14  Search: 微服务  点击:(179)  评论:(0)  加入收藏
Eureka: 微服务架构中不可或缺的服务治理工具
Eureka是Netflix开源的一款用于服务治理的工具,它是NetflixOSS(OpenSourceSoftware)项目的一部分,主要用于实现微服务架构中的服务注册与发现。在当今庞大而复杂的微服务系统中,E...【详细内容】
2023-12-14  Search: 微服务  点击:(198)  评论:(0)  加入收藏
▌简易百科推荐
Qt与Flutter:在跨平台UI框架中哪个更受欢迎?
在跨平台UI框架领域,Qt和Flutter是两个备受瞩目的选择。它们各自具有独特的优势,也各自有着广泛的应用场景。本文将对Qt和Flutter进行详细的比较,以探讨在跨平台UI框架中哪个更...【详细内容】
2024-04-12  刘长伟    Tags:UI框架   点击:(6)  评论:(0)  加入收藏
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(8)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(22)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(59)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(50)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(40)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(53)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(71)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(91)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(88)  评论:(0)  加入收藏
站内最新
站内热门
站内头条