线上 GC 告警,我菊花一紧,裤子都没提!!

2024-01-22 18:50
文章标签 线上 gc 菊花 告警 裤子

本文主要是介绍线上 GC 告警,我菊花一紧,裤子都没提!!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

640?wx_fmt=gif

            阅读本文约需要5分钟

 

就在上周,晚上下班后在家上厕所,突然微信企业邮箱收到线上GC告警了:G1 Young Generation Count 超过阈值。我菊花一紧,裤子还没来得及提。这是我入职拼多多后第一次遇到的线上告警。

 

从告警提示来看,是新生代垃圾回收次数过多,换种角度想想,应该是代码中某个地方创建了太多的对象,而且很快就被回收。由于电脑没装 VPN,只能第二天去公司看看了。

 

1. 调度出问题了?

 

第二天到公司,吃过饭大概1点左右又告警了一次。从CAT监控平台看,确实有两次高峰,而且超过阈值。初步判断,可能是调度不均匀导致的,因为这不是那种必现的频繁告警。只要调度均匀,线上几台机器各自分担点,其实也还好。因为确实有这种可能,某个时刻都调度到某一台机器了,导致负载太大,大量的创建和回收对象。

 

我正准备去找调度那边的同事咨询。老大跟我说,有没有可能是任务本身的问题?也就是说不管调度到哪台机器执行,它都会告警,任务本身就有问题。我觉得也有道理。

 

2. 问题的定位

 

因为告警的服务是我的定时任务,这个服务里有三十几个定时任务在被调度。所以首先我得找到是哪个定时任务出的问题,于是我根据告警时间,去线上的可视化日志平台调取两次告警前后的日志。

 

结合代码 Command 接口的日志提示,根据关键词快速搜索出打印的 Command 日志(如果不懂 Command,可以看下这篇文章:程序员除了会CRUD之外,还应该知道什么叫CQRS!),因为我只要定位到了 Command,就好定位是哪个任务了。因为不同类的任务会调用不同的 Command 去执行。

 

通过两次告警日志的定位,最后分析出是同步广告成交额信息的定时任务出的问题。这个定时任务是干啥的呢?首先去今日头条拉取今天、昨天、前天和大前天的广告交易额数据,然后重新封装,上报到其他数据平台。问题就在于这中间的重新封装,会创建大量的对象。

 

要知道拼多多的交易额数据是非常多的。虽然已经在代码里限定了同步粒度是1000条一次,但是还是非常频繁的创建和销毁对象。而且数据必须重新封装,这是无法避免的,那怎么解决呢?

 

3. 将任务拆分

 

第一反应就是将原来的任务拆分,粒度拆分更细一点。什么意思呢?比如原来同步昨天、前天和大前天的数据是放在一个任务里执行的,那我拆成三个任务去执行。如下图:

 

640?wx_fmt=png

 

因为拆分任务后,三个任务都会被调度的,不同的任务就有可能被调度到不同的机器去执行,这总比在一台机器上执行要好很多。这是从任务粒度的角度去解决,把任务分的更细,这个方案是可行的,也是有效果的。

 

但是就在昨天,又一次告警了……说明把任务拆分后,虽然可以降低负载,但是仍然没法满足预设的阈值。

 

4. 将任务分片

 

上面说的把任务拆分,指的是拆分后,每个任务会被调度到某台机器去执行。那么将任务分片是什么意思呢?任务分片指的是,一个任务我让线上所有机器去执行,你执行一点,我执行一点,最后保证一个任务被完整的执行掉即可。如下图:

 

640?wx_fmt=png

 

这种思路是非常棒的,公司的Gavin调度平台做的非常好,我学习了一下公司相关的文档,再加上和同事的讨论,搞清楚了这个分片的原理。我简单抽象一下如何将任务分片去让所有机器调度,而且保证任务的完整性。

 

假如线上有两台机器A和B,我将一个任务分成10片,那么每个机器分到的片数集合可以表示成 [0,1,2,3,4] 和 [5,6,7,8,9]。那么在我的任务里,假设要处理14267条数据(我随便敲的一个数字),每条数据应该都有一个标识,假如就是我们常用的id,那我用id去模10,得到的结果落在哪个集合,就让该集合对应的机器去执行。

 

这相当于我把这14267条数据给打散了,放到所有机器上去各自执行一点,就像上面图中展示的那样,而且是没有规律的打散。所以我们只要知道分了多少片以及每台机器被分到的片数集合,即可完成这个分片功能。

 

但是得确保该任务可以被打散执行才可以,比如某个任务需要计算好多个账号在一起的相关费用,那么就不适合这种分片的方式了。所以方式和理念固然重要,但是也要结合实际场景来用。实在不行,那就再加个机器呗!

 

5. 总结一下

 

这次告警的处理对我来说,收获蛮大的,主要有几点感触蛮深的。

 

1)公司有非常强大的监控平台,任何一个微服务的运作情况,都清晰的展现在平台上,而且每人轮流巡视平台,遇到告警,会第一时间告知对应负责人,平台也会自动给负责人发通知。保证第一时间暴露问题。

 

