MySQL Threads_running飙升与慢查询的相关问题解决


Posted in MySQL onMay 08, 2021

背景

年前本应该是回顾一年工作和收尾的阶段,奈何各种促销,活动都等着春节,因此也遇到了不少的问题,回顾了一下最近遇到的问题,发现有好几个问题比较类似,正好整理一下,作为年前收尾的案例吧。表现上都是数据库假死,无响应,发生的场景有较高的业务压力到来时,也有业务正常运行的时候,突然就出现问题了。

问题描述

由于腾讯云数据库 MySQL 本身是有故障检测和高可用机制的,这几例问题发生的时候,从用户反馈的问题出现的时间点到实际介入排查的时候已经有好几分钟了,但是并没有触发高可用切换,说明这个问题可能并不是数据库自身的故障,也不是一些外部原因导致数据库不可用。

检查一下数据库当时候的状态,发现一个很不正常的指标:

MySQL Threads_running飙升与慢查询的相关问题解决

在问题的时间点附近,连接数的总数量和 threads_running 的数量在短时间内开始飙升,并且接近半分钟的时间内,连监控插件都采集不到数据了。在相同的时间段内,CPU 的使用率(达到 100%)、慢查询数量也跟着飙升。基本上可以确认 CPU 使用率,慢查询,连接数的指标这三者应该是相关联的,可以从这三者入手来分析这次问题的起因。

原因分析

99%的情况下,只要慢查询数量在飙升,那么这个问题就和慢查询脱不了关系,但是案例分析并不能这么草率的下结论。言归正传,既然目标缩小在三个指标上,那么分别考虑一下这三个指标的意义,看看这几个指标的异常会带来什么问题。

CPU

CPU 过高说明 MySQL 的计算能力被占满了,能占用 MySQL 计算资源的只有用户线程和 MySQL 自身的系统线程,这次问题明显和 MySQL 系统线程没什么关系,说明用户线程在大量占用 CPU 的计算资源,而且使用率达到 100% 说明有这个资源争抢的程度是非常严重的,可能会导致原本效率极高的查询因为拿不到 CPU 资源而变得非常缓慢,从高效率的查询变成低效的慢查询,从而产生数据库假死或者 hang 死的现象。

慢查询

慢查询是个老生常谈的问题了,因为查询效率过低,会过度占用 CPU,IO,内存等资源,从而影响到其他正常的查询,从监控指标上来说,CPU 使用率,IO 使用情况,内存使用率都可能会有不同程度的上升,严重的情况下也会引发这几个指标的飙升,导致整个数据库响应缓慢。

连接数

连接数通常是一个引发“实际故障”的指标,例如连接数达到 max_connections 的上限,从而导致整个数据库无法新建连接,程序侧直接是报错的,而不是无响应。threads_running 这个指标,参考官方文档的描述:

The number of threads that are not sleeping.

简单直白的解释,这个指标的飙升代表当时候有大量活跃的用户连接在 MySQL 实例中。而且从这个案例的监控图表来看,是一个飙升的趋势,说明是在短时间内出现了大量的活跃连接。

分析

完成这三个指标的简单分析,可以发现这个三个指标是互相影响:

  1. 慢查询堆积会导致 CPU 使用率过高;
  2. CPU 过高会导致整体的查询效率变低,进而导致一些高效的查询变成慢查询;
  3. 慢查询的执行效率过低,会较长时间的保持活跃状态,所以 Threads_running 这个指标一定会上涨。
  4. 过高的并发突然到来时,大量的查询处于活跃状态会让 Threads_running 这个指标飙升,同时这种尖刺型的高峰也很容易占满 CPU。

看起来三个指标飙升的原因是自洽的,只靠这三个指标并不能真正的判断出问题的原因。那么仔细考虑一下这几个指标飙升的原因为什么会自洽?会发现有一个核心现象,或者说是共性:查询要能够堆积起来。如果:

  1. 堆积起来的查询本来效率就不高,那么这个问题的诱因基本就是慢查询了。
  2. 堆积起来的查询效率很高,那么这个问题的诱因可能是瞬间并发过高,或者是其他的原因导致 CPU 使用率暴涨,然后反过来影响了这些效率很高的查询。

所以检查一下堆积起来的查询,就能比较直白的分辨出问题了,就上图展示的这个案例而言,堆积起来的查询大量使用了 group by 和 order by,查询的效率比较低,所以根因还是慢查询。

