mysql数据库Cpu利用率100%问题排查
问题
某日生产数据库mysql突然查询异常缓慢,应用层无法获取连接, 所有接口都基本处于无法响应状态。 查看数据库监控是cpu利用率100%。
腾讯云mysql5.7
经验教训
- 排查问题的时候要有公允心,不要想隐瞒什么。 不要想着包庇什么。“存天理, 去人欲”
- 最终排查结论是因为慢sql引起的,然后并发比平常高。 另外,云数据库应该也存在一定问题,因为类似的场景,之前出现过,但是数据库没有崩溃。
- 造成数据库cpu利用率100%的原因
- 慢sql and or 并发。 不要以为慢sql是什么时候都很慢!!!!!!!!!!!!这次发现的慢sql,其实在cpu正常的时候执行, 只有3s,或者5.2s。但是在cpu100%的时候, 执行需要1300s。
- 并发: 哪怕sql能很快执行完, 1s以内, 但是只要并发上去了, cpu也会被打满。 !!!!!!!!!!!!
- 两方面: 1、定时任务, 晚上刷数据的定时任务最好分散开, 如果是大任务,最好做切分, 或者完成一批之后,sleep一段时间。
2、被大批量接口调用。 这个要做好异步,并发高的, 不要简单暴露个接口出去就完事了。
- 两方面: 1、定时任务, 晚上刷数据的定时任务最好分散开, 如果是大任务,最好做切分, 或者完成一批之后,sleep一段时间。
- 生产上一定一定要注意慢sql,控制好页面能不能重复点击查询。 发现一个页面模糊搜索,有用户几分钟内点击了398次, cpu马上上天了 。so, 如果有很多连表的情况, 一定要找时间优化, 不要看现在是4s,5s就不当回事。 这是资源换来的查询效率, 只要并发上来了, 直接就挂。 因为每个查询需要的资源很多!!!!!!!!!
- 后续如果发现这种问题,第一时间拦截掉慢sql对应的接口, 如果数据库没有好转, 直接重启数据库。 本次数据库问题持续了40分钟, 但是后面30分钟,应用层应该没有请求发到数据库上, 连接已经没有了。 也就是说, 后30分钟都在执行之前的查询, hang住了。
虽然重启可能会影响数据同步等等, 但是比起生产宕机, 好的多 。