惊了:《记一次数据库CPU使用率100%排查》

1.背景:

在监控线上数据库的运行是否安全、正常的过程中,cpu 使用率是一个重要的指标,一旦cpu使用率飙升至90%+甚至达到100%,必然会对数据库的正常工作产生影响。

在排查数据库的cpu 飙升的问题前,我们先看下cpu 飙升的原因有哪些。

2.cpu使用率飙升的原因

首先直观的,cpu使用率过高可能和流量和慢查询有一定的关系

进一步查阅相关资料,得到公式:单位时间 CPU 资源 = 查询执行的平均成本 x 单位时间执行的查询数量

显然,cpu使用率与【查询执行的平均成本】和【单位时间执行的查询数量】线性相关,而这两项就是我们常说的慢sql以及数据库QPS。

所以:一般而言,cpu使用率飙升可归纳为以下两点:

  • 大量的慢sql占用了cpu资源,拖垮了数据库,这类的慢sql常常表现为:查询的数据量过大,全表扫描、锁抢占甚至死锁、复杂查询等
  • QPS过高,本质上是数据库的承载的流量过大

3.如何解决

3.1 定位问题

定位是否为qps原因:

例如以下案例:

首先,查看当前cpu曲线:


发现此时的cpu已经解决100%在运行,再查看此时的qps曲线,


会发现此时的qps曲线基本和cpu曲线保持一致,此时我们可断定cpu飙升必然存在qps过高的原因。为了验证是否有慢sql的存在,再查看慢sql曲线:


发现此案例中完全不存在慢sql。因此责任可100%归为qps过高,如果我们对该库所在实例开通的sql审计的功能,我们可查看过去一个月的qps记录,判断是由哪台机器发出的高频请求,以及请求的Top调用量的sql。

如果我们没开通sql审计功能的话,阿里云也可查看当前对库的实时请求记录,或者我们可以以root用户登陆数据库,执行‘SHOW PROCESSLIST’命令查看。

最后 定位了具体sql或者接口后 就可以针对性的解决问题:降级或者限流。

定位是否为慢sql原因

案例1 CPU峰刺

例如以下案例:

首先,查看当前cpu和qps曲线:



从上图我们可看出,cpu和qps的整体的整体走势是基本一致的,但是上图中相对qps曲线,cpu有好几次的抖动,甚至峰值达到80%,我们需要排查出这些峰刺点。

由于此时的cpu抖动和qps曲线不一致,可推测是慢sql引起的,观察下图抖动时间段内的慢sql,确定是否有慢sql,以及慢sql的具体信息。


观察上图发现该时间段内一些慢sql在库上使得cpu曲线发生了抖动,此时可采取kill+id的方法定制该sql的执行。

案例2 CPU明显飙升

有时,我们会发现cpu和qps的曲线不够吻合,此时我们有较大的把握推测出原因就是慢sql引起的。如以下情况:



红框内的cpu使用率在上升,但qps却在下降,观察以下慢sql监听:


说明这段时间内的异常是100%是由慢sql引起的,可采取kill+id的方法定制该sql的执行。

4 总结

4.1 慢sql优化思路

慢sql的优化思路较多,本文不打算赘述,仅提供以下几个方面优化思路。

  • 1.扫描数据库记录数较多。

考虑表是否设置了合理的索引,表字段是否设置了合理的数据类型,sql是否有效的利用了索引等。

  • 2.sql中是否有做了大量的聚合、计算?

考虑将sql简化,把逻辑操作上浮到业务中去做。

  • 3.sql返回的记录数过多。
  • 考虑分页实现,通过limit将一次请求转为多次请求。
  • 4.表中是否冗余字段过多?
  • 表若为宽表,包含大量冗余字段,可考虑分表。
  • 5.库中是否有很多张表?
  • 此时可考虑将表拆分到多个库中,分库。
  • 6.若库的读写较多,锁争抢激励,甚至死锁。
  • 可考虑多库做读写分离。
  • 7.机器的本身性能较低,不符合业务需求。
  • 可考虑机器升级了。

4.2 qps过高优化思路。

  • 1.qps过高时,考虑是否可以使用缓存。
  • 2.使用批量操作,将多个操作合并为一次请求,但此种方式需要考虑是否可以一次批量的数据有多大,避免造成慢sql。
  • 3.考虑分库、读写分离,减少对一个机器的访问压力。
  • 4.机器升级,没什么是钱解决不了的。
#java##数据库##程序员#
全部评论
100%,这么凶猛啊
点赞 回复 分享
发布于 2022-08-18 20:52 陕西

相关推荐

头像
10-13 18:10
已编辑
东南大学 C++
。收拾收拾心情下一家吧————————————————10.12更新上面不知道怎么的,每次在手机上编辑都会只有最后一行才会显示。原本不想写凉经的,太伤感情了,但过了一天想了想,凉经的拿起来好好整理,就像象棋一样,你进步最快的时候不是你赢棋的时候,而是在输棋的时候。那废话不多说,就做个复盘吧。一面:1,经典自我介绍2,项目盘问,没啥好说的,感觉问的不是很多3,八股问的比较奇怪,他会深挖性地问一些,比如,我知道MMU,那你知不知道QMMU(记得是这个,总之就是MMU前面加一个字母)4,知不知道slab内存分配器->这个我清楚5,知不知道排序算法,排序算法一般怎么用6,写一道力扣的,最长回文子串反问:1,工作内容2,工作强度3,关于友商的问题->后面这个问题问HR去了,和中兴有关,数通这个行业和友商相关的不要提,这个行业和别的行业不同,别的行业干同一行的都是竞争关系,数通这个行业的不同企业的关系比较微妙。特别细节的问题我确实不知道,但一面没挂我。接下来是我被挂的二面,先说说我挂在哪里,技术性问题我应该没啥问题,主要是一些解决问题思路上的回答,一方面是这方面我准备的不多,另一方面是这个面试写的是“专业面试二面”,但是感觉问的问题都是一些主管面/综合面才会问的问题,就是不问技术问方法论。我以前形成的思维定式就是专业面会就是会,不会就直说不会,但事实上如果问到方法论性质的问题的话得扯一下皮,不能按照上面这个模式。刚到位置上就看到面试官叹了一口气,有一些不详的预感。我是下午1点45左右面的。1,经典自我介绍2,你是怎么完成这个项目的,分成几个步骤。我大致说了一下。你有没有觉得你的步骤里面缺了一些什么,(这里已经在引导我往他想的那个方向走了),比如你一个人的能力永远是不够的,,,我们平时会有一些组内的会议来沟通我们的所思所想。。。。3,你在项目中遇到的最困难的地方在什么方面4,说一下你知道的TCP/IP协议网络模型中的网络层有关的协议......5,接着4问,你觉得现在的socket有什么样的缺点,有什么样的优化方向?6,中间手撕了一道很简单的快慢指针的问题。大概是在链表的倒数第N个位置插入一个节点。————————————————————————————————————10.13晚更新补充一下一面说的一些奇怪的概念:1,提到了RPC2,提到了fu(第四声)拷贝,我当时说我只知道零拷贝,知道mmap,然后他说mmap是其中的一种方式,然后他问我知不知道DPDK,我说不知道,他说这个是一个高性能的拷贝方式3,MMU这个前面加了一个什么字母我这里没记,别问我了4,后面还提到了LTU,VFIO,孩子真的不会。
走呀走:华子二面可能会有场景题的,是有些开放性的问题了
点赞 评论 收藏
分享
评论
1
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务