线上问题:新需求放量后频繁发生old gc

线上问题:新需求放量后频繁发生old gc

  • 一、线上问题描述
  • 二、处理问题过程
    • 1、考虑机器扩容
      • 1.1 预发环境复现该问题
      • 1.2 预发环境机器扩容
      • 1.3 预发环境验证
    • 2、堆内存分析
      • 2.1 内存分析
      • 2.2 问题修复
  • 三、复盘

一、线上问题描述

周四上线了一个新需求,该需求需要展示一个店铺下所有需要降价的商品,并且是sku维度展示。

该需求上线后,周四灰度了30%的量。
周五下午放量到50%后,过了半小时,cat 监控上出现了大量异常:

同时看了一下jvm的情况,出现了old gc,并且可以看到老年代内存有明显增加。在old gc 后老年代内存有所下降。
16点06分线上发生old gc
16点06分老年代内存明显增加

二、处理问题过程

1、考虑机器扩容

看了下异常类型,主要是dubbo接口服务超时,或者消费者超时(超过3s未响应),联想到上面出现的old gc,因此准备通过处理掉old gc来解决大量异常报错问题。

目前线上机器是4核12G,jvm配置的垃圾收集器是G1, jvm设置的堆内存大小是6G。

因此优先考虑的是内存扩容,所以准备先在预发环境上进行验证。

1.1 预发环境复现该问题

由于灰度30%时,集群qps是1000,因此预估线上全量灰度后的集群qps式3300。由于线上机器共12台,因此预估线上灰度100%后,单机qps预估是3300/12=275。

因此构建了一个线程数为275的线程池,在预发的单台机器上模拟该线上该接口的调用情况。
预发环境一调用该接口,果然马上由出现了old gc的现象。

1.2 预发环境机器扩容

  • 预发环境机器扩容:4核12G --> 4核24G
  • 预发环境jvm对内存参数变更:-xms=6g -xmx=6g --> -xms=12g -xmx=12g

1.3 预发环境验证

扩容后开始验证扩容是否有效,再次在预发环境调用该接口,一会儿还是出现了old gc问题。

2、堆内存分析

由于在预发环境扩容了机器内存,并且增加了堆内存大小,还是出现old gc的问题。因此不能简单地通过扩容来解决该问题,还是要分析清楚产生old gc的原因。

因此又回去看了下这个接口的相关代码,该接口返回的sku vo的个数虽然非常多,有1w+,但是sku vo单个对象并不大,该对象中只有5个long类型的字段和一个string类型的字段。算了一下,一个sku vo对象的大小也就大约60B(5个long类型字段大小40B,1个string类型字段预估大小20B)。

因此不太明白为什么会保存到老年代中。所以准备使用内存分析来分析下堆内存中的对象。

2.1 内存分析

由于线上还有30%的流量,因此准备直接来分析线上的对象。

1、开启dump内存
公司发布机器的流水线上提供dump内存的命令,点击开启后,过了大约5分钟,dump好了文件:
1)执行命令:heapdump
2)dump保存结果:xxx.hprof

2、分析内存
使用的是工具是visual vm 2.1.4
1)打开文件:
file -> load -> xxx.hprof
2)可以看到字符数组占了堆内存的37.9%,因此重点分析这块内存。
在这里插入图片描述
3)首先选择了排在前面的一个字符数组,然后点下References和GC Root分析。

在References窗口,一路往下点依赖,可以看到最终的依赖是Log4j组建。因此推测是因为打印日志时存在大对象,导致了old gc。然后在代码里搜了下这块业务的代码,确实有很多大对象的日志打印。
在这里插入图片描述

2.2 问题修复

通过内存分析出了问题后,首先把这块业务相关的大对象的日志打印都加了灰度(默认不打印),然后发上线。发上线之后半小时内,可以看到老年代里的内存明显开始下降,从2.3G下降到300M左右了。

随后开始继续放量,直至放量到100%,也没有再出现old gc了,且老年代的内存也维持在了300M左右。

至此,该问题彻底解决了!
在这里插入图片描述

三、复盘

遇到线上old gc问题,不能盲目内存扩容,更不能直接在线上机器上做操作。
本次遇到问题,先是在预发环境机器上做了内存扩容操作,但是并没有效果,浪费了0.5天的时间。

遇到old gc问题,还是要通过内存工具分析堆内存中最大的一些对象,通过对象产生的原因来分析如何处理。

