2023年7月3日发(作者:)
MySQLThreads_running飙升与慢查询的相关问题解决⽬录背景问题描述原因分析CPU慢查询连接数分析拓展⼀下总结⼀下背景年前本应该是回顾⼀年⼯作和收尾的阶段,奈何各种促销,活动都等着春节,因此也遇到了不少的问题,回顾了⼀下最近遇到的问题,发现有好⼏个问题⽐较类似,正好整理⼀下,作为年前收尾的案例吧。表现上都是数据库假死,⽆响应,发⽣的场景有较⾼的业务压⼒到来时,也有业务正常运⾏的时候,突然就出现问题了。问题描述由于腾讯云数据库 MySQL 本⾝是有故障检测和⾼可⽤机制的,这⼏例问题发⽣的时候,从⽤户反馈的问题出现的时间点到实际介⼊排查的时候已经有好⼏分钟了,但是并没有触发⾼可⽤切换,说明这个问题可能并不是数据库⾃⾝的故障,也不是⼀些外部原因导致数据库不可⽤。检查⼀下数据库当时候的状态,发现⼀个很不正常的指标:在问题的时间点附近,连接数的总数量和 threads_running 的数量在短时间内开始飙升,并且接近半分钟的时间内,连监控插件都采集不到数据了。在相同的时间段内,CPU 的使⽤率(达到 100%)、慢查询数量也跟着飙升。基本上可以确认 CPU 使⽤率,慢查询,连接数的指标这三者应该是相关联的,可以从这三者⼊⼿来分析这次问题的起因。原因分析99%的情况下,只要慢查询数量在飙升,那么这个问题就和慢查询脱不了关系,但是案例分析并不能这么草率的下结论。⾔归正传,既然⽬标缩⼩在三个指标上,那么分别考虑⼀下这三个指标的意义,看看这⼏个指标的异常会带来什么问题。CPUCPU 过⾼说明 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,查询的效率⽐较低,所以根因还是慢查询。拓展⼀下如开篇所提及,最近发⽣的问题有多起,且原因类似。除了这个飙升的案例,还有如下所⽰的现象。threads_running 保持在⼀个相对平稳的数值,参考前⽂的分析,可以发现这个现象代表着在平时的时候,就有约 10 个查询长时间处于活跃状态,可以预测⼀个故障场景:业务量继续上升,活跃的查询变多,当⾼效的查询受影响,效率降低到⼀定程度的时候,前端程序/⽤户会因为超时或者响应慢的原因,发起重试,然后因为查询效率降低,这个重试被反复触发,然后引发雪崩效应,慢慢拖垮数据库。万幸的是多个类似现象的实例仅有⼀个出现了问题,就是预测的这个场景,其他的都及时优化掉了。总结⼀下虽说仍旧是慢查询的问题,但是从这个案例可以发现另外⼀个 MySQL 指标,threads_running 的⽤处:监控活跃的连接,提前发现⼀些并发量过⾼和异常的查询,防⽌数据库堆积查询,产⽣假死的现象。以上就是MySQL Threads_running飙升与慢查询的问题解决的详细内容,更多关于MySQL Threads_running飙升与慢查询的资料请关注其它相关⽂章!
发布者:admin,转转请注明出处:http://www.yc00.com/web/1688330377a121278.html
评论列表(0条)