SpringCloud 微服务随机掉线排查过程

news2025/1/9 19:03:17

一、背景

我们的业务共使用 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 天。

2.1 排查和解决

怀疑对象一:服务器内存爆了

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


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

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

怀疑对象二:CPU满载

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

怀疑对象三:磁盘满了

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

怀疑对象四:网络有问题

  • 服务器那三个基本故障暂时排除后,最大怀疑对象就是网络。毕竟服务掉线肯定是服务端一段时间内接收不到客户端心跳包,所以把客户端踢下线了。

  • 通过 telnet,mtr -n *.*.*.*,netstat -nat |grep "TIME_WAIT" | wc -l 这些命令也只能看个大概。

  • echo "1" > /proc/sys/net/ipv4/tcp_tw_reuse 修改内核参数,开启 TIME_WAIT socket 复用能力,提升实例的网络发送请求性能。

  • 查看 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 住。

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

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

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

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

完结感言

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


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

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

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

相关文章

IGA_PLSM3D的理解1

文章目录 前言一、IgaTop3D_FAST.m给的参数二、Material properties 材料特性对Geom_Mod3D的理解 三、IGA准备对Pre_IGA3D的理解 输出1-----CtrPts: 输出2-----Ele: 输出3-----GauPts: 对Boun_Cond3D的理解 输出1-----DBoudary: 输…

Java入坑之类的派生与继承

一、继承 1.1继承的概念 Java中的继承:子类就是享有父类的属性和方法,并且还存在一定的属性和方法的扩展。 Subclass,从另一个类派生出的类,称为子类(派生类,扩展类等) Superclass,派生子类的类&#xff…

PC主流同步软件评测

因为一个要把超过13G的众多零散文件同步到webdav网盘的需求,将市面上一些知名的同步软件试用测试了一番,最终发现只有Syncovery满足需求 先把参与测试的同步软件列一下: GoodSync、FreeFileSync、微软SyncToy、KLS Backup、SecondCopy、Sma…

coreboot seabios

seabios现在是很多虚拟机的默认启动bios,这跟它的短小精干有很大关系,也跟它提供比较完备的legacy支持有关。 按照以下步骤把seabios制作成coreboot的payload, 下载seabios代码, http://code.coreboot.org/p/seabios/downloads…

学生成绩管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设!!! 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址:https://download.csdn.net/download/qq_50954361/87700420 更多系统资源库…

【Cpython的GIL详细了解一下?】

简单解释 全局解释器锁(Global Interpreter Lock,简称 GIL)是 CPython 解释器内部的一个同步原语,它用于在同一时间只允许一个线程执行 Python 字节码。 GIL 的工作原理如下: 在 CPython 中,每个线程都需…

systemctl 命令设置开机自启动失败

1.案例现象 我在 3 月 31日的时候发表了一篇《shell 脚本之一键部署安装 Nginx 》,介绍了如何通过 shell 脚本一键安装 Nginx 我脚本中执行了 Nginx 开机自启动的命令,当我使用 systemctl status nginx 命令复核的时候,我发现 Nginx 服务设…

C# NetCore XML 反序列化解析错误:<xml xmlns=‘‘> was not expected 及 Encoding=utf-16问题

xml帮助类在最后 刚好有业务需要解析xml文件&#xff0c;于是找到帮助类代码开始尝试解析文件&#xff0c;总是出现异常&#xff1a;<xml xmlnsxxxxxxxxxxxxxxxx> was not expected&#xff0c;开始寻找解决方案&#xff1a; 要使结果正确&#xff0c;必须满足两个条件…

【Qt】QString与QChar的源码学习及二者与Unicode的关系【2023.04.20】

简介 关于QString乱码的一些补充。主要就两点&#xff0c;QChar、QString底层存储的字符都是16进制的Unicode编码。 QChar QChar对应16位的Unicode字符集。 The QChar class provides a 16-bit Unicode character. In Qt, Unicode characters are 16-bit entities without an…

Redis RDB 和 AOF原理讲解

