0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_ro2CN3Fa 来源:芋道源码 2023-03-07 09:30 次阅读

背景

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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

项目地址:https://github.com/YunaiV/ruoyi-vue-pro

视频教程:https://doc.iocoder.cn/video/

案发

春节放假期间收到反馈,网页报错服务未找到(gateway 找不到服务的报错提示)。查看 nacos 集群列表,发现个别服务丢失 (下线)。

这个问题每几天出现一次, 出现时间不固定, 每次掉线的服务像是随机选的几个。服务手动 kill+restart 后能稳定运行 2-3 天。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

项目地址:https://github.com/YunaiV/yudao-cloud

视频教程:https://doc.iocoder.cn/video/

排查和解决

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

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

1509ec3e-bc7e-11ed-bfe3-dac502259ad0.jpg

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

151b7224-bc7e-11ed-bfe3-dac502259ad0.jpg

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

怀疑对象二: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 集群服务端故障

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

查看 nacos 服务端日志,发现确实有主动下线服务操作。那就奇怪了,这个机器上的有些服务还在正常工作,为什么会随机下线几个服务呢?

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

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

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

添加堆栈打印。

15377b2c-bc7e-11ed-bfe3-dac502259ad0.jpg

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

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

154d718e-bc7e-11ed-bfe3-dac502259ad0.jpg

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

156a6532-bc7e-11ed-bfe3-dac502259ad0.jpg

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

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

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

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

158a3e98-bc7e-11ed-bfe3-dac502259ad0.jpg

159e847a-bc7e-11ed-bfe3-dac502259ad0.jpg

15b3e842-bc7e-11ed-bfe3-dac502259ad0.jpg

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

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

15c914e2-bc7e-11ed-bfe3-dac502259ad0.jpg

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

15ddcf18-bc7e-11ed-bfe3-dac502259ad0.jpg

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

15f40936-bc7e-11ed-bfe3-dac502259ad0.jpg

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

160c1a26-bc7e-11ed-bfe3-dac502259ad0.jpg

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

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

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

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

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

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

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

16223568-bc7e-11ed-bfe3-dac502259ad0.jpg

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

1645a46c-bc7e-11ed-bfe3-dac502259ad0.png

1656a7c6-bc7e-11ed-bfe3-dac502259ad0.jpg

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

16707e9e-bc7e-11ed-bfe3-dac502259ad0.jpg

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

168a9c0c-bc7e-11ed-bfe3-dac502259ad0.jpg

完结感言

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

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

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    8825

    浏览量

    84903
  • JAVA
    +关注

    关注

    19

    文章

    2946

    浏览量

    104337
  • spring
    +关注

    关注

    0

    文章

    335

    浏览量

    14272
  • 微服务
    +关注

    关注

    0

    文章

    127

    浏览量

    7311