拓展一下

如开篇所提及,最近发生的问题有多起,且原因类似。除了这个飙升的案例,还有如下所示的现象。

MySQL Threads_running飙升与慢查询的相关问题解决

threads_running 保持在一个相对平稳的数值,参考前文的分析,可以发现这个现象代表着在平时的时候,就有约 10 个查询长时间处于活跃状态,可以预测一个故障场景:业务量继续上升,活跃的查询变多,当高效的查询受影响,效率降低到一定程度的时候,前端程序/用户会因为超时或者响应慢的原因,发起重试,然后因为查询效率降低,这个重试被反复触发,然后引发雪崩效应,慢慢拖垮数据库。

万幸的是多个类似现象的实例仅有一个出现了问题,就是预测的这个场景,其他的都及时优化掉了。

总结一下

虽说仍旧是慢查询的问题,但是从这个案例可以发现另外一个 MySQL 指标,threads_running 的用处:监控活跃的连接,提前发现一些并发量过高和异常的查询,防止数据库堆积查询,产生假死的现象。

以上就是MySQL Threads_running飙升与慢查询的问题解决的详细内容,更多关于MySQL Threads_running飙升与慢查询的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
MySQL入门命令之函数-单行函数-流程控制函数
Apr 05 MySQL
JDBC连接的六步实例代码(与mysql连接)
May 12 MySQL
MySQL不使用order by实现排名的三种思路总结
Jun 02 MySQL
mysql分组后合并显示一个字段的多条数据方式
Jan 22 MySQL
Arthas排查Kubernetes中应用频繁挂掉重启异常
Feb 28 MySQL
MySQL数据库完全卸载的方法
Mar 03 MySQL
Linux系统下MySQL配置主从分离的步骤
Mar 21 MySQL
MySQL表锁、行锁、排它锁及共享锁的使用详解
Apr 02 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
MySQL提取JSON字段数据实现查询
Apr 22 MySQL
MySQL 条件查询的常用操作
Apr 28 MySQL
MySQL的prepare使用以及遇到的bug
May 11 MySQL
MySQL sql_mode的使用详解
May 08 #MySQL
MySQL 数据丢失排查案例
May 08 #MySQL
MySQL update set 和 and的区别
May 08 #MySQL
MySQL查询学习之基础查询操作
May 08 #MySQL
MySQL sql_mode修改不生效的原因及解决
May 07 #MySQL
一篇文章弄懂MySQL查询语句的执行过程
详解MySQL主从复制及读写分离
You might like
PHP乱码问题,UTF-8乱码常见问题小结
2012/04/09 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
asp(javascript)全角半角转换代码 dbc2sbc
2009/08/06 Javascript
JQuery实现左右滚动菜单特效
2015/09/28 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
jQuery实现遍历复选框的方法示例
2017/03/06 Javascript
用angular实现多选按钮的全选与反选实例代码
2017/05/23 Javascript
vue一个页面实现音乐播放器的示例
2018/02/06 Javascript
详解vue的双向绑定原理及实现
2019/05/05 Javascript
微信小程序背景音乐开发详解
2019/12/12 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
2020/04/17 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
2020/08/04 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python实现定时提取实时日志程序
2018/06/22 Python
Python 利用pydub库操作音频文件的方法
2019/01/09 Python
Python进程间通信 multiProcessing Queue队列实现详解
2019/09/23 Python
Python爬取腾讯视频评论的思路详解
2019/12/19 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
python3将变量写入SQL语句的实现方式
2020/03/02 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
什么是事务?为什么需要事务?
2012/01/09 面试题
好的自荐信包括什么内容
2013/11/07 职场文书
劳资协议书范本
2014/04/23 职场文书
负责人任命书范本
2014/06/04 职场文书
我与祖国共奋进演讲稿
2014/09/13 职场文书
2014年妇女工作总结
2014/12/06 职场文书
写给医院的感谢信
2015/01/22 职场文书
2015年万圣节活动总结
2015/03/24 职场文书
2015社区个人工作总结范文
2015/05/13 职场文书
同学会感言
2015/07/30 职场文书
导游词之神仙居景区
2019/11/15 职场文书
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021/04/05 SQL Server
SpringBoot连接MySQL获取数据写后端接口的操作方法
2021/11/02 MySQL