zoukankan      html  css  js  c++  java
  • 记一次CPU飙升BUG

    一.前言

        上线后,CPU飙升到100%,怎么办?马上重启?大错特错,马上重启只会让这个雷石沉大海,治标不不治本,等待你的下次的历史重演!

    二.现象

        监控告警,某机器的CPU飙升到100%

    三.分析

    第一步,通过以下指令找到CPU高的进程号

    top -p `pgrep -d , java`

    第二步,通过以下指令找到CPU高的线程号

    top -Hp 进程号

    第三步,通过以下指令把线程号转换成16进制

    printf"%x
    " 线程号

    第四步,通过以下指令打印线程的stacktrace

    jstack 进程号 |grep 16进制线程号 -A 50

    第五步,分析stacktrace的信息,定位哪个地方导致的CPU占用率高,以下是截图

    第六步,从上面的截图可以可以定位到了FundClearRecordCtrl这个类里面的存在HashMap使用不当,导致死循环引发的CPU飙升

      1、正常情况下

    2、线程不安全,多线程并发的情况下,假如两个线程T1和T2,会造成e1.next = e2,而e2.next = e1,即形成环形,会导致死锁,然后现象就是CPU飙升

    排查方向基本明朗,接下来让我们回到具体问题中,来解决问题!

    四.解决

    HashMap线程不安全,对于久经沙场的小伙伴们来说,这种认知还是有的,但是为啥还会入坑呢?

    这个类没有明显的把HashMap作为公共变量,应该不存在多线程去操作HashMap的情况呀?

    不能怪小伙伴,这个bug还真不好找,隐藏得有点深!

    小伙伴也是无意中踩了坑,为什么说这个BUG隐藏得深呢?

    由于DB资源紧缺,为了减少DB的直接操作,在DBUtil加了缓存,小伙伴在调用DBUtil的情况下,拿到的缓存的HashMap,此时该HashMap就是一个公共资源了,对于线程不安全的HashMap在多线程并发的情况下,理所当然的就进入了死循环!

    总结

    1、遇到CPU飙升,第一时间不要重启,先找到CPU高的类,确定好排查方向;

    2、HashMap线程不安全,多线程并发场景下建议使用ConcurrentHashMap;

  • 相关阅读:
    Cookie 干货
    element-ui 框架中使用 NavMenu 导航菜单组件时,点击一个子菜单会出现多个子菜单同时展开或折叠?
    数组遍历的方法
    前端网页字体
    样式小收藏:完成、错误、提示动态图标样式
    多语言网站利器 rel="alternate" hreflang="x"
    网页中文章显示一部分,然后“查看全文”
    仿水滴筹中快捷留言祝福、随机生成祝福
    TypeScript知识点
    前端项目经验
  • 原文地址:https://www.cnblogs.com/Soy-technology/p/10632607.html
Copyright © 2011-2022 走看看