redis提供了两种持久化方式。 aof&#xff08;APPEND ON FILE&#xff09;持久化&#xff1a;原理是将redis的操作以命令的方式写入aof文件中&#xff0c;追加。 rdb&#xff08;Redis DataBase&#xff09;内存快照持久化&#xff0c;就是将redis的内存中的数据全量拷贝一份存…

【C++STL精讲】stack与queue的基本使用及模拟实现

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f337;stack是什么&#xff1f;&#x1f337;stack的基本使用&#x1f337;stack的模拟实现&#x1f337;queue是什么&#xff1f;&#x1f337;queue的基本使用&#x1f337;queue的模拟实现 &#x1f490;专栏导读…

Python基础实战2-Python安装

安装简介 电脑系统&#xff1a;Windwos 10 安装的Python版本&#xff1a;3.7.8 安装Python环境 安装运行Python程序的工具&#xff0c;也称位Python解释器。 初学者可以安装anaconda&#xff0c;里面自带500常用库。 第一步&#xff0c;下载Python 可以在Python官方网站…

mockjs基础及项目使用

Mock介绍 Mock.js 是一款模拟数据生成器&#xff0c;旨在帮助前端攻城师独立于后端进行开发&#xff0c;帮助编写单元测试。提供了以下模拟功能&#xff1a; 1. 根据数据模板生成模拟数据 2. 模拟 Ajax 请求&#xff0c;生成并返回模拟数据 3. 基于 HTML 模板生成模拟数据 以上…

网络安全之ATP

目录 APT 定义 特点 目的 APT攻击的生命周期 阶段一 --- 扫描探测 阶段二 --- 工具投送 阶段三 ---漏洞利用 阶段四 --- 木马植入 阶段五 --- 远程控制 阶段六 --- 横向渗透 阶段七 --- 目标行动 防御APT 最佳有效办法 --- 沙箱技术 沙箱技术 针对APT攻击的防御…

归并排序的递归实现

归并排序是一种比较排序&#xff0c;通过分治法思想来进行实现的&#xff0c;其基本思想是&#xff1a; 将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff0c;即先使每个子序列有序&#xff0c;再使子序列段间有序。 若将两个有序表合并成一个有序表&#xff0c;称…

【轻松开发微信小程序】实现用户增删改查功能

文章目录 前言创建微信小程序项目创建项目目录结构编写首页页面编写编辑页面实现增删改查功能展示最终效果总结写在最后 前言 上一篇博客中我们学习了什么是小程序以及开发一个小程序的具体步骤。 在本篇博客中&#xff0c;我们来开发一个用户列表增删改查功能的完整流程&…

【UE】UE5 学习笔记

UE5 学习笔记&#xff08;持续更新中&#xff09; 界面 快捷键 快捷键描述F定位关一卡对象:双击游戏对象名字或选游戏对象名字鼠标中键移动视野alt鼠标左键移旋转视野滑动鼠标滚轮缩放视野alt鼠标右键拖动鼠标缩放视野鼠标左键移动鼠标前后漫游WASD鼠标右键自由漫游漫游时滑…

【vue】插件集合

一、复制粘贴vue-clipboard2 1、安装vue-clipboard2 npm install ue-clipboard2 2、main.js引入插件 // 复制 import VueClipboard from vue-clipboard2 Vue.use(VueClipboard) 3、页面使用 <el-buttonsize"mini"type"text"ref"copyButton&q…

JAVAWeb06-动态WEB开发核心Servlet-02-ServletConfig/Context

1. ServletConfig 1.1 ServletConfig 基本介绍 ServletConfig 类是为 Servlet 程序的配置信息的类Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建Servlet 程序默认是第 1 次访问的时候创建&#xff0c;ServletConfig 在 Servlet 程序创建时&#xff0c;就创建一个…

thinkphp5 线上部署后view-source:可以看到源码,但是http显示空白页面的原因及解决方法汇总

本篇文章主要讲解:thinkphp5 项目线上部署后view-source:可以看到源码,但是http显示空白页面的原因及解决方法教程 作者:任聪聪 日期:2023年4月17日 thinkphp版本5.1 现象说明: 线下测试环境,显示可以看到界面 部署到线上配置完毕后发现页面空白 在php中写入echo 1232…