cpu使用率太高和jvm old占用太高排查过程

今天断断续续的收到管理平台的异常报警,cpu占用太高和jvm old占用太高,这个时候赶忙去排查缘由,下面记录了个人排查过程,可能里面还有不正确的地方,欢迎各位大佬指正,也欢迎你们关于相似的案例一块儿交流,下面就看我关于此次排查的过程把服务器

报警

  1. cpu使用率太高报警,接近100%
  2. 后续又来了jvm old太高报警

排查过程

  1. 首先打开监控平台看报警节点的cpu使用状况

监控pingcpu占用太高

  1. 登陆服务器找到占用 cpu太高线程堆栈信息

①经过 top 命令找到占用cpu最高的 pid[进程id]jvm

top

定位到pid是 1469线程

②经过 top -Hp pid 查看进程中占用cpu太高的 tid[线程id]debug

③经过 **printf pid |grep tid ** 把线程id转化为十六进制3d

④经过 jstack pid | grep tid -A 30 定位线程堆栈信息日志

占用cpu太高的线程有两个,其中一个是打印异常日志的(会new 对象),还有gc线程orm

打印异常堆栈对象

这个占用cpu根据堆栈信息就能够定位,看下代码,能够发现new 对象,且打印全栈信息blog

异常代码

其中ExceptionUtils.getFullStackTrace(e) 属于commons.lang包索引

全栈信息

能够发现上面两个方法会建立不少对象且打印堆栈信息占用内存

gc线程

堆栈信息

能够发现占用cpu太高的线程进行大量的gc

  1. 经过 jstat -gcutil pid 时间间隔 查看 jc 信息 gc信息

能够发现伊甸园区和老年代都已经满了,且进行了大量的FGC

指标介绍

S0:年轻代第一个幸存区(survivor)使用容量占用百分比

S1:年轻代第二个幸存区(survivor)使用容量占用百分比

E:年轻代伊甸园区(eden)使用容量占用百分比

O:老年代使用容量占用百分比

P:perm代使用容量占用百分比

YGC:从应用程序启动到当前采样时年轻代gc的次数

YGCT:从应用程序启动到当前采样时年轻代gc的时间

FGC:从应用程序启动到当前采样时老年代gc的次数

FGCT:从应用程序启动到当前采样时老年代gc的时间

GCT:从应用程序启动到当前采样时gc总耗时

  1. 导出dump文件,使用jdk自带的jvisualvm.exe分析

使用 jmap -dump:live,format=b,file=name.dump pid 导出dump文件,通常dump文件会比较大【个人这个2.94G】,而后下载【能够用 sz name.dump】到本地用jvisualvm【jdk自带的,在bin目录下】分析

首先看下dump文件的概要

dump概要

看看这些大对象都是什么

对象的类型

发现前面几个大对象都和 ElastaicSearchStatusException对象有关,而后这个管理平台用到es的地方只有一处,就是作数据漏斗,记录广告检索在哪些步骤过滤掉,方便产品和运营查看广告被过滤的缘由,而后翻开代码

构造es

其中 RestClientFactory.getRestClient().search(searchRequest)的 search方法一步一步跟进,发现抛ElasticSearchStatusException的地方

ElasticSearchStatusException

其中parseResponseException方法会抛出ElasticSearchStatusException异常,至于这两个地方具体是哪一个步骤抛的,能够继续研究es代码判断或者 远程debug断定,我这里先无论了,反正咱们能知道es出问题了

其实正是由于这里抛异常才会致使建立大量对象,由于异常在上面提到的打印异常日志的地方也会建立对象,老年代占用太高,致使大量fgc

但es这里为什么会有异常?

我登陆到es的管理平台查看es的索引,发现有的索引没有建立,索引的建立是有任务去建立并实时写入数据的,发现那个任务已经停了。

处理过程

  1. 找到相关的任务从新启动,并找任务中止的缘由,修复,并把丢失的索引建立并修复数据
  2. 在异常日志打印那最好加入流控【用Guava.RateLimiter控制】

小结

jvm old区占用太高排查思路

  1. top查看占用cpu高的进程
  2. jstat -gcutil pid 时间间隔 查看gc情况
  3. jmap -dump:live,format=b,file=name.dump pid 导出dump文件
  4. 用visualVM分析dump文件

cpu占用太高排查思路

  1. top 查看占用cpu的进程 pid

  2. top -Hp pid 查看进程中占用cpu太高的线程id tid

  3. printf '%x/n' tid 转化为十六进制

  4. jstack pid |grep tid的十六进制 -A 30 查看堆栈信息定位

欢迎关注公众号 【天天晒白牙】,获取最新文章,咱们一块儿交流,共同进步!

相关文章
相关标签/搜索