Arthas线上故障案例分析——内存使用率上升,负载突然变高

news2024/10/7 20:31:08

使用经验分享

线上故障排查思路:
1、紧急处理,优先保障服务可用(如切换vip,主备容灾)
2、保留第一现场,通过jstack -l {pid} > jvmtmp.txt ,打印栈信息 (后续可以在gceasy官网上传报文进行分析)
3、通过arthas工具进行线上故障问题。执行命令如下

dashboard,优先通过看板,找到问题线程id
thread {id},查看问题线程的栈信息
watch {class} {method} {ognl表达式},观察问题方法的上下文

前言

arthas是阿里的一款线上故障分析工具,对jvm当前的上线文可以进行实时监控,下文会介绍我在实际过程中是如何使用arthas来定位问题的。

背景

笔者像往常一样coding,突然收到一条消息告警“服务器内存使用率>95%”。随即第一时间访问部署在该服务器的系统,系统能够响应请求,但是响应时间变得非常慢(原本毫秒级可以响应的请求,变成秒级响应)。通过看板可以得到,服务器的负载上升(最近5m)

这已经开始影响到用户的正常使用了。确认仅是web服务受到影响,其他存储服务正常的情况下,我开始联系运维将服务切换到备机(应急方案)。系统这才恢复正常。

故障分析

当人运气还是背时,躺着也要背锅。我倒要看看,究竟是谁在搞鬼。
献祭出法宝Arthas~,命令行噼里啪啦一顿敲

dashboard

通过看板形式,分析当前jvm整体状态

[arthas@22683]$ dashboard

(图一)
在这里插入图片描述

(图二)
在这里插入图片描述

通过图片可以看出,线程http-nio-8070-exec-38执行耗时54分钟,并且伴随着大量的GC线程。初步判断线程可能存在深度递归或者死循环,产生了大量内存,JVM疲于GC,GC期间系统会发生STW(Stop The World),且占用了大量CPU资源,因此导致其他服务线程无法正常工作。

为了验证猜想,我们利用火焰图进行分析

profiler

profiler(火焰图)记录的是一段时间内,方法的执行次数与频率,并以报表的方式进行展示

# 火焰图开启后,arthas需要时间采集样本,这里我们等待5分钟
[arthas@22683]$ profiler start
# 关闭火焰图,停止采集。arthas会生成火焰图文件,拷贝到本地打开瞅瞅
[arthas@22683]$ profiler stop

(火焰图)
在这里插入图片描述

可以看到,GC占有率达到98.93%,jvm大部分时间都用来回收内存,现在是没有空闲去处理服务请求的。

得出结论:频繁GC是系统卡顿的直接原因.

thread

知道问题线程后,我们可以利用thread分析下线程状态

# 196为问题线程ID
[arthas@22683]$ thread 196
"http-nio-8070-exec-38" Id=196 RUNNABLE
    at org.apache.commons.collections4.iterators.UnmodifiableIterator.next(UnmodifiableIterator.java:76)
    at com.epoch.bdp.bill.util.BillDataUtils.getSubAreaData(BillDataUtils.java:993)
    at com.epoch.bdp.bill.util.BillDataUtils.getSubAreaData(BillDataUtils.java:1005)
    at com.epoch.bdp.bill.util.BillDataUtils.getAreaData(BillDataUtils.java:948)
    at com.epoch.bdp.bill.util.BillDataUtils.getRowById(BillDataUtils.java:4714)
    at com.epoch.ifp.expenseclaim.service.billvaluechange.AmortizeAmountChangeService.doProcess(AmortizeAmountChangeService.java:49)
    at com.epoch.ifp.expenseclaim.service.listener.BillValueChangeButterflyEffectListener.onApplicationEvent(BillValueChangeButterflyEffectListener.java:87)
    at com.epoch.ifp.expenseclaim.service.listener.BillValueChangeButterflyEffectListener.onApplicationEvent(BillValueChangeButterflyEffectListener.java:34)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:402)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:359)
    at com.epoch.infrastructure.util.service.ApplicationContextAwareUtils.publishEvent(ApplicationContextAwareUtils.java:181)
    at com.epoch.bdp.bill.model.vo.billdata.BillRowData.setDataAfter(BillRowData.java:196)
    at com.epoch.bdp.bill.model.vo.billdata.BillRowData.setData(BillRowData.java:495)
    at com.epoch.bdp.bill.model.vo.billdata.BillRowData.setData(BillRowData.java:400)

