实战JVM高CPU、内存问题分析定位

背景:

业务中台组件MOSC开展压测工作,并发场景下发现CPU使用率达到100%,虽然程序没有报错,但是这种情况显然已经达到性能瓶颈,对服务带来了验证的效能影响,所以针对该CPU问题必须进行详细的根因分析处理。

这次针对分析过程做了详细的记录,希望给大家在日常工作中,遇到CPU和内存问题能高效准确的进行分析定位。

一、通过监控确定问题

应用研发这边可以通过Grafana监控观察相关资源使用情况:

这里可以看到CPU已经达到99%以上,已经达到了瓶颈。

二、CPU问题分析

1、进入容器查看当前CPU占比最高的进程信息

使用TOP命令查看,可以发现确实是因为mosc服务导致

2、定位占用CPU最高的具体线程,可以使用TOP -H -p pid指令查看

3、通过jvm指令查看当前线程栈信息,jstack  -l  pid  |  grep  nid  -A  50

 注:

jstack信息中记录nid是16进制,需要将当前线程ID转成16进制

jstack是在容器中打印栈信息,正常情况下建议通过jmap导出dump文件然后进行搜索定位,避免jstack指令给当前执行服务造成影响。

这里发现已经搜索定位到了nid为89的线程栈信息,注意当前线程是VM Thread,大概率推测当前线程是GC线程。

注:如果是正常的请求线程,这里就可以通过栈信息定位到具体的程序,例如上图的nid=0x92。

4、检查GC情况

使用jstat -gcold 85 1000 ,查看Old区GC和内存实时状态。大致的可以看出来,Old区使用率已经100%了,FULLGC非常的频繁,差不多5秒一次。

  1. 查看GC原因

使用jsta  -gccause  85 1000指令,查看当前GC实时情况包括原因。

这里可以看出来频繁的FULLGC原因都是相同的Allocation Failure,无法分配资源。

其实到此,基本上已经可以测出来一些结论了:

压测过程中虚拟机内存吃满无法分配资源,导致频繁的FULLGC而占用过多的CPU资源。所以程序执行过程中可能产生了大数据量,导致了大对象的诞生,根据Jvm内存分配原理,大对象会直接放入到Old区,并发场景下Old区很快就会被大对象吃满,从而引发FGC。

三、内存占用分析

1、导出dump日志信息

针对内存分析,最好的方式的就是导出dump快照文件,借助工具来分析,比如MAT、Jvisualvm、Jprofile等,我这里使用的就是Jprofile。

使用jmap -dump:live,format=b,file=/路径/dump.hprof  85 指令导出dump文件。

2、分析内存情况

使用Jprofile打开dump文件

可以看出来这里存在这比较大的实例,选择String实例看下引用情况,

这个可以知道当前实例最终的引用来自于ArrayList对象。

3、查看大对象试图

Jprofile提供了BiggestObjects视图,可以观察当前内存中的大对象

这里可以看到和上面分析的一样,确实存在这ArrayList大对象,继续查看当前对象的引用信息

到此就已经可以定位到了大致的程序了:GetWorkService.getWork#doGetPageWork#WoList().select()

当前select方法是数据库调用方法,所以结合前面分析的内容,可以推测当前程序可能获取到了大数据量信息,并使用了ArrayList对象接收。

四、结合请求日志定位具体程序问题和优化

既然已经清楚了大致的程序和原因,那就可以按照这个思路具体的验证和程序分析了

1、内存占用验证

关闭其他的API脚本,只启动当前API观察内存使用情况。

这里可以看到执行了一次API后,Old区上升了约350m,正如上面我们推测的,当前API产生了大对象,直接放入到Old区,并发后导致内存吃满。

2、结合pinpoint链路分析具体SQL

因为清楚了问题API和大致的程序,我们跟容易就可以通过pinpoint分析到具体的执行SQL。

通过测试执行该SQL,发现当前SQL会读取出来约7w数据量,以及约120个栏位信息。

