您现在的位置是:亿华云 > 热点
线上一次JVM FullGC搞得整晚都没睡,彻底崩溃
亿华云2025-10-04 03:08:09【热点】3人已围观
简介这篇文章给大家聊一次线上生产系统事故的解决经历,其背后代表的是线上生产系统的JVM FullGC可能引发的严重故障。一、业务场景介绍先简单说说线上生产系统的一个背景,因为仅仅是文章作为案例来讲,所以弱
这篇文章给大家聊一次线上生产系统事故的彻底崩溃解决经历,其背后代表的线上是线上生产系统的JVM FullGC可能引发的严重故障。
一、整晚业务场景介绍先简单说说线上生产系统的都没一个背景,因为仅仅是彻底崩溃文章作为案例来讲,所以弱化大量的线上业务背景。
简单来说,整晚这是都没一套分布式系统,系统A需要将一个非常核心以及关键的彻底崩溃数据通过网络请求,传输给另外一个系统B。线上
所以这里其实就考虑到了一个问题,整晚如果系统A刚刚将核心数据传递给了系统B,都没结果系统B莫名其妙宕机了,彻底崩溃岂不是线上会导致数据丢失?
所以在这个分布式系统的架构设计中,采取了非常经典的整晚一个Quorum算法。
这个算法简单来说,就是系统B必须要部署奇数个节点,比如说至少部署3台机器,或者是5台机器,亿华云7台机器,类似这样子。
然后系统A每次传输一个数据给系统,都必须要对系统B部署的全部机器都发送请求,将一份数据传输给系统B部署的所有机器。
要判定系统A对系统B的一次数据写是成功的,要求系统A必须在指定时间范围内对超过Quorum数量的系统B所在机器传输成功。
举个例子,假设系统B部署了3台机器,那么他的Quorum数量就是:3 / 2 + 1 = 2,也就是说系统B的Quorum数量就是:所有机器数量 / 2 + 1。
所以系统A要判定一个核心数据是否写成功,如果系统B一共部署了3台机器的话,那么系统A必须在指定时间内收到2台系统B所在机器返回的写成功的响应。
此时系统A才能认为这条数据对系统B是写成功了。这个就是所谓的服务器租用Quorum机制。
也就是说,分布式架构下,系统之间传输数据,一个系统要确保自己给另外一个系统传输的数据不会丢失,必须要在指定时间内,收到另外一个系统Quorum(大多数)数量的机器响应说写成功。
这套机制实际上在很多分布式系统、中间件系统中都有非常广泛的使用,我们线上的分布式系统也是采用了这个Quorum机制在两个系统之间传输数据。
给大家上一张图,一起来看一下这套架构长啥样。
如上图所示,图中很清晰的展示了系统A和系统B之间传输一份数据时的Quorum机制。
接下来,我们用代码给大家展示一下,上面的Quorum写机制在代码层面大概是什么样子的。
PS:因为实际这套机制涉及大量的底层网络传输、通信、容错、优化的云服务器东西,所以下面代码经过了大幅度简化,仅仅表达出了一个核心的意思。
上面就是经过大幅精简后的代码,不过核心的意思是表达清晰了。大家可以仔细看两遍,其实还是很容易弄懂的。
这段代码其实含义很简单,说白了就是异步开启线程发送数据给系统B所有的机器,同时进入一个while循环等待系统B的Quorum数量的机器返回响应结果。
如果超过指定超时时间还没收到预期数量的机器返回结果,那么就判定系统B部署的集群出现故障,接着让系统A直接退出,相当于系统A宕机。
整个代码,就是这么个意思!
二、问题凸现光是看代码其实没啥难的,但是问题就在于线上运行的时候,可不是跟你写代码的时候想的一样简单。
有一次线上生产系统运行的过程中,整体系统负载都很平稳,本来是不应该有什么问题,但是结果突然收到报警,说系统A突然宕机了。
然后就开始进行排查,左排查右排查,发现系统B集群都好好的,不应该有问题。
然后再查查系统A,发现系统A别的地方也没什么问题。
最后结合系统A自身的日志,以及系统A的JVM FullGC进行垃圾回收的日志,我们才算是搞清楚了具体的故障原因。
三、定位问题其实原因非常的简单,就是系统A在线上运行一段时间后,会偶发性的进行长时间Stop the World的JVM FullGC,也就是大面积垃圾回收。
但是,此时会造成系统A内部的工作线程大量的卡顿,不再工作。要等JVM FullGC结束之后,工作线程才会恢复运作。
我们来看下面那个代码片段:
但是这种系统A的莫名宕机是不正确的,因为如果没有JVM FullGC,本来上面那个if语句是不会成立的。
他会停顿1秒钟进入下一轮while循环,接着就可以收到系统B返回的Quorum数量的结果,这个while循环就可以中断,继续运行了。
结果因为出现了JVM FullGC卡顿了几十秒,导致莫名其妙就触发了if判断的执行,系统A莫名其妙就退出宕机了。
所以,线上的JVM FullGC导致的系统长时间卡顿,真是造成系统不稳定运行的隐形杀手之一啊!
四、解决问题至于上述代码稳定性的优化,也很简单。我们只要在代码里加入一些东西,监控一下上述代码中是否发生了JVM FullGC。
如果发生了JVM FullGC,就自动延长expireTime就可以了。
比如下面代码的改进:
通过上述代码的改进,就可以有效的优化线上系统的稳定性,保证其在JVM FullGC发生的情况下,也不会随意出现异常宕机退出的情况了。
很赞哦!(77)
相关文章
- 公司名字不但要与其经营理念、活动识别相统一,还要能反映公司理念,服务宗旨、商品形象,从而才能使人看到或听到公司的名称就能产生愉快的联想,对商店产生好感。这样有助于公司树立良好的形象。
- (4) 使用何种形式的域名后缀对网页搜索影响不大,但域名后缀也需要考虑方便用户记忆
- 2、定期提交和投标域名注册。例如,益华网络点击“立即预订”后,平台会抢先为客户注册域名。当然,一个域名可能会被多个客户预订,所以出价最高的人中标。
- 在数以亿计的网站中,我们应该抓住每一个可能带来宣传的机会,域名可以带有企业的名字,一般可以使用汉语拼音或者英语单词或者是相关缩写的形式,只要用户记住了你企业的名字,就能很容易的打出你的网站域名,同样的,记住了网站域名也能很快的记住你公司的名字。
- 国际域名转移的费用和处理步骤是什么?
- 打开https://www.aizhan.com/输入自己想要查询的域名然后按回车键,如果做过网站都会有数据显示出来
- 3、商标域名一经注册,就可以作为域名裁决过程中的主要信息之一。这可以大大增加公司被抢注的相关域名胜诉的机会。
- 在众多公司中,如果我们必须选择一家可信的公司,那当然是信得过的。
- 第三,.cc域名域名也有很多优势资源域名,从整体注册基数也可以由此推断;
- 付款完成后,您只需耐心等待,如果您注册成功,系统会提示您。这里需要注意的是,域名是一个即时产品,只有在最终付款成功时才能预订,注册成功后不能更改。
热门文章
- a、变更前的公司证件扫描件(代码证或者营业执照)及联系人身份证复印件、变更后的公司证件扫描件(代码证或者营业执照)及新的联系人身份证复印件;身份证复印件需本人签名,公司证件复印件需加盖公章。
- Status、Creation Date、Expiration Date
- a、变更前的公司证件扫描件(代码证或者营业执照)及联系人身份证复印件、变更后的公司证件扫描件(代码证或者营业执照)及新的联系人身份证复印件;身份证复印件需本人签名,公司证件复印件需加盖公章。
- a、变更前的公司证件扫描件(代码证或者营业执照)及联系人身份证复印件、变更后的公司证件扫描件(代码证或者营业执照)及新的联系人身份证复印件;身份证复印件需本人签名,公司证件复印件需加盖公章。
站长推荐
换新域名(重新来过)
4、注册门槛低
打开https://www.aizhan.com/输入自己想要查询的域名然后按回车键,如果做过网站都会有数据显示出来
投资各类域名就像到处打游击战,结果处处失败。因为这样,对任何一个中国域名市场的走势和价格都没有准确的把握,所以最好缩小范围,准确把握战场态势,埋伏。
四、长串数字域名
小白注册网站域名该怎么办?有什么步骤?
4、企业无形资产:通用网站已成为企业网络知识产权的重要组成部分,属于企业的无形资产,也有助于提升企业的品牌形象和技术领先形象。它是企业品牌资产不可或缺的一部分。
因为域名解析需要同步到DNS根服务器,而DNS根服务器会不定时刷,只有DNS根服务器刷新后域名才能正常访问,新增解析一般会在10分钟左右生效,最长不会超过24小时,修改解析时间会稍微延长。