从上往下追溯业务代码,排除工具类Utils,最终我们得到可能是以业务代码的AmortizeAmountChangeService.doProcess

monitor

为了验证我们得到的业务代码(AmortizeAmountChangeService.doProcess)是否是问题发生处,我们可以利用monitor进行监控,每5秒打印该方法的调用频率:

monitor -c 5 com.epoch.ifp.expenseclaim.service.billvaluechange.AmortizeAmountChangeService doProcess

在这里插入图片描述

平均处理时间0.02秒,属于正常响应。但是5秒内该方法处理时间高达700~800次,明显不太正常,由此可以推断该方法存在大量调用,验证了上述“线程可能存在深度递归或者死循环”的问题

watch

通过代码分析,AmortizeAmountChangeService.doProcess用于监听资金变更时修改。因此我们利用watch方法,尝试打印它的上下文,找到关键单据编码

watch com.epoch.ifp.expenseclaim.service.billvaluechange.AmortizeAmountChangeService doProcess "params[0].getBillDataVO()" -x 2 | grep billCode

在这里插入图片描述
得到单据号HTFK20230515000310,拿着这个单据号去业务系统查询,分析系统的操作痕迹

结论

最终,我们定位到了故障起因。用户在上传大批量发票的时候,会触发金额修改接口,该接口在大量并发请求时会占用过量系统资源。当系统资源不够使用时发生频繁GC,最终消耗大量CPU资源,系统卡顿。

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

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

相关文章

Maven插件开发及Demo演示

引言 maven不仅仅只是项目的依赖管理工具,其强大的核心来源自丰富的插件,可以说插件才是maven工具的灵魂。本篇文章将对如何自定义maven插件进行讲解,希望对大家有所帮助。 背景 讲如何开发maven插件之前,不妨先来聊一下什么是…

STM32速成笔记—定时器

文章目录 一、什么是定时器二、定时器有什么用三、通用定时器详细介绍3.1 时钟来源3.2 预分频器,计数器,自动重装载寄存器3.2.1 预分频器3.2.2 计数器3.2.3 自动重装载寄存器 3.3 触发控制器 四、PWM4.1 什么是PWM4.2 什么是占空比4.3 STM32F1 PWM介绍4.…

【Python 随练】打印菱形图案

题目: 打印出如下图案(菱形) ********* ****************简介: 在本篇博客中,我们将使用Python代码打印一个菱形图案。我们将提供问题的解析,并给出一个完整的代码示例来生成这个菱形图案。 问题分析&am…

阿里云开源离线同步工具DataX3.0,用于数据仓库、数据集市、数据备份

DataX是阿里云开源的一款离线数据同步工具,支持多种数据源和目的地的数据同步,包括但不限于MySQL、Oracle、HDFS、Hive、ODPS等。它可以通过配置文件来定义数据源和目的地的连接信息、数据同步方式、数据过滤等,从而实现数据的高效、稳定、可…

C++初阶—完善适配器(反向迭代器)

目录 0. 前言 1、反向迭代器定义 2、反向迭代器需要实现的相关函数 3、反向迭代器分析 4、针对vector物理空间结构分析 5、针对list物理空间结构分析 6、反向迭代器适配器的实现及测试 0. 前言 本篇文章主要根据前面所实现的STL中支持迭代器的容器进行完善,使…

Mysql数据库日志和数据的备份恢复(去看一看海吧)

文章目录 一、数据库备份的重要性二、数据库备份的分类1.物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。2.逻辑备份:对数据库逻辑组件(如表等数据库对象)的备份,导出sql文件。3.完全…

被卖到 2w 的 ChatGPT 提示词 Prompt 你确定不想要吗?

有朋友说,用 ChatGPT 生成的文案刻板化,格式化,而且往往也不是我想要的。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 想要用好 ChatGPT 人工智能工具太难了,想一个好的提示词,也太不容易了,ChatGPT 就像一个宝藏…

3ds MAX绘制休闲椅

首先绘制一个长方形,并用上边两端点和底边中点绘制一个样条曲线 将上述曲线旋转复制,形成一个交叉的样条曲线,并移动两端点的位置,形成一上一下的结构 这就是休闲椅的大致形状 通过创建线将四个端点连接起来,形成空间…

