YGC 耗时10S+,导致本机提供服务超时异常

YGC 耗时10S+,导致本机提供服务超时异常

Young GC 期间,导致应用 stop the word,影响了应用提供正常服务,导致服务调用方超时。

一. 现象

同事调用我方提供的服务接口,采用的是job轮询方式,依次调用。如果调用服务超时,会中断job,导致无法轮询至结束。

二. 问题追踪

​ 首先打开cat 查询当前应用,查看当前应用服务期间是否抛错,是否因为服务本身异常,导致无法超时。

	1. Problem页面显示一切正常。
	2. 打开对应服务接口统计情况,显示服务调用有一个调用失败,如下图所示。

在这里插入图片描述

但是又无法追踪到具体哪个服务IP异常,接口统计仅仅记录的是调用方的调用情况,服务方仅仅是超时,但是服务还是最后结果正常,服务耗时超过了10S而已。因为公司默认的接口超时未10S,超过10S接口调用方,返回接口超时。服务方程序正常。

​ 3. 打开Transaction页面,查服务最长的SOA2Service ,如下图所示,服务市场11S+。

在这里插入图片描述

进入具体transaction,查询具体哪个步骤耗时过长,如下图所示。可以发现,总耗时11S+,业务逻辑耗时10.9S ,但是真正执行的逻辑才0.5S不到。这部分时间应该是耗费在GC stop the word 。

在这里插入图片描述

查询到当前服务机器IP,如下图所示。

在这里插入图片描述

  1. 点开Heartbet ,查看机器健康状况,发现当前机器YGC 耗时在10S左右,刚好吻合消失的时间差。

在这里插入图片描述

5. 下载当前机器的DUMP,查看具体是内存消耗情况,如下图所示。可以发现 **bag-task-translation-pool-1** 线程池耗费内存最大,高达1.8G,占总内存的93%。

在这里插入图片描述

  1. 定位当前代码,发现代码异常。

    当前业务代码原本逻辑是,当前按固定的时间频次,提交执行任务。采用了ScheduledThreadPoolExecutor 线程池,使用了scheduleAtFixedRate,每个1S提交执行任务。问题出现在,如果当前任务在1S内没有执行完,则后续会不断提交任务,导致bag-task-translation-pool-1 内存不断膨胀,GC 耗时过长。

在这里插入图片描述

三. 解决办法

解决办法非常简单,调整scheduleAtFixedRate为scheduleWithFixedDelay,scheduleWithFixedDelay 是等待上一个任务执行完,再执行下一个任务,串行执行任务。

四. 总结

考虑全某一段代码适用的场景,对执行的代码怀有敬畏之心。

串行执行任务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值