服务宕机、线上环境内存溢出OOM分析思路

前言

平时工作中,肯定会遇到哪个产品经理突然来找,说服务器又挂了,怎么又用不了啦!类似的紧急情况,遇到这种情况不要慌,我提供以下几点紧急补救思路。
1)重启大法保命
2)确认是否新功能发布,线上环境,紧急回退版本
3)查看服务器实例的CPU使用率、内存使用率(arthas)
4)扩充服务器资源,大多数公司上百台微服务,每台微服务实例一般资源都设置不大
5)开启GC日志,分析 xx.hprof文件

总体思路基本围绕上述展开,注意OOM不一定是一蹴而就,也可能是日积月累慢慢产生。

案例分析

紧急回退版本后,分析方向如下

  • 数据一次查询读取量过大,之前用Spring Data JPA,由于框架缺陷对@Query注解先计算条数count,才查询sql数据,但框架缺陷不会识别别名,进而不走分页,查了全表数据,就必须手动指定countQuery属性(依此类推)。
  • 代码逻辑无限循环,注意是否有递归调用某个方法,或者while(true)的情况,导致栈溢出
  • 定时器调用频率过高,注意是不是每分钟执行一次的定时器任务,又是大量消耗资源的
  • 单个业务任务过大,导致不能gc释放资源,有的人一个任务,代码写了好几百行,查询的数据很多,内存无法释放,再加上致命的for循环,直接就OOM了,解决思路,解耦放到MQ队列里慢慢消费
  • 线程池设置不当,因为单个微服务的资源是有限的且都比较小,如果不是特别对响应快有要求的话,根据实际资源去设置线程池参数,或转换思路,解耦放到MQ队列里慢慢消费
  • 资源不足,扩充资源,有些时候并不是代码的问题,而是服务器运行一段时间后就OOM了,这种情况可能是由于业务越来越多,服务运行就是需要更多的内存才能满足日常使用,当你每隔小业务都需要频繁在新生代创建、销毁、创建、销毁的时候,垃圾收集器就会频繁GC,而GC可能会STW或者拉高CPU使用率,最终导致微服务宕机,解决思路,扩充内存资源,降低GC频率。
  • 资源已足够,重启大法保命,很多时候不是内存设置太小,而是由于业务需要,内存设置非常大来满足日常需求,但是执行到几天后已经会有OOM或则服务器卡顿现象,比如很多游戏公司,解决思路,比如每天凌晨1点服务器维护10分钟,其实就是重启服务器。

举例实操

以上就是分析的方向,除了刚上线的代码,自己知道可能是哪个地方有问题之外,其余情况还是要看服务器的GC时的运行情况,这使用就要使用一些工具或者看GC日志,两个方向,以下再举个例子,让大家看看我遇到OOM分析时的步骤

  • 查看实时服务器运行情况(用到 arthas分析)
  • 分析GC时日志(用到 JProfiler分析 xx…hprof)
# Windows安装:打开控制台
curl -O https://arthas.aliyun.com/arthas-boot.jar

查看实时服务器运行情况(docker 举例)

1)使用docker stats: 查看docker容器情况,现在的服务一般都部署到docker容器中,看看正常情况下的cpu使用率、内存使用
在这里插入图片描述
2)进入docker容器内部:docker exec -it 48e /bin/sh
3) top 、free、df:经典三件套,看看能哪个进程耗资源,知道PID号,然后等等重点对该进程分析
在这里插入图片描述

4)使用arthas分析服务器(进程),查看具体内部情况,把前面下载的arthas-boot.jar 复制到docker容器内部, 然后执行

java -jar arthas-boot.jar

中间会卡顿让你选哪个进程,我们选刚刚确定的 PID为7的 敲回车或则1
在这里插入图片描述
5) 使用 dashboard 命令:查看服务器情况,看看内存的平局使用是否超过50%,导致频次GC,看看GC线程的cpu使用率, 看看某一个线程的运行CPU使用率,是否需要资源扩容
在这里插入图片描述
5)使用命令 thread ID号:如果内存够用,也没有频繁GC,可以看看CPU占用搞的线程在执行什么任务

6)设置java运行环境内存大小:如果确实需要扩容内存了,可以调节各种内存阈值 -XX

