首页 > 其他分享 >记一次new ArrayList导致的cpu飙升问题排查

记一次new ArrayList导致的cpu飙升问题排查

时间:2024-04-24 17:00:11浏览次数:14  
标签:监控 ArrayList pid 线程 jvm new pod cpu gc

参考:https://mp.weixin.qq.com/s/8JDPOAvmKYP8JZxau45hdw

  • 前言
  • 当时场景
  • 正常的jvm监控曲线图
  • 产生问题的jvm监控曲线图
  • 具体分析
  • 结束语

昨天线上容器突然cpu飙升,也是第一次排查这种问题所以记录一下~

前言

首先问题是这样的,周五正在写文档,突然收到了线上报警,发现cpu占用达到了90多,上平台监控系统查看容器,在jvm监控中发现有一个pod在两个小时内产生了61次youngGc一次fullGc,这个问题特别严重且少见,由于我之前也没有排查过此类问题,所以也是百度,但整个过程也有一些自己的思考,所以跟大家分享一下~

当时场景

我先给大家看一下一副正常的gc曲线监控(为保密性,我自己按照平台监控画了出来):

正常的jvm监控曲线图

图片正常的jvm监控曲线图

产生问题的jvm监控曲线图

图片产生问题的jvm监控曲线图

可以看的出来,正常情况下该系统很少gc(具体看业务系统使用情况、jvm内存分配),但是在图二中出现了大量异常的gc情况甚至触发了fullGc,所以我当时立马进行了分析。

具体分析

首先异常gc的情况只出现在一个pod上(系统有多个pod),在监控系统找到对应的pod,进入pod内部查看问题原因,排查问题一定要冷静

  1. 进入pod之后,输入top查看各linux进程对系统资源的使用情况(因我这是事后补稿,资源使用不高,大家看步骤即可)

图片

图片
  1. 分析资源使用情况在当时的情况下

图片top

当时我的pid为1的进程cpu上到了130(多核)那我认定就是java应用出问题了,control+c退出继续往下走

  1. 输入top -H -p pid 通过此命令可以查看实际占用CPU最高的的线程的id,pid为刚才资源使用高的pid号

图片top -H -p pid

  1. 出现具体线程的资源使用情况,表格里的pid代表线程的id,我们称他为tid

图片tid

  1. 我记得当时的tip为746(上述图片只是我给大家重复步骤),使用命令printf "%x\n" 746,将线程tid转换为16进制

图片tid转换为16进制

因为我们线程id号在堆栈里是16进制的所以需要做一个进制转换

  1. 输入jstack pid | grep 2ea >gc.stack
jstack pid | grep 2ea >gc.stack

图片jstack

解释一下,jstack是jdk给提供的监控调优小工具之一,jstack会生成JVM当前时刻的线程快照,然后我们可以通过它查看某个Java进程内的线程堆栈信息,之后我们把堆栈信息通过管道收集2ea线程的信息,然后将信息生成为gc.stack文件,我随便起的,随意

  1. 当时我先cat gc.stack 发现数据有点多在容器里看不方便,于是我下载到本地浏览,因为公司对各个机器的访问做了限制,我只能用跳板机先找到一台没用的机器a,把文件下载到a然后我再把a里的文件下载到本地(本地访问跳板机OK),先输入python -m SimpleHTTPServer 8080,linux自带python,这个是开启一个简单http服务供外界访问

图片开启http服务

然后登录跳板机,使用curl下载curl -o http://ip地址/gcInfo.stack

为方便演示,我在图中把ip换了一个假的

图片curl

之后用同样的方法从本地下载跳板机就可以了,记得关闭python开启的建议服务嗷

  1. 把文件下载到了本地,打开查看编辑器搜索2ea,找到nid为2ea的堆栈信息

图片找到nid为2ea的堆栈信息

之后找到对应的impl根据行数分析程序

  1. 发现是在文件异步导出excel的时候,导出接口使用了公共列表查询接口,列表接口查询数据最多为分页200一批,而导出数据量每个人的权限几万到十几万不等

图片导出excel