2)调度平台非常重要,我之前参与的一个项目也有很多定时器,但是缺少一个统一的调度平台,代码里定时器乱飞,这里有个@Scheduled,那里也有个,有时候你根本不知道哪个定时器在执行。

 

3)文档非常重要,公司规不规范很大一部分取决于自己文档平台的建设,而不是写个word我传给你,你传给我。公司需要有自己的wiki,每个平台有对应的文档,这样沟通和学习,效率更高。

 

4)在咨询调度相关的问题时,加了公司的Gavin调度技术群,跟管理员学习了很多,公司基础架构都有对应的技术群,遇到问题都会有技术支持,很方便。

640?

 

程序员除了会CRUD之外,还应该知道什么叫CQRS!

阿里面试,我挂在了第四轮……

同样是程序员,为什么别人比你更优秀?

最常用的经典数据结构和算法汇总

2018年所有精华文章汇总,错过了血亏!

 

 

                                                                                             关注我

                                                                                      每天进步一点点

 

640?wx_fmt=png

 

点赞是最大的支持 640?wx_fmt=gif

这篇关于线上 GC 告警,我菊花一紧,裤子都没提!!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/633909

相关文章

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

如何打造个性化大学生线上聊天交友系统?Java SpringBoot Vue教程,2025最新设计思路

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录

java后端服务监控与告警:Prometheus与Grafana集成

Java后端服务监控与告警:Prometheus与Grafana集成 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在现代的微服务架构中,监控和告警是确保服务稳定性的关键组成部分。Prometheus和Grafana是两个强大的工具,它们可以集成在一起,为Java后端服务提供实时监控和可视化告警。 服务监控的重要性 服务监控可以帮助我们实时了解服务的健

【语音告警】博灵智能语音报警灯JavaScript循环播报场景实例-语音报警灯|声光报警器|网络信号灯

功能说明 本文将以JavaScript代码为实例,讲解如何通过JavaScript代码调用博灵语音通知终端 A4实现声光语音告警。主要博灵语音通知终端如何实现无线循环播报或者周期播报的功能。 本代码实现HTTP接口的声光语音播报,并指定循环次数、播报内容。由于通知终端采用TTS语音合成技术,所以本次案例中无需预先录制音频。 代码实战 为了通过JavaScript调用博灵语音通知终端,实现HT

zabbix-高级应用(主被动监控、邮件告警、企业微信告警)

文章目录 zabbix-高级应用监控路由器交换机SNMP简单网络管理协议测试案例配置网络设备创建主机创建监控项测试监控项 自动发现什么是自动发现Discovery?配置自动发现1、创建自动发现规则2、创建Action动作(发现主机后自动执行什么动作)3、通过动作,执行添加主机,链接模板到主机等操作4、测试,创建新的虚拟机(符合发现规则) 主被动监控1、概述2、创建被监控主机(主动监控)

国内领先线上运动平台:如何借助AI技术实现业务腾飞与用户体验升级

 “ 从智能训练到身体分析,再到辅助判决,AI技术正以惊人的速度渗透进体育和健身领域,为运动员和健身爱好者提供了前所未有的个性化体验。 ” AI,运动的智能伴侣 在巴黎奥运会上,AI技术的运用成为了焦点。它不仅为运动员提供了精准的训练指导,还通过对运动员身体状况的实时分析,帮助他们避免潜在的运动伤害,提升竞技状态。 同时,AI在辅助判决上的应用,确保了比赛的公平与

搭建线上虚拟展厅,需要哪些技术?

搭建虚拟展厅需要一系列先进的技术支持,以确保能够为用户提供逼真、生动、互动的参观体验。以下是搭建虚拟展厅所需的主要技术: 1. 三维建模与渲染技术 三维建模:利用三维建模软件(如Maya、3D MAX、Blender等)建造三维空间模型,包括展厅的整体布局、墙壁、地面、天花板等,以及展品的精细模型。 渲染技术:通过高精度的渲染技术,确保模型在虚拟环境中能够以逼真的方式呈现,包括光照、材质

Spark学习之路 (十四)SparkCore的调优之资源调优JVM的GC垃圾收集器

《2021年最新版大数据面试题全面开启更新》 欢迎关注github《大数据成神之路》 目录 一、概述 二、垃圾收集器(garbage collector (GC)) 是什么? 三、为什么需要GC? 四、为什么需要多种GC? 五、对象存活的判断 六、垃圾回收算法 6.1 标记 -清除算法 6.2 复制算法 6.3 标记-整理算法 6.4 分代收集算法 七、垃圾收集器 7.1 Serial收集器

Kafka 为了避免 Full GC,竟然还在发送端设计了内存池,自己管理内存,太巧妙了...

一、开篇引出一个 Full Gc 的问题 在上一篇文章中,我们讲到了 Kafka 发送消息的八个流程,并且着重讲了 Kafka 封装了一个内存结构,把每个分区的消息封装成批次,缓存到内存里。 如下图所示: 上图中,整体是一个 Map 结构,Map 的 key 是分区,Map 的值是一个队列;队列里有一个个的小批次,里面是很多消息。 这样好处就是可以一次性的把消息发送出去,不至于来一条发送一条,