记一次线上 OOM 和性能优化(上)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 大家好,我是鸭血粉丝(大家会亲切的喊我 「阿粉」),是一位喜欢吃鸭血粉丝的程序员,回想起之前线上出现 OOM 的场景,毕竟当时是第一次遇到这么 紧脏 的大事,要好好记录下来。

1 事情回顾

2 开始分析

  • 2.1 日志分析
  • 2.2 使用 MAT 分析 dump 文件
  • 2.3 根本原因

3 性能优化

  • 3.1 业务、代码逻辑梳理
  • 3.2 通过 VisualVM 进行对比

4 技术总结

  • 4.1 开发注意点
  • 4.2 应对故障注意点

5 多说两句

1 事情回顾

在某次周五,通过 Grafana 监控,发现线上环境突然出现CPU和内存飙升的情况:

60.jpg

但是看到网络输出和输入流量都不是很高,所以网站被别人攻击的概率不高,后来其它服务器的负荷居高不下。

阿粉先 dump 下当时的堆栈信息,保留现场,接着进行了简单的分析,为了稳住用户,通知运维一台一台服务器进行重新启动,让大家继续使用服务。

接着就开始分析和回顾事情了

61.jpg

2 开始分析

2.1 日志分析

建议大家了解一些常用的 Linux 语法,例如 Grep 查询命令,是日志分析的一大利器,还能通过正则表达式查询更多内容。

62.jpg既然服务器在某个时间点出现了高负荷,于是就先去找一开始出现问题的服务器,去找耗时比较长的服务,例如我当时去找数据库耗时的服务,由于发生 OOM 时的日志已经被刷掉,于是我大致描述一下:

[admin@xxx xxxyyyy]$ grep '15:14:' common-dal-digest.log |  grep -E '[0-9]{4,}ms'
2018-08-25 15:14:21,656 - [(xxxxMapper,getXXXListByParams,Y,1089ms)](traceId=5da451277e14418abf5eea18fd2b61bf)

很明显,上述语句是 查询在15:14那一分钟内,在common-dal-digest.log文件中,耗时超过1000ms的SQL服务(查的是耗时超过10秒的服务)。

日志中有个特殊的标志 traceId,在请求链路中是唯一的,所以根据这个标志能分析单请求的全链路操作,建议大家的日志框架中也加上这种字段,让服务可追溯和排查。

通过 traceId去查 http 保存的访问日志,定位在该时间点内,分发到该服务器上的用户请求。还有根据该traceId,定位到整个调用流程所使用到的服务,发现的确十分耗时...

于是拿到了该请求具体信息,包括用户的登录手机号码,因为这个时候,其它几台服务器也出现了 CPU 和内存负载升高,于是根据手机号查询了其它几台服务器的访问日志,发现同一个请求,该用户也调用了很多次...

于是初步确认了某个耗时接口

2.2 使用 MAT 分析 dump 文件

官方介绍:

MATMemory Analyzer 的简称,它是一款功能强大的 Java 堆内存分析器。可以用于查找内存泄露以及查看内存消耗情况。MAT 是基于Eclipse开发的,是一款免费的性能分析工具。读者可以在 http://www.eclipse.org/mat/ 下载并使用 MAT。

在前面提到,出现问题时,顺手保存了一份堆栈信息,使用工具打开后,效果图如下所示:

63.jpg

整个应用的内存大小 1.6G,然后有一块内存块竟然占用了 1.4G,占比达到了 87.5%,这也太离谱了吧!64.jpg

于是阿粉决定好好分析该对象的引用树,右键选择【class_reference】,查看对象列表,和观察 GC 日志,定位到具体的对象信息。65.jpg

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
消息中间件 Cloud Native 物联网
深度剖析 RocketMQ 5.0,事件驱动:云时代的事件驱动有啥不同?
本文技术理念的层面了解一下事件驱动的概念。RocketMQ 5.0 在面向云时代的事件驱动架构新推出的子产品 EventBridge,最后再结合几个具体的案例帮助大家了解云时代的事件驱动方案。
79430 6
|
存储 缓存 监控
美团面试:说说OOM三大场景和解决方案? (绝对史上最全)
小伙伴们,有没有遇到过程序突然崩溃,然后抛出一个OutOfMemoryError的异常?这就是我们俗称的OOM,也就是内存溢出 本文来带大家学习Java OOM的三大经典场景以及解决方案,保证让你有所收获!
5117 0
美团面试:说说OOM三大场景和解决方案? (绝对史上最全)
|
Java 数据库连接 mybatis
【Spring常见错误】No qualifying bean of type
📋📋 精彩摘要:MyBatis 核心配置文件(xxxConfig.xml),该文件配置了MyBatis的一些全局信息,,包含数据库连接信息和MyBatis运行时所需的各种特性,以及设置和响应MyBatis行为的一些属性。本文将深入浅出的介绍MyBatis核心配置文件中常用的标签配置。
6438 0
|
2月前
|
存储 BI API
一文读懂数据中台和数据仓库的区别
本文深入解析了“数据中台”与“数据仓库”的区别,从定义、功能、架构设计、数据处理、应用场景等多个维度进行对比,帮助企业更清晰地理解二者的核心差异与适用场景。数据仓库重在存储与分析历史数据,服务于高层决策;数据中台则强调数据的实时处理与服务化输出,直接赋能一线业务。文章还结合企业规模、业务需求与技术能力,给出了选型建议,助力企业在数字化转型中做出更科学的选择。
|
5月前
|
存储 Java
【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读
前言 下面,跟上主播的节奏,马上开始ThreadLocal源码的阅读( ̄▽ ̄)" 内部结构 如下图所示,我们可以知道,每个线程,都有自己的threadLocals字段,指向ThreadLocalMap
449 81
【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读
|
12月前
|
缓存 Java 关系型数据库
【Java面试题汇总】ElasticSearch篇(2023版)
倒排索引、MySQL和ES一致性、ES近实时、ES集群的节点、分片、搭建、脑裂、调优。
【Java面试题汇总】ElasticSearch篇(2023版)
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
《Attention LSTM:解锁关键信息捕捉的强大引擎》
Attention LSTM将注意力机制融入长短期记忆网络(LSTM),显著提升对关键信息的捕捉能力。通过计算注意力分数、生成权重、加权求和及最终预测,模型能动态调整关注度,突出重要信息,广泛应用于自然语言处理、语音识别等领域,为复杂序列数据处理提供有力支持。
201 13
|
数据采集 数据可视化 大数据
Python在大数据处理中的应用实践
Python在大数据处理中扮演重要角色,借助`requests`和`BeautifulSoup`抓取数据,`pandas`进行清洗预处理,面对大规模数据时,`Dask`提供分布式处理能力,而`matplotlib`和`seaborn`则助力数据可视化。通过这些工具,数据工程师和科学家能高效地管理、分析和展示海量数据。
586 4
|
11月前
|
Python
Python实用记录(十一):出现科学计数法如何在代码中恢复
本文介绍了如何在Python中处理科学计数法,包括如何将科学计数法转换为普通数字,以及如何设置NumPy的print选项来避免科学计数法的显示。
203 1
|
域名解析
Discuz如何给 门户、论坛、手机等,设置二级域名
Discuz如何给 门户、论坛、手机等,设置二级域名
384 1