java - JVM CPU100%,问题排查

2023-11-13

前段时间我们新上了一个新的应用,因为流量一直不大,集群QPS大概只有5左右,写接口的rt在30ms左右。
因为最近接入了新的业务,业务方给出的数据是日常QPS可以达到2000,大促峰值QPS可能会达到1万。
所以,为了评估水位,我们进行了一次压测。压测过程中发现,当单机QPS达到200左右时,接口的rt没有明显变化,但是CPU利用率急剧升高,直到被打满。在这里插入图片描述
压测停止后,CPU利用率立刻降了下来。
于是开始排查是什么导致了CPU的飙高。

					问题排查与解决

在压测期间,登录到机器,开始排查问题。
本案例的排查过程使用的阿里开源的Arthas工具进行的,不使用Arthas,使用JDK自带的命令也是可以。
在开始排查之前,可以先看一下CPU的使用情况,最简单的就是使用top命令直接查看:
在这里插入图片描述
可以看到,进程ID为3480的Java进程占用的CPU比较高,基本可以断定是应用代码执行过程中消耗了大量CPU,接下来开始排查具体是哪个线程,哪段代码比较耗CPU。
首先,下载Arthas命令:
curl -L http://start.alibaba-inc.com/install.sh | sh

启动
./as.sh

使用Arthas命令"thread -n 3 -i 1000"查看当前"最忙"(耗CPU)三个线程:在这里插入图片描述
通过上面的堆栈信息,可以看出,占用CPU资源的线程主要是卡在JDBC底层的TCP套接字读取上。连续执行了很多次,发现很多线程都是卡在这个地方。
通过分析调用链,发现这个地方是我代码中有数据库的insert,并且使用TDDL(阿里内部的分布式数据库中间件)来创建sequence,在sequence的创建过程中需要和数据库有交互。
但是,基于对TDDL的了解,TDDL每次从数据库中查询sequence序列的时候,默认会取出1000条,缓存在本地,只有用完之后才会再从数据库获取下一个1000条序列。
按理说我们的压测QPS只有300左右,不应该这么频繁的何数据库交互才对。但是,经过多次使用Arthas的查看,发现大部分CPU都耗尽在这里。
于是开始排查代码问题。最终发现了一个很傻的问题,那就是我们的sequence创建和使用有问题:在这里插入图片描述
是因为,我们每次insert语句都重新build了一个新的sequence,这就导致本地缓存就被丢掉了,所以每次都会去数据库中重新拉取1000条,但是只是用了一条,下一次就又重新取了1000条,周而复始。
于是,调整了代码,把Sequence实例的生成改为在应用启动时初始化一次。这样后面在获取sequence的时候,不会每次都和数据库交互,而是先查本地缓存,本地缓存的耗尽了才会再和数据库交互,获取新的sequence。在这里插入图片描述
通过实现InitializingBean,并且重写afterPropertiesSet()方法,在这个方法中进行Sequence的初始化。
改完以上代码,提交进行验证。通过监控数据可以看出优化后,数据库的读RT有明显下降:在这里插入图片描述
sequence的写操作QPS也有明显下降:
在这里插入图片描述
于是我们开始了新的一轮压测,但是发现,CPU的使用率还是很高,压测的QPS还是上不去,于是重新使用Arthas查看线程的情况。在这里插入图片描述
发现了一个新的比较耗费CPU的线程的堆栈,这里面主要是因为我们用到了一个联调工具,该工具预发布默认开启了TDDL的采集(官方文档中描述为预发布默认不开启TDDL采集,但是实际上会采集)。
这个工具在打印日志过程中会进行脱敏,脱敏框架会调用Google的re2j进行正则表达式的匹配。
因为我的操作中TDDL操作比较多,默认采集大量TDDL日志并且进行脱敏处理,确实比较耗费CPU。
所以,通过在预发布中关闭DP对TDDL的采集,即可解决该问题。

					总结与思考

本文总结了一次线上CPU飙高的问题排查过程,其实问题都不难,并且还挺傻的,但是这个排查过程是值得大家学习的。
其实在之前自己排查过很多次CPU飙高的问题,这次也是按照老方法进行排查,但是刚开始并没有发现太大的问题,只是以为是流量升高导致数据库操作变多的正常现象。
期间又多方查证(通过Arthas查看sequence的获取内容、通过数据库查看最近插入的数据的主键ID等)才发现是TDDL的Sequence的初始化机制有问题。
在解决了这个问题之后,以为彻底解决问题,结果又遇到了DP采集TDDL日志导致CPU飙高,最终再次解决后有了明显提升。
所以,事出反常必有妖,排查问题就是一个抽丝剥茧的过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java - JVM CPU100%,问题排查 的相关文章

  • Zabbix监控部署项目

    为什么选择Zabbix Zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案 zabbix 能监视各种网络参数 保证服务器系统的安全运营 并提供灵活的通知机制以让系统管理员快速定位 解决存在的各种

