首页 > 其他分享 >频繁GC导致CPU飙高,排查笔记实战

频繁GC导致CPU飙高,排查笔记实战

时间:2024-03-01 09:24:38浏览次数:29  
标签:调用 .. 飙高 GC 堆栈 catch 告警 异常 CPU

 

一、问题场景

测试环境突然报警CPU飙高,查看日志发现不停的在做GC操作,8个GC线程把CPU打爆。

二、问题排查

首先就是保留现场,打印堆栈信息。

1.打印线程运行信息

jstack 85090 > code-api.log

2.打印堆信息

jmap -dump:format=b,file=heapdump1.hprof 85090

3.分析dump文件

图中可以看到,StackTraceElement的数量非常惊人。

StackTraceElement每个元素表示单独的一个堆栈帧。所有的堆栈帧(堆栈顶部的那个堆栈帧除外)都表示一个方法调用。

因此可以确定是某个方法做了无限递归调用,不停的开启新的栈帧

4.分析线程运行日志

发现所有的工作线程不停的调用AlarmService中的这个方法,那问题基本就定位到了。

5.查看AlarmService

发现方法是调用了一个RPC请求,原来是测试环境服务器迁移,导致没法调通原有ip,将ip改为域名后即可。

三、问题分析

1.查看Feign配置

RPC调用使用了Feign,经排查配置了NEVER_RETRY(从不重试)参数,为什么还会不停的重新请求呢。

2.AOP

查看了告警机制的实现,是通过AOP切面来捕获异常进行处理。
也就是说告警Service连接告警中心服务器,5秒后超时报了超时异常,这个超时异常也被AOP捕获了,之后告警Service要将超时异常报给告警中心,但告警中心无法连接还是会报超时异常,就导致了不停递归打开新方法,问题到这里就完全搞清了。

四、解决方法

这里发现了潜在的坑,就是告警中心服务器如果不稳定,势必会影响线上服务的正常运行,这是不可接受的,因此要想办法避免这种情况的再次发生。

1.try-catch

  • 对alermService中的方法添加try-catch,发现居然并不生效,并不能catch到异常。
  • 后来分析是Service下层调用RPC接口时产生的异常,被catch之前就被aop先捕获到了。
  • 把try-catch加到rpc层,问题解决。

不过这种解决方式不够优雅,不能把每rpc调用都try-catch处理。

2.aop

通过aop配置来解决。
原有为

@Pointcut(execution(* com.qbq.test..*.*(..)))

修改为

@Pointcut(execution(* com.qbq.test..*.*(..)) && !execution(* com.qbq.test.alarm..*.*(..)))

即aop的切面不再且alarm包,不会再捕获alarm包中的异常了。

经验证,问题解决。

标签:调用,..,飙高,GC,堆栈,catch,告警,异常,CPU
From: https://www.cnblogs.com/jiaodaoniujava/p/18046122

相关文章

  • 【转发】JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!
    线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top三连,然后依次jstack、jmap伺候,具体问题具体分析即可......
  • 线上FullGC问题排查实践
    一、问题发现与排查1.1找到问题原因问题起因是我们收到了jdos的容器CPU告警,CPU使用率已经达到104%观察该机器日志发现,此时有很多线程在执行跑批任务。正常来说,跑批任务是低CPU高内存型,所以此时考虑是FullGC引起的大量CPU占用(之前有类似情况,告知用户后重启应用后解决......
  • FullGC详解
    前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解释器。 它提供了一种独立于操作系统的运行环境,使得Java程序在任何支持JVM的计算机上都可以运行。JVM负责加载、验证、解释、执行和垃圾回收Java字节代码,并为......
  • 记录 Ubuntu20.04 配置 vscode/gcc/g++ 和 java17
    换源问题在网上找的教程,基本都是安装好Ubuntu后立刻更换软件下载源,但20.04版本我换源之后非常慢,并且后续安装软件时出现依赖问题无法解决等等,我试了清华源和自动选择最佳服务器都不行,最后只能重装。vscode参考:Ubuntu20.04下安装VSCode(配置C/C++开发环境)建议用sudosnapinstal......
  • 设置CPU亲和性
    即,某个线程固定跑在某个CPU的(某个)核上/** *设置当前线程cpu亲和性 *@paramicpu索引,如果为-1,那么取消cpu亲和性 *@return是否成功,目前只支持linux---代码块来自ZLtookit */boolsetThreadAffinity(inti){#if(defined(__linux)||defined(__linux__))&&!defined(......
  • SpringCloud系列之(十三)FAQ
    关于一些可能出现的报错1.DruidDataSource:testWhileIdleistrue,validationQuerynotset工程启动时可能会报如下错误,这是DruidDataSource保持链接的测试,不影响我们的应用。2.idea未监测到yml文件出现这种情况会造成文件内写配置的时候没有提示正常应该是这样的......
  • SpringCloud系列之(十二)SpringCloud Sleuth分布式请求链路追踪
    SpringCloudSleuth分布式请求链路追踪一、概述1.应用场景​ 在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前端请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请......
  • SpringCloud系列之(十一)SpringCloud Stream消息驱动
    SpringCloudStream消息驱动企业中常用的消息中间件ActiveMQRabbitMQRocketMQKafka一、消息驱动概述1.为什么引入SpringCloudStream​ 消息中间件的产品众多(ActiveMQ、RabbitMQ、RocketMQ、Kafka...),学习成本高​ 一个系统中可能使用了多种消息中间件,切换/维护/开发成本......
  • SpringCloud系列之(九)服务配置
    服务配置目前在用的服务配置+服务总线的三套方案Config+BusNaccos(Alibaba)Apollo(携程)上海地区一、SpringCloudConfig分布式配置中心1.概述1.1分布式系统面临的配置问题​ 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现......
  • SpringCloud系列之(八)服务网关
    服务网关类比医院的分诊台一、Zuul由Netflix团队研发,不再使用官网:https://github.com/Netflix/zuul/wiki1.Zuul1.x模型​ Springcloud中所集成的Zuul版本,采用的是Tomcat容器,使用的是传统的ServletI0处理模型。​ 学过尚硅谷web中期课程都知道一个题目,Servlet的生命周期......