首页 > 其他分享 >记一次cpu飙升问题排查

记一次cpu飙升问题排查

时间:2022-12-27 10:05:11浏览次数:60  
标签:pid 飙升 问题 排查 线程 监控 gc pod cpu

前言

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

当时场景

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

1.正常的jvm监控曲线图

记一次cpu飙升问题排查_文件下载

2.产生问题的jvm监控曲线图

记一次cpu飙升问题排查_python_02

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

具体分析

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

  1. 进入pod之后,输入top查看各linux进程对系统资源的使用情况(因我这是事后补稿,资源使用不高,大家看步骤即可)
  2. 分析资源使用情况在当时的情况下,
当时我的pid为1的进程cpu上到了130(多核)那我认定就是java应用出问题了,control+c退出继续往下走
  1. 输入top -H -p pid 通过此命令可以查看实际占用CPU最高的的线程的id,pid为刚才资源使用高的pid号
  2. 出现具体线程的资源使用情况,表格里的pid代表线程的id,我们称他为tid
  3. 我记得当时的tip为746(上述图片只是我给大家重复步骤),使用命令printf "%x\n" 746,将线程tid转换为16进制
,因为我们线程id号在堆栈里是16进制的所以需要做一个进制转换
  1. 输入jstack pid | grep 2ea >gc.stack

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

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

、,然后登录跳板机,使用curl下载curl -o ​​http://ip地址/gcInfo.stack​​ 为方便演示,我在图中把ip换了一个假的

记一次cpu飙升问题排查_python_03

之后用同样的方法从本地下载跳板机就可以了,记得关闭python开启的建议服务嗷
  1. 把文件下载到了本地,打开查看编辑器搜索2ea,找到nid为2ea的堆栈信息,
,之后找到对应的impl根据行数分析程序
  1. 发现是在文件异步导出excel的时候,导出接口使用了公共列表查询接口,列表接口查询数据最多为分页200一批,而导出数据量每个人的权限几万到十几万不等

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

结束语

刚开始遇到这个情况也是比较害怕,报警直接开始循环了,自己也没有遇到过这种问题,经过这次的经历,自我感觉处理的还好,遇到问题先保证服务是否可用,如果所有pod都出现这个问题是否需要扩容pod或者重启pod,还好这个只是一个pod出现了这个问题,解决完心里也很开心。 当时心理历程就是我宁愿犯错也不愿什么都不做,太哈人了 = =

标签:pid,飙升,问题,排查,线程,监控,gc,pod,cpu
From: https://blog.51cto.com/u_15733182/5971329

相关文章

  • MySql 问题排查
    1、servicemysqldrestartSETGLOBALevent_scheduler=OFF;showvariableslike'slow_query_log';--setglobalslow_query_log='ON';showvariableslike'slow......
  • CPU 缓存一致性 MESI 协议
    为什么需要缓存一致目前主流电脑的CPU都是多核心的,多核心的有点就是在不能提升CPU主频后,通过增加核心来提升CPU吞吐量。每个核心都有自己的L1Cache和L2Cache,只......
  • 我对《Mysql死锁排查:insert on duplicate死锁一次排查分析过程 - 少说点话 - 博客园》
    原文在这里:Mysql死锁排查:insertonduplicate死锁一次排查分析过程 比较菜,看了一遍还是不懂死锁是怎么形成的。绕了很多圈才全理解。特此记录。 关于mysql版本我先......
  • 生动的入门经典!CPU超频全方位攻略…
    ·前言/CPU超频工具介绍前言:本文主要介绍如何进行CPU超频,内容非常简单,而且细致,比较适合DIY初级爱好者。现在一提起DIY,要是少了超频,就好像炒菜少了盐一样,索然......
  • CPU超频攻略
    ·芯随我动——CPU超频攻略对于游戏玩家来说,高性能​​显卡​​或CPU可以带来极限3D游戏乐趣,然而对于低配置的用户而言,尽管可以通过优化的方法来获得性能的提升,但要......
  • 第一章 对于程序员来说CPU是什么
    开头的热身问答里面的几个问题实话说对于一个初次接触的小白来说的确回答不上来。但是在阅读完第一章之后有了一些初次的了解。在第一章中我了解到CPU所负责的就是解释和......
  • linux排查CPU占用方法
    一、排查占用CPU的进程使用top命令,在大写打开的情况下按P键或者在大写没有打开的情况下按shift+P键,会按照CPU使用率的高低进行排序,查找使用率最高的进程获取进程PID。二、......
  • 记一次 .NET 某安全生产信息系统 CPU爆高分析
    一:背景1.讲故事今天是......
  • CPU的实模式
    实模式是指CPU的寻址方式,寄存器大小,指令用法等,是用来反应CPU在该环境下如何工作的概念。CPU的工作原理:CPU大体分为三个部分,控制、运算、存储单元。控制单元是CPU的控制中......
  • Kubernetes-集群ETCD故障排查
    前言记录一次本地虚拟机Kubernetes集群排障过程。修复内容包括:1、Kubernetes证书过期,2、ETCD数据损坏发现问题[root@xuegod63~]#kubectlgetnodesTheconnectiontothe......