背景

  • 我们的业务共使用11台(阿里云)服务器,使用SpringcloudAlibaba构建微服务集群,共计60个微服务,全部注册在同一个Nacos集群
  • 流量转发路径: nginx->spring-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. 通过telnet,mtr -n *.*.*.*,netstat -nat |grep "TIME_WAIT" | wc -l这些命令也只能看个大概.
  3. echo "1" > /proc/sys/net/ipv4/tcp_tw_reuse修改内核参数,开启TIME_WAIT socket复用能力,提升实例的网络发送请求性能.
  4. 查看nacos客户端(微服务)的日志,在前面案发里提到没有日志记录
  5. 查看nacos服务端日志,发现确实有主动下线服务操作,那就奇怪了,这个机器上的有些服务还在正常工作,为什么会随机下线几个服务呢?
怀疑对象五:Nacos集群服务端故障

查看nacos集群部署的那几台服务器,查看服务器基础指标(内存,cpu,磁盘等),未发现异常(毕竟还有几十个微服务都很正常工作)

怀疑对象六:微服务占用资源太多

后来仔细想想,这个怀疑对象是不是有点离谱了?因为部署脚本都是同一个,而且负载均衡也是一样的,但其他机器的这个服务都好好的.

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

2.添加堆栈打印

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

  1. 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一番,终于找到一个极其靠谱的回答

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



22.看到了吧,那个低版本的就是故障机器

23.联系阿里云提交工单

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

完结感言

这个问题折磨了一周多,每日如鲠在喉!调试过程也是苦乐参半,乐的是突然有了调试思路,苦的是思路是一条死胡同,还好最终结果是满意的.

作为一名程序员,还是要时刻保持一颗探索的心,学海无涯!

2023-02-03 记于深圳

Java微服务随机掉线排查思路的更多相关文章

  1. Java微服务(二):负载均衡、序列化、熔断

    本文接着上一篇写的<Java微服务(二):服务消费者与提供者搭建>,上一篇文章主要讲述了消费者与服务者的搭建与简单的实现.其中重点需要注意配置文件中的几个坑. 本章节介绍一些零散的内容:服 ...

  2. 多云架构下,JAVA微服务技术选型实例解析

    [摘要] 本文介绍了基于开源自建和适配云厂商开发框架两种构建多云架构的思路,以及这些思路的优缺点. 微服务生态 微服务生态本质上是一种微服务架构模式的实现,包括微服务开发SDK,以及微服务基础设施. ...

  3. 从成本角度看Java微服务

    近年来,微服务因其良好的灵活性和伸缩性等特点备受追捧,很多公司开始采用微服务架构或将已有的单体系统改造成微服务.IBM也于近日开源了轻量级Java微服务应用服务器 Open Liberty .但是采用 ...

  4. Java微服务对UTC时间格式的处理

    一.背景 先说一下为什么要使用UTC时间.开发一个全球化的系统,服务端(Java微服务)集中部署在同一个地方,用户在全球通过浏览器.手机客户端访问.不同地区的时区是不一样的,同一个时间戳,不同的用户看 ...

  5. Java微服务框架一览

    引言:本文首先简单介绍了微服务的概念以及使用微服务所能带来的优势,然后结合实例介绍了几个常见的Java微服务框架. 微服务在开发领域的应用越来越广泛,因为开发人员致力于创建更大.更复杂的应用程序,而这 ...

  6. Java微服务(二):服务消费者与提供者搭建

    本文接着上一篇写的<Java微服务(一):dubbo-admin控制台的使用>,上篇文章介绍了docker,zookeeper环境的安装,并参考dubbo官网演示了dubbo-admin控 ...

  7. 现如今,最热门的13个Java微服务框架

    曾经的 服务器领域 有许多不同的芯片架构???有哪些芯片架构???和操作系统???,经过长期发展,Java的“一次编译,到处运行”使得它在服务器领域找到一席之地,成为程序员们的最爱. 本文,我们将和大 ...

  8. Java微服务 vs Go微服务,究竟谁更强!?

    前言 Java微服务能像Go微服务一样快吗? 这是我最近一直在思索地一个问题. 去年8月份的the Oracle Groundbreakers Tour 2020 LATAM大会上,Mark Nels ...

  9. Java微服务之Spring Boot on Docker

    本文学习前提:Java, Spring Boot, Docker, Spring Cloud 一.准备工作 1.1 安装Docker环境 这一部分请参考我的另一篇文章<ASP.NET Core ...

  10. java微服务简介与实战

    今年做了一段时间的可见光.ceph存储,后端开发微服务项目,在这记录点东西,也方便大家借鉴查找. springboot的项目实例:https://github.com/ityouknow/spring ...

随机推荐

  1. clip-path属性深入理解与使用

    clip-path CSS 属性可以创建一个只有元素的部分区域可以显示的剪切区域.区域内的部分显示,区域外的隐藏. clip-path的属性值可以是以下几种: 1.inset: 将元素剪裁为一个矩形, ...

  2. 要写文档了,emmm,先写个文档工具吧——DocMarkdown

    前言 之前想用Markdown来写框架文档,找来找去发现还是Jekyll的多,但又感觉不是很合我的需求 于是打算自己简单弄一个展示Markdown文档的网站工具,要支持多版本.多语言.导航.页内导航等 ...

  3. Dive into TensorFlow系列(1)-静态图运行原理

    接触过TensorFlow v1的朋友都知道,训练一个TF模型有三个步骤:定义输入和模型结构,创建tf.Session实例sess,执行sess.run()启动训练.不管是因为历史遗留代码或是团队保守 ...

  4. 如何使用ModelBox快速提升AI应用性能?

    摘要:在开发初期开发者往往聚焦在模型的精度上,性能关注较少,但随着业务量不断增加,AI应用的性能往往成为瓶颈,此时对于没有性能优化经验的开发者来说往往需要耗费大量精力做优化性能,本文为开发者介绍一些常 ...

  5. 6、将两个字符串连接起来,不使用strcat函数

    /* 将两个字符串连接起来,不使用strcat函数 */ #include <stdio.h> #include <stdlib.h> void strCat(char *pS ...

  6. 记一次 .NET 某自动化集采软件 崩溃分析

    一:背景 1.讲故事 前段时间有位朋友找到我,说他的程序在客户的机器上跑着跑着会出现偶发卡死,然后就崩掉了,但在本地怎么也没复现,dump也抓到了,让我帮忙看下到底怎么回事,其实崩溃类的dump也有简 ...

  7. 把Mybatis Generator生成的代码加上想要的注释

    作者:王建乐 1 前言 在日常开发工作中,我们经常用Mybatis Generator根据表结构生成对应的实体类和Mapper文件.但是Mybatis Generator默认生成的代码中,注释并不是我 ...

  8. 基于.NetCore开发博客项目 StarBlog - (20) 图片显示优化

    前言 我的服务器带宽比较高,博客部署在上面访问的时候几乎没感觉有加载延迟,就没做图片这块的优化,不过最近有小伙伴说博客的图片加载比较慢,那就来把图片优化完善一下吧~ 目前有两个地方需要完善 图片瀑布流 ...

  9. 第一章:seaborn图形美学

    一.seaborn模板 1 import numpy as np 2 import matplotlib.pyplot as plt 3 4 def sinplot(flip=1): 5 x = np ...

  10. 2.10:数据加工与展示-pandas清洗、Matplotlib绘制

    〇.目标 1. 使用pandas完成基本的数据清洗加工处理: 2. 使用Matplotlib进行简单的数据图形化展示. 一.用pandas清洗处理数据 1.判断是否存在空值 数据缺失在很多数据中存在, ...