docker inspect 容器IDJAVA_OPTS=-Dio.netty.noUnsafe=true -XX:+UseG1GC -XX:+UseContainerSupport -XX:InitialRAMPercentage=60.0 -XX:MinRAMPercentage=60.0 -XX:MaxRAMPercentage=60.0 -XX:MaxGCPauseMillis=100 -XX:MaxMetaspaceSize=512m -XX:CompressedClassSpaceSize=256m -XX:MetaspaceSize=256m -XX:MaxDirectMemorySize=256m -XX:InitialCodeCacheSize=258m -XX:ReservedCodeCacheSize=258m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./ -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:./gc.log -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:GCLogFileSize=2M

arthas分析服务器运行情况的步骤基本就是以上几点,也可以通过敲其他分析命令进一步分析,到此基本可以确定是不是服务器的内存是不是接近临界值,由于业务量增多需要扩容情况

分析GC时日志

1)开启GC快照设置,设置日志位置,最后的会生成 java_pid7.hprof文件

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./  //开启日志快照,以及快照位置-XX:+PrintGC    //输出GC日志,默认是关闭的
-XX:+PrintGCDetails  //输出GC的详细日志,默认是关闭
-XX:+PrintGCTimeStamps //输出GC的时间戳,以基准时间的形式
-XX:+PrintGCDateStamps // 输出GC的时间戳,以日期的形式(类似于2022-04-01T14:21:33.438+0800)
-XX:+UseConcMarkSweepGC  //打开此开关参数后,使用ParNew+CMS+Serial Old收集器组合进行垃圾收集。Serial Old作为CMS收集器出现Concurrent Mode Failure的备用垃圾收集器。
-Xloggc:C:\Users\DXH\Desktop\gc.txt//指定将GC日志输出到具体的文件,默认为标准输出

2)复制docker中的java_pid7.hprof文件, 进入docker容器,如何设置了HeapDumpPath=./ 默认ls就可以看到文件,在docker外面执行cp命令

docker cp 容器ID:./xxx.hprof ./xxx.hprof

3)使用JProfiler分析工具
在这里插入图片描述
4)通过查看分析工具的类信息, 最大内存信息,辅助我们分析代码问题,例如看看哪个类最大,最大的对象有哪些
在这里插入图片描述
在这里插入图片描述

5)右键查看某个大对象集合的引用情况,合并引用进行分析,多看看哪个类大了
在这里插入图片描述
在这里插入图片描述

总结

以上就是思考和分析OOM的可能出现场景和方法,顺着这么一套下来,基本可以具体时业务激增导致需要服务器扩容,还是代码问题导致的栈溢出和内存泄漏。

注意:频繁GC是十分消耗服务器性能的,大任务就多解耦,防止内存剧增,OOM不一定是一蹴而就,也可能是日积月累慢慢产生。

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

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

相关文章

5分钟上手浏览器插件测试——Eolink Apikit

Eolink Apikit 研发管理和自动化测试产品中,提供了多种发起 API 测试的方式: 服务器测试:通过 Eolink Apikit 官方远程服务器发送请求,不需要安装任何插件,但是无法访问本地服务器(localhost)、内网、局域网。插件测试…

年终汇报这么写,升值加薪必有你!

#01 你这么能干, 老板知道吗? — 打工人最怕什么? 最怕你忙前忙后,干活一大堆,气出一身结节,锅还没少背,最后升职加薪没有你,出国旅游不带你;更怕你日常996&#xf…

同义词替换器降低论文重复率的最新技术动态

大家好,今天来聊聊同义词替换器降低论文重复率的最新技术动态,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 标题:同义词替换器降低论文重复率的最…

从旺店通·企业版到金蝶云星空通过接口配置打通数据

从旺店通企业版到金蝶云星空通过接口配置打通数据 对接系统:旺店通企业版 旺店通是北京掌上先机网络科技有限公司旗下品牌,国内的零售云服务提供商,基于云计算SaaS服务模式,以体系化解决方案,助力零售企业数字化智能化…

基于SSM的视康眼镜网店销售系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

高级算法设计与分析(二) -- 递归与分治策略

系列文章目录 高级算法设计与分析(一) -- 算法引论 高级算法设计与分析(二) -- 递归与分治策略 高级算法设计与分析(三) -- 动态规划 未完待续【 高级算法设计与分析(四) -- 贪…

iEnglish:家校协同培养学生自主阅读习惯

近日,2023年最新一期365天和1000天“iEnglish学习成长营”顺利结营。据悉,截至今年12月,在家庭场景中完成365天和1000天不间断阅读人数分别突破15万人和2万人。 近年来,全民终身学习的学习型社会不断深入推进,基础教育中对于学生的综合阅读能力素养新要求不断更新。提升孩子的…