3、结合程序分析优化

结合当前程序分析后发现,当前API虽然支持分页查询,但是在获取total时,使用原SQL查询所有数据,然后获取size,导致了获取到了7w多笔数据,导致了效能问题。

到此全部的问题都已经分析完了,接下来就是联系PR做优化调整了,获取total直接通过select count获取总数total。

4、结果验证

再PR程序调整后,验证结果。现在继续压测当前API使用10U并发(之前是跑一次,消耗300mb内存占用)

耗时结果对比:从之前100s降到了1秒多

内存对比:现在10U下,内存几乎没有浮动

CPU对比:现在max CPU是40%左右

搞定!

PS:

大数据问题往往是导致CPU、内存问题最主要原因之一,造成的影响可能是服务级别,所以日常开发过程中,在非业务需求场景下,尽量减少内存数据量,避免导致资源问题和效能风险。

对于上述分页场景中需要获取总数total,后续也会纳入应用开发规范要求:分页场景下获取数据总数,使用统计函数获取,例如select count,禁止获取全部数据,在内存获取size。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅谈Python中的鸭子类型和猴子补丁

文章目录 前言一、鸭子类型二、猴子补丁关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前言 Python 开发者可能…

AdaBoost提升分类器性能

目录 AdaBoost算法原理 AdaBoost工作详情 初始权重分配 第一轮 第二轮 后续轮次 最终模型 AdaBoost的API解释 AdaBoost 对房价进行预测 AdaBoost 与决策树模型的比较 结论 AdaBoost算法原理 在数据挖掘中,分类算法可以说是核心算法,其中 Ada…

如何应用ChatGPT撰写、修改论文及工作报告,提供写作能力及优化工作??

如果我想让gpt从pdf文档中提取相关关键词的内容,可以怎么做呢??我们评论区讨论 ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题,ChatGPT都能为您提供实用且高质量的建议和指导&am…

flink和机器学习模型的常用组合方式

背景 flink是一个低延迟高吞吐的系统,每秒处理的数据量高达数百万,而机器模型一般比较笨重,虽然功能强大,但是qps一般都比较低,日常工作中,我们一般是如何把flink和机器学习模型组合起来一起使用呢? fli…

9.Docker的虚悬镜像-Dangling Image

1.虚悬镜像的概念 虚悬镜像 (Dangling Image) 指的是仓库名 (镜像名) 和标签 TAG 都是 的镜像。 2.构建本地虚悬镜像 这里我以unbuntu为例来说明。 2.1 编写Dockerfile文件 FROM ubuntu:22.042.2 根据Dockerfile文件构建虚悬镜像 docker build .上面这段命令&#xff0c…

C#开发的OpenRA游戏之属性RenderSprites(8)

C#开发的OpenRA游戏之属性RenderSprites(8) 本文开始学习RenderSprites属性,这个属性是跟渲染有关的,因此它就摄及颜色相关的内容,所以我们先来学习一下调色板,这是旧游戏的图片文件保存的格式,如果放在现代来看,不会再采用这种方法,毕竟现在存储空间变大,便宜了,并…

做流体分析需要知道的两大核心问题:内流和外流

SOLIDWORKS Flow Simulation 是直观的流体力学 (CFD) 分析软件,可以快速轻松的分析产品内部或外部流体的流动情况,以用来改善产品性能和功能。SOLIDWORKS Flow Simulation将专业的流体分析进行功能优化,让普通机械设计师也能进行流体力学分析…

【Linux系统编程二十】:(进程通信2)--命名管道/共享内存

【Linux系统编程二十】:命名管道/共享内存 一.命名管道1.创建管道2.打开管道3.进行通信(server/client) 二.共享内存1.实现原理2.申请内存3.挂接4.通信5.去关联6.释放共享内存7.特性: 一.命名管道 上一篇介绍的一个管道是没有名字的 因为你打开那个文件…

在Python中调用imageJ开发