随机推荐

  • Springboot配置端口号

    springboot项目端口配置可以通过application yml或application properties指定 server port 80 或者 server port 8089 代码指定 springboot2 x以上版本Em
  • 关于AI自动写作的资料

    AI 自动写作 产品调研 第一种是AI新闻时事类写作 核心场景是在内容平台通过人 机混编的方式 机器帮助编辑 内容创作者 减少重复劳动 提高生产效率 主要调研了今日头条的xiaomingbot 腾讯的Dreamwriter 百度的writi
  • iOS架构师_消息转发机制

    1 动态方法解析 对象在收到无法处理的消息时 会调用下面的方法 前者是调用类方法时会调用 后者是调用对象方法时会调用 未实现类方法调用 BOOL resolveClassMethod SEL sel 未实现实例方法调用 BOOL resol
  • osg学习(七十)如何根据视口对象自动调整视点位置、距离

    osgGA CameraManipulator cpp void CameraManipulator computeHomePosition const osg Camera camera bool useBoundingBox doubl
  • Unity的2D图集处理,并切割出一张张小图片

    转载请注明出处 http blog csdn net hongyouwei article details 45011315 在我们找资源的时候 有时候会遇到那种把一堆图片放进一张png图片里面的情况 在做2D游戏的时候 我们往往需要将里面
  • jackson自定义全局序列化、反序列化

    需要自定义Jackson序列化和反序列化有两种方式 一种是全局定义 一种是非全局定义 先来看看全局定义 全局定义的步骤如下 以定义一个localDateTime的序列化和反序列化为例 一 创建序列化类 创建一个序列化类然后继承JsonSer
  • 基于JavaWeb(JSP+Servlet+MySQL)编程实现员工信息的添加、修改、删除、列表显示。

    1 项目结构 2 页面主要代码 2 1员工添加页面代码以及效果图 add jsp 员工添加
  • linux 修改用户密码的几种方法

    1 passwd 命令 手动修改 root localhost testuser passwd testuser Changing password for user testuser New password Retype new pas
  • Spring Factories

    该文章转载自 https blog csdn net lvoyee article details 82017057 Spring Boot中有一种非常解耦的扩展机制 Spring Factories 这种扩展机制实际上是仿照Java中的S
  • 简说数据库事务的ACID

    事务是应用程序中一系列严密的操作 所有操作必须成功完成 否则在每个操作中所作的所有更改都会被撤消 也就是事务具有原子性 一个事务中的一系列的操作要么全部成功 要么一个都不做 原子性 Atomicity 一致性 Consistency 隔离性
  • postman 模拟请求中添加 header,post请求中传json参数

    1 GET 请求 2 Post 请求 请求参数为Json header中带有参数 问题延伸 GET请求不能够 添加 Body 吗 答案 转载于 https www cnblogs com zacky31 p 8808110 html
  • 【网络安全】——区块链安全和共识机制

    区块链安全和共识机制 摘要 区块链技术作为一种分布式去中心化的技术 在无需第三方的情况下 使得未建立信任的交易双方可以达成交易 因此 区块链技术近年来也在金融 医疗 能源等多个行业得到了快速发展 然而 区块链为无信任的网络提供保障的同时 也
  • 《算法导论》总结与分析

    算法导论总结与分析 分治 strassen算法 介绍 步骤 正确性证明 复杂度分析 排序 堆排序 介绍 步骤 构建 排序 优先队列 复杂度分析 快速排序 介绍 步骤 复杂度分析 最坏情况 最好情况 线性时间排序 介绍 步骤 复杂度分析 数据
  • 课堂小作业之3位水仙花数计算

    3位水仙花数计算 描述 3位水仙花数 是指一个三位整数 其各位数字的3次方和等于该数本身 例如 ABC是一个 3位水仙花数 则 A的3次方 B的3次方 C的3次方 ABC
  • 组合优化技术

    组合优化是指在离散领域内 寻找最优解的问题 在通信工程中 组合优化的应用非常广泛 例如在无线通信系统中 可以使用组合优化算法来优化信道资源分配 功率控制 调制方式等问题 组合优化问题通常包含以下要素 决策变量 表示问题的解 通常是一个离散的
  • spring cloud版本由1.5.x升级到2.x所遇到的坑

    众所知周 spring cloud 1 5版本与2 x版本差异很大 官方没有做向下兼容 导致大家对于升级spring cloud版本都非常慎重 此处 首先推荐阅读官方给出的迁移手册 Spring Boot 2 0 Migration Gui
  • ChatGPT学习相关资料整理

    ChatGPT学习相关资料整理 关于ChatGPT的相关咨询和新闻 ChatGPT能力起源 https mp weixin qq com s 4l0ADjdsCxSVvBeVKxSqWA ChatGPT的发展历程 https zhuanla
  • 生产数据采集MDC的总体思路

    一 数控机床通过网口连到局域网 MDC服务器与数控机床通讯 定时取得所需数据 将数据写入数据库 二 MES对数据库中的数据进行分析 展示到大屏上 我这里是机械制造型企业 以上步骤已经完成 有相同需求的朋友 欢迎一起交流细节
  • SQL INSERT INTO 语句

    INSERT INTO 语句用于向表中插入新记录 语法 指定列插入数据 INSERT INTO table name colnum1 colnum2 column3 VLAUES value1 value2 value3 不指定列插入数据
  • java - JVM CPU100%,问题排查

    前段时间我们新上了一个新的应用 因为流量一直不大 集群QPS大概只有5左右 写接口的rt在30ms左右 因为最近接入了新的业务 业务方给出的数据是日常QPS可以达到2000 大促峰值QPS可能会达到1万 所以 为了评估水位 我们进行了一次压