UI组件——滑块简介

滑块控件是调整音量和亮度等设置的首选解决方案。它们立即生效,并允许用户通过移动手柄来微调值。滑块可以很好地达到目的,尤其是在精度不是很重要的情况下。 但是,这些控件可能会令人困惑,难以抓取并设置为精确值。另外&#xf…

人类智能的未来在于东西方智能的融合

有人认为:“只有时空的对齐,没有价值的对齐,智能或许就是智障”,即智能技术必须要与人类的价值观念和道德标准相一致,否则它所产生的结果可能会对人类社会造成负面影响。在现代社会中,智能技术已经越来越广…

【Elacticsearch】 分片副本机制,集群发现机制 ,负载机制,容错机制,扩容机制, 分片路由原理

集群发现机制 Elasticsearch采用了master-slave模式, ES会在集群中选取一个节点成为主节点,只有Master节点有资格维护全局的集群状态,在有节点加入或者退出集群的时候,它会重新分配分片,并将集群最新状态发送给集群中其…

Netty中的零拷贝机制

零拷贝机制(Zero-Copy)是在操作数据时不需要将数据从一块内存区域复制到另一块内存区域的技术,这样就避免了内存的拷贝,使得可以提高CPU的。零拷贝机制是一种操作数据的优化方案,通过避免数据在内存中拷贝达到的提高CPU性能的方案。 1.操作系统的零拷贝机制 操作系统的存储空间…

C++基础(5)——类和对象(3)

前言 本文主要介绍了C中类和对象的基本知识 4.3.1:成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 C语言中结构体为空时使用sizeof()打印的结果是0 C中类和结构体为空,用sizeof关键字可以算出是空类占1字节、…

OpenCV项目开发实战--图像识别和目标检测之(手写数字分类)

文末附基于Python和C++两种方式实现的测试代码下载链接 在本教程中,我们将使用 OpenCV 构建一个简单的手写数字分类器。一如既往,我们将分享用 C++ 和 Python 编写的代码。 最后两个帖子旨在提供了解基础知识所需的教育。这篇文章旨在提供成功实施图像分类器所需的培训。那么…

SpringBoot集成阿里云OSS实现图片存储服务

SpringBoot集成阿里云OSS实现图片存储服务 1、OSS概述2、账号申请2.1 购买服务2.2 创建Bucket 3、抽取模板工具OssProperties配置类OssTemplate模板对象AutoConfiguration配置类yml配置内容 4、测试 阿里云OSS(Object Storage Service)是一种强大的云存储…

ASO优化之关于应用商店的展示量

应用的展示数据代表应用在整个应用市场内的曝光次数,被展示的位置包括:首页精品推荐,搜索结果列表,应用详情页等。 应用的展示数据是衡量ASO搜索优化的关键指标。当关键词的覆盖数增加了,展示的次数没有增加&#xff…

【Nacos源码系列】服务注册的原理

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 文章目录 Nacos介绍服务注册客户端注册服务端 总结 Nacos介绍 Nacos是一个基于云原生的动态服务发现、配置管理和服务治理平台&#xff…

cppzmq编译和使用(ubuntu22.04)

libzmq libzmq,也称为 ZeroMQ,是一个高性能、异步消息传递库,用于构建分布式和并发系统。它提供了简单而强大的原语,使得开发者可以方便地在应用程序之间进行异步通信。 以下是对 libzmq 的详细介绍: 简介&#xff1…

VOC数据洞察在淘宝详情页的应用与实践

本专题共10篇内容,包含淘宝APP基础链路过去一年在用户体验数据科学领域(包括商详、物流、性能、消息、客服、旅程等)一些探索和实践经验,本文为该专题第二篇。 在商详页基于用户动线和VOC挖掘用户决策因子带来浏览体验提升&#x…

如何使用 PowerPoint 2021 制作演示文稿(PPT)?

软件安装:办公神器office2021安装教程,让你快速上手_正经人_____的博客-CSDN博客 引言 PowerPoint 是一款非常常用的演示文稿制作工具,它可以帮助您创建漂亮的幻灯片,展示您的想法和信息。如果您是 PowerPoint 的新手&#xff…