原文标题:Java 微服务随机掉线排查过程

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    波特率漂移导致通信异常的故障排查过程

    示波器的协议解码功能大家都不生疏,你是否有过波形看起来正常,协议参数、解码设置都正确,却无法正常解码的经历呢?本文以UART协议为例,分享由于波特率漂移导致通信异常的故障排查过程
    的头像 发表于 01-08 13:51 6307次阅读
    波特率漂移导致通信异常的故障<b class='flag-5'>排查过程</b>

    网络通讯中随机数不随机引发的问题及解决方法

    最近在排查一个项目的性能压测问题,十分偶然地发现一个莫名偶现的网络掉线问题,最后排查发现居然跟系统的随机数特性有莫大的关系。
    的头像 发表于 03-10 11:51 4305次阅读
    网络通讯中<b class='flag-5'>随机</b>数不<b class='flag-5'>随机</b>引发的问题及解决方法

    微服务架构和CQRS架构基本概念介绍

    微服务架构现在很热,到处可以看到各大互联网公司的微服务实践的分享总结。但是,我今天的分享和微服务没有关系,希望可以带给大家一些新的东西。如果一定要说微服务和CQRS架构的关系,那我觉得
    发表于 05-22 09:03

    微服务网关gateway的相关资料推荐

    目录微服务网关 gateway 概述[路由器网关 Zuul 概述]嵌入式 Zuul 反向代理微服务网关 gateway 概述1、想象一下一个购物应用程序的产品详情页面展示了指定商品的信息:2、若是
    发表于 12-23 08:19

    java微服务生态系统模型解读

    微服务并不是孤立存在的,它们存在于一个环境里,微服务在这个环境里进行交互。把这种环境看成微服务生态系统并分层,有助于理解微服务架构。 在一个设计良好的
    发表于 09-27 13:06 0次下载
    <b class='flag-5'>java</b><b class='flag-5'>微服务</b>生态系统模型解读

    实例分析Java微服务框架和优势

    本文首先简单介绍了微服务的概念以及使用微服务所能带来的优势,然后结合实例介绍了几个常见的Java微服务框架。 微服务在开发领域的应用越来越广
    发表于 09-28 17:33 0次下载

    java微服务架构有哪些

    本文首先简单介绍了微服务的概念以及使用微服务所能带来的优势,然后结合实例介绍了几个常见的Java微服务框架。微服务在开发领域的应用越来越广泛
    的头像 发表于 02-09 10:34 8578次阅读
    <b class='flag-5'>java</b><b class='flag-5'>微服务</b>架构有哪些

    什么是微服务和容器?微服务和容器的作用是什么

    微服务是将应用程序拆分为多个服务的一种架构类型,这些服务具备构成整个应用程序的细粒度功能。每个微服务将具备针对您的应用程序的不同逻辑功能。与应用程序的所有组件和功能都在单个实例中的单体
    的头像 发表于 01-13 10:54 3.2w次阅读
    什么是<b class='flag-5'>微服务</b>和容器?<b class='flag-5'>微服务</b>和容器的作用是什么

    DC-DC电源故障排查过程和总结,珍贵的经验!资料下载

    电子发烧友网为你提供DC-DC电源故障排查过程和总结,珍贵的经验!资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 04-25 08:54 75次下载
    DC-DC电源故障<b class='flag-5'>排查过程</b>和总结,珍贵的经验!资料下载

    JVM CPU使用率飙高问题的排查分析过程

    %,为什么会出现这样的现象呢? 排查过程 Step 1: 使用top命令,查询资源占用情况: 如上图所示,显示了服务器当前的资源占用情况,其中PID为5456的进程占用的资源最多。 在这里,我们也使用top
    的头像 发表于 10-10 16:31 2206次阅读

    glibc导致的堆外内存泄露的排查过程

    本文记录一次glibc导致的堆外内存泄露的排查过程
    的头像 发表于 09-01 09:43 633次阅读
    glibc导致的堆外内存泄露的<b class='flag-5'>排查过程</b>

    springcloud微服务架构

    Spring Cloud是一个开源的微服务架构框架,它提供了一系列工具和组件,用于构建和管理分布式系统中的微服务。它基于Spring框架,旨在通过简化开发过程和降低系统复杂性来帮助开发人员构建弹性
    的头像 发表于 11-23 09:24 1039次阅读

    java内存溢出排查方法

    Java内存溢出(Memory overflow)是指Java虚拟机(JVM)中的堆内存无法满足对象分配的需求,导致程序抛出OutOfMemoryError异常。内存溢出是Java开发过程
    的头像 发表于 11-23 14:46 2745次阅读

    Java怎么排查oom异常

    据量的应用中。要排查OOM异常,需要经过以下几个步骤: 理解OOM异常的原因:OOM异常通常有以下几个原因:内存泄露、内存溢出、内存不足以容纳所需的数据等。理解OOM异常的原因对排查问题非常重要。 配置Java堆内存:要解决OO
    的头像 发表于 12-05 13:47 1089次阅读

    Java微服务随机掉线排查过程简析

    我们的业务共使用 11 台(阿里云)服务器,使用 SpringcloudAlibaba 构建微服务集群, 共计 60 个微服务, 全部注册在同一个 Nacos 集群。
    的头像 发表于 01-13 17:41 843次阅读
    <b class='flag-5'>Java</b><b class='flag-5'>微服务</b><b class='flag-5'>随机</b><b class='flag-5'>掉线</b><b class='flag-5'>排查过程</b>简析