【Git】Git基本操作

文章目录 Git 是什么Git 的优点Git 安装Linux UbuntuLinux CentOsWindows Git 基本操作1. 创建 Git 本地仓库2. 配置 Git3. Git工作区、暂存区和版本库4. 添加文件5. 查看 .git 文件6. 修改文件7. 版本回退 Git 是什么 Git是一个免费的、开源的分布式版本控制系统,…

【Linux】ip命令使用

ip命令 用于管理与配置网络接口和路由表。 ip命令的安装 ip 命令来自 iproute2 软件包,在 CentOS 7 中默认已安装。 yum install -y iproute 语法 ip [ OPTIONS ] OBJECT { COMMAND | help }ip [ -force ] -batch filename选项及作用 执行令 : ip …

TCP的拥塞控制_基础知识_四种拥塞控制方法

TCP的拥塞控制 一.拥塞控制的基本概念 在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫作拥塞 。 计算机网络中的链路容量(带宽)、交换节点中的缓存和处理机等都是网络的资源 若出现拥塞…

spring boot 配置多数据源 踩坑 BindingException: Invalid bound statement (not found)

在上一篇:《【已解决】Spring Boot多数据源的时候,mybatis报错提示:Invalid bound statement (not found)》 凯哥(凯哥Java) 已经接受了,在Spring Boot配置多数据源时候,因为自己马虎,导致的一个坑。下面&a…

Notepad++:多行数据操作

1)删除关键字之后(或之前)的所有字符 删除s之后(包含s)的所有内容;快捷键:s.*$ 替换成功 删除s之前(包含s)的所有内容;快捷键:^.*s 2&#xff09…

深度学习中的张量维度

1 深度学习中的张量 在深度学习框架中,Tensor(张量)是一种数据结构,用于存储和操作多维数组。张量可以被视为一种扩展的矩阵,它可以具有任意数量的维度。 在深度学习中,张量通常被用来表示神经网络的输入…

PowerDesigner生成数据字典

这里写自定义目录标题 1,创建物理模型2,创建数据源连接3,获取表4,创建报告 先看下最终效果 1,创建物理模型 2,创建数据源连接 填写数据源连接信息 测试连接是否成功 3,获取表 连接刚创建的数…

Springboot数据校验与异常篇

一、异常处理 1.1Http状态码 HTTP状态码是指在HTTP通信过程中,服务器向客户端返回的响应状态。它通过3位数字构成,第一个数字定义了响应的类别,后两位数字没有具体分类作用。以下是常见的HTTP状态码及其含义: - 1xx(信…

[PyTorch][chapter 8][李宏毅深度学习][Back propagation]

前言: 反向传播算法(英:Backpropagation algorithm,简称:BP算法)是一种监督学习算法,常被用来训练多层感知机。 它用于计算梯度计算中,降低误差。 目录: 链式法则 模型简介(Model) 损失函…

【MATLAB第84期】基于MATLAB的波形叠加极限学习机SW-ELM代理模型的sobol全局敏感性分析法应用

【MATLAB第84期】基于MATLAB的波形叠加极限学习机SW-ELM代理模型的sobol全局敏感性分析法应用 前言 跟往期sobol区别: 1.sobol计算依赖于验证集样本,无需定义变量上下限。 2.SW-ELM自带激活函数,计算具有phi(x)e^x激…

第二证券:诱多诱空是指什么?股民该如何应对?

诱多诱空是指什么? 诱多诱空各指代主力的一类操盘行为。诱多是指主力有意营建股价上涨的假象,从而诱使不知情股民买入该股,主力趁机抛售股票离场,因为本身股价上涨靠主力一手织造,主力撤资后股价会回落,买…

Next.js 学习笔记(三)——路由

路由 路由基础知识 每个应用程序的骨架都是路由。本页将向你介绍互联网路由的基本概念以及如何在 Next.js 中处理路由。 术语 首先,你将在整个文档中看到这些术语的使用情况。以下是一个快速参考: 树(Tree):用于可…

云原生系列2-CICD持续集成部署-GitLab和Jenkins

1、CICD持续集成部署 传统软件开发流程: 1、项目经理分配模块开发任务给开发人员(项目经理-开发) 2、每个模块单独开发完毕(开发),单元测试(测试) 3、开发完毕后,集成部…