文章目录 一、在ImageJ中进行Python开发二、在Python中调用imageJ开发2.1、简介2.2、环境配置2.3、测试一2.4、测试二 Python imageJ 解决方案,采坑记录 一、在ImageJ中进行Python开发 原生ImageJ仅支持JS脚本(JAVAScript),而Im…

蓝桥杯物联网竞赛_STM32L071_2_继电器控制

Stm32l071原理图: PA11与PA12连接着UNL2803 ULN2803是一种集成电路芯片,通常被用作高电压和高电流负载的驱动器。 ULN2803是一个达林顿阵列,当输入引脚(IN1至IN8)被连接到正电源时,相应的输出引脚&#xff…

大数据-计算框架选型与对比

计算框架选型与对比 一、大数据平台二、计算框架分类1.批处理架构2.实时流处理架构3.流批一体处理架构 三、计算框架关键指标1.处理模式2.可伸缩性3.消息传递3.1 至少一次(at least once)3.2 至多一次(ai most once)3.3 恰好一次&…

Redis报错:JedisConnectionException: Could not get a resource from the pool

1、问题描述: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 2、简要分析: redis.clients.util.Pool.getResource会从JedisPool实例池中返回一个可用的redis连接。分析源码可知JedisPool 继承了 r…

【git】使用ssh

前言 git之前一直使用https,因为很方便随时随地都可以用。最近把代码托管到GitHub,使用https就使用不了。后面听同事说GitHub使用ssh是没问题的,就想着尝试一下。 git ssh配置 设置用户名和邮箱 git config --global use.name username g…

FFmpeg常用命令讲解及实战二

文章目录 前言一、ffmpeg 常用命令1、ffmpeg 的封装转换2、ffmpeg 的编转码3、ffmpeg 的基本编转码原理 二、ffprobe 常用参数1、show_format2、show_frames3、show_streams4、print_format5、select_streams 三、ffplay 的常用命令1、ffplay 常用参数2、ffplay 高级参数3、ffp…

教你看现货黄金实时报价

现货黄金投资市场上的交易软件众多,很多人不知道选择什么软件好,但选择主流软件MT4,基本就可以满足投资者不同的需求。本文为大家讲讲,为什么有那么多的投资者,都选择通过MT4获取实时的行情报价。 现货黄金市场波动激烈…

什么是网络爬虫技术?它的重要用途有哪些?

网络爬虫(Web Crawler)是一种自动化的网页浏览程序,能够根据一定的规则和算法,从互联网上抓取和收集数据。网络爬虫技术是随着互联网的发展而逐渐成熟的一种技术,它在搜索引擎、数据挖掘、信息处理等领域发挥着越来越重…

【MySQL】子查询

文章目录 子查询IN运算符子查询 VS 连接ALL关键字ANY关键字相关子查询 !EXISTS运算符select子句中的子查询from子句中的子查询 子查询 获取价格大于id为3的货物的商品 用到了内查询,获取id为3的商品的单价,把结构传给外查询 在where子句中编写子查询&am…

导数、方向导数、梯度方向、梯度

导数:自变量改变一定量时(大于或小于0),因变量改变多少 方向导数:限定在某一个方向上,自变量改变一定量时(大于0),因变量改变多少 梯度方向:方向导数最大的…

Java实现王者荣耀小游戏

主要功能 键盘W,A,S,D键:控制玩家上下左右移动。按钮一:控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能,伤害小兵并让小兵停止移动。技能三:攻击多个敌人并让小兵停止移动。普攻:对小兵造成基础伤害。小…

2023年最新PyCharm环境搭建教程(含Python下载安装)

文章目录 写在前面PythonPython简介Python生态圈Python下载安装 PyCharmPyCharm简介PyCharm下载安装PyCharm环境搭建 写在后面 写在前面 最近博主收到了好多小伙伴的吐槽称不会下载安装python,博主听到后非常的扎心,经过博主几天的熬夜加班,…