经过本次经验,下次再有old gc的情况,可以优先考虑:
1、是否有大对象的日志打印
2、是否有内存泄漏的情况

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教程篇:Groq API+沉浸式翻译插件 体验最快AI翻译

1、进入https://console.groq.com/keys 申请一个API(目前免费!抓紧白嫖) 2、安装Chrome插件:沉浸式翻译。 https://immersivetranslate.com/ 3、照着抄(注意将apikey,换成自己申请的groq的api-key&…

【linuxC语言】系统调用IO文件操作

文章目录 前言一、文件描述符介绍二、系统调用IO API介绍2.1 open函数2.2 close函数2.3 read函数2.4 write函数2.5 lseek函数 三、示例代码总结 前言 在Linux系统中,C语言通过系统调用实现对文件的输入输出(I/O)操作。系统调用提供了访问操作…

Docker连接Mysql

Docker连接mysql Docker通过云服务器,与本地连接 引言:这个东西我看狂神秒解决,我就试试了,结果G了,花了我两个小时, 希望内容能帮你解决问题 话不多说,直接上内容: navicat连接…

掌握计算机自动化:Pyperclip与CnOCR详细教程(最全使用方法,每行代码都有注释,帮你解决与之有关的所有问题)

文章目录 一、Pyperclip概念二、Pyperclip基础语法三、Pyperclip与文件交互四、Pyperclip生成随机密码五、OCR概念六、CnOCR 基础识别七、CnOCR 不同图片识别 在这个信息化快速发展的时代,高效的信息处理变得尤为关键。Python,作为一门强大的编程语言&am…

[C语言]——分支和循环(4)

目录 一.随机数生成 1.rand 2.srand 3.time 4.设置随机数的范围 猜数字游戏实现 写⼀个猜数字游戏 游戏要求: (1)电脑自动生成1~100的随机数 (2)玩家猜数字,猜数字的过程中,根据猜测数据的⼤…

Gartner对未来5年全球信息安全和风险管理市场的预测分析:影响市场的四大因素及对相关产品市场的影响

到 2023 年,信息安全和风险管理市场的最终用户支出将增长至 1850 亿美元(现价美元),货币稳定增长率为 13.4%。到2027年,市场规模将达到2870亿美元,按固定汇率计算,2022年至2027年的复合年增长率…

Redis小白入门教程

Redis入门教程 1. Redis入门1.1 Redis简介1.2 Redis服务启动与停止1.2.1 Redis下载1.2.2 服务启动命令1.2.3 客户端连接命令1.2.4 修改Redis配置文件 2. Redis数据类型2.1 五种常用数据类型介绍2.1.1 字符串操作命令2.1.2 哈希操作命令2.1.3 列表操作命令2.1.4 集合操作命令2.1…

如何快速接入 使用Claude 3 opus和Claude 3 sonnet?最简单的Claude 3接入方法

3 月 4 日,被称为 OpenAI 最强竞争对手的大模型公司 Anthropic 宣布推出 Claude3 系列模型,与 Gemini 类似,模型按照大小分为三个:Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus。Opus 目前在官方发布的测试成绩中全方位超越…

【实战】K8S集群部署nacos并接入Springcloud项目容器化运维

文章目录 前言Nacos集群搭建Spring cloud配置nacos将Springcloud项目部署在k8s写在最后 前言 相信很多同学都开发过以微服务为架构的系统,开发微服务必不可少要使用注册中心,比如nacos\consul等等。当然在自动化运维流行的今天,我们也会将注…

【射频连接器】SMB/SMC 同轴连接器

阻抗为 50 欧姆的 Connex SMB/SMC 超小型同轴连接器适用于 4 GHz (SMB) 或 10 GHz (SMC) 的应用。这些连接器通常比 SMA 便宜,主要用于微波电话和其他非国防电信要求的应用。 SMB 连接器具有快速连接/断开卡扣式配接功…

美团面试拷打:Redis 缓存穿透、缓存击穿、缓存雪崩区别和解决方案

目录: 缓存穿透 什么是缓存穿透? 缓存穿透说简单点就是大量请求的 key 是不合理的,根本不存在于缓存中,也不存在于数据库中 。这就导致这些请求直接到了数据库上,根本没有经过缓存这一层,对数据库造成了巨…

Win8.1 连接Wifi后开启热点

1 首先管理员运行 cmd, 输入命令,其中ssid无线名称,key密码,此时网络连接出现 本地连接 2. netsh wlan set hostednetwork modeallow ssidwahahaad key12345678 netsh wlan start hostednetwork 2 找到当前连接的 WLAN, 设置共享。 3 先停止…