记一次线上数据库cpu负载过高,造成服务不可用的解决过程。
和计算机的性能卡在硬盘上一样,一个系统的性能卡在数据库上
可以看到从八点半左右开始,一直到下午一点四十。整个数据库cpu都很高。中午是因为吃饭,午休,用户较少。
下午一点四十,把调优后的sql发到生产,发生产之前先把卡住的sql查询线程 kill掉。
中间很多看不到蓝线(cpu)的时段,是因为cpu占用远超100,阿里云这个图看不到了,也没法向上拉伸。
下面复盘一下解决过程
1.首先照例重启了一下服务,发现没有什么效果,很快数据库cpu又占满了 ,说明大概率与事务死锁无关。单独就是sql查询慢
2.查询最近一次发版内容,找到对应开发,还原代码。先不要考虑解决问题,先保证服务可用,最快速的即回滚代码。
这一步没有做好,因为沟通成本比较大,我把慢sql扔到群里迟迟没有人认领,所以导致一上午的服务,都几乎在一个 瘫痪的状态,而新功能的发布,有些用户已经使用了,全部代码回滚的成本也比较大。
3.到了中午 终于定位到具体人员及具体原因,发现是sql有一个子查询没加条件,结果查了全表。
下班记得打卡