记一次CPU飙升BUG
一.前言
上线后,CPU飙升到100%,怎么办?马上重启?大错特错,马上重启只会让这个雷石沉大海,治标不不治本,等待你的下次的历史重演!
二.现象
监控告警,某机器的CPU飙升到100%
三.分析
第一步,通过以下指令找到CPU高的进程号
top -p `pgrep -d , java`
第二步,通过以下指令找到CPU高的线程号
top -Hp 进程号
第三步,通过以下指令把线程号转换成16进制
printf"%x\n" 线程号
第四步,通过以下指令打印线程的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;
PS:上面的HashMap线程不安全讲得有点粗略,下次单独跟大家讲一下HashMap、HashTable和ConcurrentHashMap
记一次CPU飙升BUG的更多相关文章
- 【原创】记一次MySQL大表高并发写入引发CPU飙升的排障过程
目录 一.故障现象... 1 二.初步分析... 2 三.排障过程... 2 1.排查是否QPS或insert并发请求上升导致问题发生... 2 2.排查是否锁资源等待或block导致了insert变 ...
- 记一次Linux server偶发CPU飙升问题的跟进与解决
背景 进入6月后,随着一个主要功能版本api的上线,服务端的QPS翻了一倍,平时服务器的CPU使用稳定在30%上下,高峰期则在60%上下,但是偶尔会有单台机器出现持续数分钟突然飙到90%以上,导致大量 ...
- 线上CPU飙升100%问题排查,一篇足矣
一.引子 对于互联网公司,线上CPU飙升的问题很常见(例如某个活动开始,流量突然飙升时),按照本文的步骤排查,基本1分钟即可搞定!特此整理排查方法一篇,供大家参考讨论提高. 二.问题复现 线上系统突然 ...
- 线上CPU飙升100%问题排查
本文转载自线上CPU飙升100%问题排查 引子 对于互联网公司,线上CPU飙升的问题很常见(例如某个活动开始,流量突然飙升时),按照本文的步骤排查,基本1分钟即可搞定!特此整理排查方法一篇,供大家参考 ...
- 记一次线上bug排查-quartz线程调度相关
记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...
- .dhpcd导致cpu飙升问题
因公司有业务服务器在阿里云上面,阿里云后台报警说,“有恶意程序在挖矿”,引起了高度重视,于是我登陆服务器进行排查. 登陆云服务器:系统centos7.5 第一步使用top查看资源情况. top 可以清 ...
- pt-kill--- MySQL数据库CPU飙升紧急处理方法
MySQL数据库CPU飙升紧急处理方法 [日期:2014-01-22] 来源:Linux社区 作者:hcymysql [字体:大 中 小] 运行平稳的数据库,如果遇到CPU狂飙,到80% ...
- 面试连环炮系列(八):服务器CPU飙升100%怎么排查
服务器CPU飙升100%怎么排查 执行"top"命令,查看当前进程CPU占用的实时情况,PID列是进程号,确定是哪个应用程序的问题. 如果是Java应用导致的,怎么定位故障原因 执 ...
- MySQL数据库CPU飙升紧急处理方法
MySQL数据库CPU飙升紧急处理方法 运行平稳的数据库,如果遇到CPU狂飙,到80%左右,那一定是开发写的烂SQL导致的,DBA首先要保证的是,数据库别跑挂了,所以我们要把那些运行慢的SQL杀死并记 ...
随机推荐
- java的poi技术读取和导入Excel实例
本篇文章主要介绍了java的poi技术读取和导入Excel实例,报表输出是Java应用开发中经常涉及的内容,有需要的可以了解一下. 报表输出是Java应用开发中经常涉及的内容,而一般的报表往往缺乏通用 ...
- shell打印 倒等腰三角形
#!/bin/bash read -p "input the length: " n方法一:内循环中的一个for循环shell写法for i in `seq 1 $n`do ...
- 远程window服务器,无法复制粘贴了
1.先检查本机 2.检查服务器 win+R打开输入taskmgr 找到这个进程,结束进程 3.在win+r打开输入rdpclip确认启动,发现可以复制粘贴了.
- Android新版本特性以及注意事项
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 了解新版本的特性还是很有必要的,为什么这么讲呢?因为可以从应用市场对发布应用的目标API版本(targetSdkVersion值)的 ...
- Maven常用命令:
Maven库: http://repo2.maven.org/maven2/ Maven依赖查询: http://mvnrepository.com/ 一,Maven常用命令: 1. 创建Maven的 ...
- 强化学习(二)马尔科夫决策过程(MDP)
在强化学习(一)模型基础中,我们讲到了强化学习模型的8个基本要素.但是仅凭这些要素还是无法使用强化学习来帮助我们解决问题的, 在讲到模型训练前,模型的简化也很重要,这一篇主要就是讲如何利用马尔科夫决策 ...
- cocos creator主程入门教程(九)—— 瓦片地图
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 这一篇介绍瓦片地图,在开发模拟经营类游戏.SLG类游戏.RPG游戏,都会使用到瓦片地图.瓦片地图地面是通 ...
- .net工具类 获取枚举类型的描述
一般情况我们会用枚举类型来存储一些状态信息,而这些信息有时候需要在前端展示,所以需要展示中文注释描述. 为了方便获取这些信息,就封装了一个枚举扩展类. /// <summary> /// ...
- WPF 添加 Resources Dictionary 资源 一般类库项目中无法添加资源文件(ResourceDictionary)
在文件夹或者项目右键-> Add(添加),会弹出可以快捷添加的资源,但是你会发现没有 ResourceDictionary资源可以选择. 解决此问题方法: 第一步:工程->右键->U ...
- Java设计模式---桥接Bridge模式
参考于 : 大话设计模式 马士兵设计模式视频 写在开头: 桥接模式主要用于一件事物分成了两个维度,进行排列组合,比如礼物,可以分成优雅的礼物(抽象),花(具体),排列组合优雅的花! 1.为什么使用桥接 ...