并且该判断方法使用了嵌套循环里判断,且结合业务很容易 get 不到 value,Java 下的new ArrayList 就是返回一个 List 集合(好像不用说这么细 (;一_一 ),在整个方法结束之前,产生的 lists生命周期还在所以发生多次gc触发重启之后还影响到了别的pod。然后对代码进行了fix,紧急上线,问题解决~

结束语

遇到生产问题,大家不要害怕,遇到问题先保证服务是否可用,然后通过有限的信息层层解析,找出最终的问题。如果你会 arthas,排查起来会更轻松!

标签:监控,ArrayList,pid,线程,jvm,new,pod,cpu,gc
From: https://www.cnblogs.com/kuangke/p/18155865

相关文章

  • Docker(二十)-Docker容器CPU、memory资源限制
    背景在使用docker运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的CPU、内存和磁盘资源。如果不对容器使用的资源进行限制,那么容器之间会互相影响,小的来说会导致容器资源使用不公平;大的来说,可......
  • 解决安装 ollama 在 wsl2 中报 WARNING: No NVIDIA/AMD GPU detected. Ollama will ru
    首先要确保wsl2版的cuda环境已经安装[非必须]如果已安装了环境但是nvidia-smi找不到,可能是未加入环境变量,请将它的路径/usr/lib/wsl/lib加入PATHollama在/usr/bin/找不到nvidia-smi位置,所以会有如上警告,所以需要创个链接指向:方法一:sudoln-s$(whichnvid......
  • Linux命令之查找CPU资源利用情况(lscpu和top详解)
    1.lscpu命令:获取CPU架构完整详细信息,例如架构信息,CPU模式,CPU频率,CPU核心数、线程数、缓存大小。在终端输入“lscpu”: 参数详解:【Architecture:x86_64】:架构信息,表示系统的CPU架构为x86_64,表示64位架构;【CPU op-mode(s):32-bit,64-bit】:CPU的运行模式,表示支持32位和64位......
  • 搭建ChatGLM2-6B CPU版本
    https://huggingface.co/THUDM/chatglm3-6b-32khttps://github.com/THUDM/ChatGLM31、前言1.1、简介清华开源LLMChatGLM2-6B是一款对汉语支持不错的大语言模型。由于完全开源,可对其进行微调,对研究LLM本身,以及基于预训练LLM进行领域知识微调验证都有帮助,在国内受到普遍欢迎。......
  • D - New Friends
    D-NewFriendshttps://atcoder.jp/contests/abc350/tasks/abc350_d 思路此sns网络,可能包括若干个连同子图,对于每个子图,计算连通子图中成员数目,和连接数目,计算全连接子图,需要的总的连接数目,减去当前连接数目,得到每个连通子图的还需要建立的连接数目,累加所有子图......
  • newstartweek3部分题解
    64位利用格式化字符串修改got表例题:newstartweek3putorsystem老规矩先checksec和代码审计:看到开了canary和NX(但是对于这道题的话canary是没有用的),然后源码这边也没有发现有system函数,也没有后门函数,所以我们需要自己在libc里面找,然后就有bin/sh那么我们就只用把got表里......
  • 【转载】Java函数式编程——为什么new Thread()中要用函数式编程
    面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法——强调做什么,而不是以什么形式做。面向对象的思想:做一件事情,找一个能解决这个事情的对象,调用对象的方法,完成事情.函数式编程思想:只要能获取到结果,谁去做的,怎么做的都不重要,......
  • mac的cpu某段时间占用很高
    pmset-gsched,会发现如下所示:列出所有的计划事件wakepoweronat9:50AMeverydayScheduledpowerevents:[0]wakeat04/21/2401:38:54by'com.apple.alarm.user-visible-WeeklyUsageReport'[1]wakeat04/21/2405:37:09by'com.apple.alarm.user-visib......
  • java使用Workbook workbook = new XSSFWorkbook(inputStream);导出数据频繁GC
    由于xlsx底层使用xml存储,占用内存会比较大,官方也意识到这个问题,在3.8版本之后,提供了SXSSFWorkbook来优化写性能原来代码Workbookworkbook= newXSSFWorkbook(inputStream);优化后代码Workbookworkbook= newSXSSFWorkbook(newXSSFWorkbook(inputStream));此处有坑,请往......
  • New!界面控件DevExpress WinForms v24.1预览版抢先体验
    DevExpressWinForm拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!在之前的文章中(点击这里回顾>>),我们为大家介绍了DevE......