范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

CPU占用又爆了?MySQL到底在干什么

  | 作者 王文安,腾讯CSIG数据库专项的数据库工程师,主要负责腾讯云数据库 MySQL 的相关的工作,热爱技术,欢迎留言进行交流。文章首发于腾讯云+社区的腾讯云数据库专家服务专栏。
  在日常工作中,发现 MySQL 的状态不太对劲的时候,一般都会看看监控指标,很多时候会看到熟悉的一幕:CPU 使用率又爆了。本文将给大家介绍 MySQL 和 CPU 之间的关系,对此有一定的了解之后可以更准确的判断出问题的原因,也能够提前发现一些引发 CPU 问题的隐患。怎么看懂CPU使用率
  以 Linux 的 top 命令为例,效果如下:
  Top 命令
  在 %CPU 这一列就展示了 CPU 的使用情况,百分比指代的是总体上占用的时间百分比:
  %us:表示用户进程的 CPU 使用时间(没有通过 nice 调度)
  %sy:表示系统进程的 CPU 使用时间,主要是内核使用。
  %ni:表示用户进程中,通过 CPU 调度(nice)过的使用时间。
  %id:空闲的 CPU 时间
  %wa:CPU 运行时在等待 IO 的时间
  %hi:CPU 处理硬中断花费的时间
  %si:CPU 处理软中断花费的时间%st:被虚拟机偷走的 CPU 时间
  通常情况下,我们讨论的 CPU 使用率过高,指的是 %us 这个指标,监控里面的 CPU 使用率通常也是这个值(也有用其他的方法计算出来的,不过简单起见,不考虑其他的情况 )。其他几个指标过高也代表出 MySQL 的状态异常,简单起见,这里主要还是指 %us 过高的场景。
  MySQL和线程
  MySQL 是单进程多线程的结构,意味着独占的 MySQL 服务器里面,只能用 top 命令看到一行数据。
  TOP 命令效果
  这里能看到的是 MySQL 的进程 ID,如果要看到线程的情况,需要用top -H
  TOP 命令效果
  在这里能看到的是 MySQL 各个线程的 ID,可以看到 MySQL 在启动之后,会创建非常多的内部线程来工作。
  这些内部线程包括 MySQL 自己用来刷脏,读写数据等操作的系统线程,也包括处理用户 SQL 的线程,姑且叫做用户线程吧。用户线程有一个特殊的地方:程序端发送到 MySQL 端的 SQL,只会由一个用户线程来执行(one-thread-per-connection),所以 MySQL 在处理复杂查询的时候,会出现"一核有难,多核围观"的尴尬现象。
  参考 %us 的定义,对于 Linux 系统来说,MySQL 进程和它启动的所有线程都不算内核进程,因此 MySQL 的系统线程和用户线程在繁忙的时候,都会体现在 CPU 使用率的 %us 指标上。
  什么时候CPU会100%
  MySQL 干什么的时候,CPU 会 100%?从前文的分析来看,MySQL 主要是两类线程占用 CPU:系统线程和用户线程。因此 MySQL 独占的服务器上,只需要留意一下这两类线程的情况,就能 Cover 住绝大部分的问题场景。
  系统线程
  在实际的环境中,系统线程遇到问题的情况会比较少,一般来说,多个系统线程很少会同时跑满,只要服务器的可用核心数大于等于 4 的话,一般也不会遇到 CPU 100%,当然有一些 bug 可能会有影响,比如这个:
  MySQL BUG
  虽然情况比较少,但是在面对问题的常规排查过程中,系统线程的问题也是需要关注的。
  用户线程
  提到用户线程繁忙,很多时候肯定会第一时间凭经验想到慢查询。确实 90% 以上的时候都是"慢查询"引起的,不过作为方法论,还是要根据分析再去得出结论的~
  参考 us% 的定义,是指用户线程占用 CPU 的时间多少,这代表着用户线程占用了大量的时间。
  一方面是在进行长时间的计算,例如:order by,group by,临时表,join 等。这一类问题可能是查询效率不高,导致单个 SQL 语句长时间占用 CPU 时间,也有可能是单纯的数据量比较多,导致计算量巨大。另一方面是单纯的 QPS 压力高,所以 CPU 的时间被用满了,比如 4 核的服务器用来支撑 20k 到 30k 的点查询,每个 SQL 占用的 CPU 时间并不多,但是因为整体的 QPS 很高,所以 CPU 的时间被占满了。问题的定位
  分析完之后,就要开始实战了,这里根据前文的分析给出一些经典的 CPU 100% 场景,并给出简要的定位方法作为参考。
  PS:系统线程的 bug 的场景 skip,以后有机会再作为详细的案例来分析。
  慢查询
  在 CPU 100% 这个问题已经发生之后,真实的慢查询和因为 CPU 100% 导致被影响的普通查询会混在一起,难以直观的看 processlist 或者 slowlog 来发现元凶,这时候就需要一些比较明确的特征来进行甄别。
  从前文的简单分析可以看出来,查询效率不高的慢查询通常有以下几种情况:
  全表扫描:Handler_read_rnd_next 这个值会大幅度突增,且这一类查询在 slowlog 中 row_examined 的值也会非常高。
  索引效率不高,索引选错了:Handler_read_next 这个值会大幅度的突增,不过要注意这种情况也有可能是业务量突增引起的,需要结合 QPS/TPS 一起看。这一类查询在 slowlog 中找起来会比较麻烦,row_examined 的值一般在故障前后会有比较明显的不同,或者是不合理的偏高。
  比如数据倾斜的场景,一个小范围的 range 查询在某个特定的范围内 row_examined 非常高,而其他的范围时 row_examined 比较低,那么就可能是这个索引效率不高。
  排序比较多:order by,group by 这一类查询通常不太好从 Handler 的指标直接判断,如果没有索引或者索引不好,导致排序操作没有消除的话,那么在 processlist 和 slowlog 通常能看到这一类查询语句出现的比较多。
  当然,不想详细的分析 MySQL 指标或者是情况比较紧急的话,可以直接在 slowlog 里面用 rows_sent 和 row_examined 做个简单的除法,比如 row_examined/rows_sent > 1000 的都可以拿出来作为"嫌疑人"处理。这类问题一般在索引方面做好优化就能解决。
  PS:1000 只是个经验值,具体要根据实际业务情况来定。
  计算量大
  这一类问题通常是因为数据量比较大,即使索引没什么问题,执行计划也 OK,也会导致 CPU 100%,而且结合 MySQL one-thread-per-connection 的特性,并不需要太多的并发就能把 CPU 使用率跑满。这一类查询其实是是比较好查的,因为执行时间一般会比较久,在 processlist 里面就会非常显眼,反而是 slowlog 里面可能找不到,因为没有执行完的语句是不会记录的。
  这一类问题一般来说有三种比较常规的解决方案:
  读写分离,把这一类查询放到平时业务不怎么用的只读从库去。
  在程序段拆分 SQL,把单个大查询拆分成多个小查询。
  使用 HBASE,Spark 等 OLAP 的方案来支持。
  高 QPS
  这一类问题单纯的就是硬件资源的瓶颈,不论是 row_examined/rows_sent 的比值,还是 SQL 的索引、执行计划,或者是 SQL 的计算量都不会有什么明显问题,只是 QPS 指标会比较高,而且 processlist 里面可能什么内容都看不到,例如:
  processlist
  总结
  实际上 CPU 100% 的问题其实不仅仅是单纯的 %us,还会有 %io,%sys 等,这些会涉及到 MySQL 与 Linux 相关联的一部分内容,展开来就会比较多了。本文仅从 %us 出发尝试梳理一下排查&定位的思路和方法,在分析 %io,%sys 等方面的问题时,也可以用类似的思路,从这些指标的意义开始,结合 MySQL 的一些特性或者特点,逐步理清楚表象背后的原因。

亚马逊卧式婴儿车和坐式婴儿车CPC认证ASTMF388,CPSIA办理卧式婴儿车卧式婴儿车是一种用于运输通常处于躺卧姿势的婴儿的轮式推车。卧式婴儿车是由人推动或拉动婴儿车上连接的把手来移动的。卧式婴儿车可以折叠,方便存放。坐式婴儿车坐式婴儿车是一种用听说小婴儿是有猛长期的,什么是猛长期?好不容易度过了手忙脚乱的孕期,宝宝终于出生了,妈妈也进入了人生的另一个育儿阶段了。育儿的路上是一个不断学习的过程,当妈妈把一个宝宝带大的时候,突然就会发现,在这个过程中,妈妈真的学八岁娃喝中药一天拉屎四五次正常吗?咨询了老大夫,答复说是正常的。他说孩子是因为积食,消化不良,毒素排不出去,造成感冒发烧咳嗽,这就是让孩子把体内粪便毒素排除掉,通过药物作用,排除了体内毒素,病症自然就好了。果然,中十一早产宝宝为什么要闯第四关黄疸关?生理性黄疸是新生儿出生24小时后血清胆红素由出生时的1751molL(13mgdl)逐步上升到86molL(5mgdl)或以上,临床上出现黄疸而无其它症状,12周内消退。新生儿黄疸缺钙最常见的五个误区,爸爸妈妈们真的要仔细看一下育儿事务所缺钙有哪些常见误区?睡眠差是因为缺钙有时宝宝在夜间熟睡中突然醒来哭闹,很多家长误以为是缺钙所致。事实上,这很可能是由肠绞痛肠胃不适等原因引起的,与缺钙无关。误区2出汗多是什么是妊娠糖尿病?上一篇和孕妈们谈了妊娠期糖尿病,有很多人给我留言,问糖糖孕妈该怎么吃饭,今天我就给大家指导一下妊娠期糖尿病的饮食治疗。妊娠期糖尿病的特点和营养治疗的目的特点一人吃两人补,要保证胎儿什么是试管婴儿?您好!作为专业生殖中心医生,给您详细介绍试管婴儿是怎么回事。世界上第一例试管婴儿布朗路易丝于1978年7月25日23时47分在英国的奥尔德姆市医院诞生,此后该项研究发展极为迅速,目怀孕初期,孕妇吃什么好?T怀孕初期,孕妇吃什么好?孕早期也就是孕周的112周,孕妇在饮食上基本满足以下四点就可以每天补充叶酸0。40。8mg,是为预防胎儿神经管畸形等,从最初就要最大限度上保证胎儿健康即使婴儿哭闹怎么办?教你一招,轻松解决婴儿哭闹很常见,因为哭对婴儿有多重实用意义感到饥饿或不适时,哭可以帮他寻求帮助可以帮他舒缓过于强烈的视觉听觉和其他感官刺激带来的不适还可以帮他减压。你可能发现孩子有一段时间比较烦躁关于待产医院的选择昨晚老公和我说,一朋友的老婆在综合性医院剖腹产生的,可能是疫情期间床位紧张吧,5天就让出院了,都下不来床,是用担架抬到车上的。而我术后第二天就下床走动(当然是在家属的帮助下起身下床抑郁症是家长惯出来的吗抑郁症引发是多原因的,跟原生家庭有很大关系,而我们所说的惯是家长对孩子溺爱,是一昧顺应孩子心思,要星星给星星,要月亮给月亮,不给孩子树立正确的是非观,甚至孩子犯错还偏向孩子,导致孩
洗葡萄时加入2样料,快速洗干净,无菌无虫卵无农残,家人放心吃洗葡萄时加入2样料,快速洗干净,无菌无虫卵无农残,家人放心吃葡萄是一种人见人爱的水果,古往今来,文人墨客留下了很多千古佳句,如元朝诗人郑允端葡萄满筐圆实骊珠滑,入口甘香冰玉寒。若使菜刀钝了抹上牙膏,几分钟就变得光亮锋利,真管用,很多人不知道菜刀钝了抹上牙膏,几分钟就变得光亮锋利,真管用,很多人不知道俗话说巧妇难为无米之炊,因为做饭不能没有米。而我认为厨师难做无刀之菜,说明了菜刀在烹饪中的重要地位。做菜之前对食材的处理不用菜刀不用刨,刮鱼鳞只要一个塑料袋,又快又干净,不飞溅不腥不用菜刀不用刨,刮鱼鳞只要一个塑料袋,又快又干净,不飞溅不腥很多人都爱吃鱼,营养丰富,肉质鲜嫩,价格也很实惠,我家一周就要吃23次鱼肉。吃鱼之前,有一件很重要的事,那就是刮鱼鳞。平煮小米粥,最忌直接下锅,厨师长分享3个技巧,出锅粥香浓又黏稠煮小米粥,最忌直接下锅,厨师长分享3个技巧,出锅粥香浓又黏稠脾胃对人体的健康是非常重要的,一旦脾胃不好,消化吸收也会受到影响,而且还会导致体内的湿气过重,所以我们一定要好好养护脾胃挑螃蟹,黄色好还是青色好?差别很大,买错肉少黄少,难吃白花钱挑螃蟹,黄色好还是青色好?差别很大,买错肉少黄少,难吃白花钱秋季是吃螃蟹的季节,每年中秋节都不能错过螃蟹。往年大闸蟹的价格比较贵,几十元一只,然而今年过节却降价了,十几元就能买到一贵州大娘教你做辣椒酱,别只会放盐,多放2样味道香,放1年不长毛贵州大娘教你做辣椒酱,别只会放盐,多放2样味道香,放1年不长毛说到吃辣,估计大家首先想到的就是四川湖南,当地人无辣不欢。其实,爱吃辣的省份很多,比如云贵地区。最近正是贵州辣椒大量上这4个好吃部位,1头猪只有1个,肉贩常留给家人吃,想吃要提前订这4个好吃部位,1头猪只有1个,肉贩常留给家人吃,想吃要提前订除了少数地区,大多数人都喜欢吃猪肉,如今猪肉价格趋于平稳,一斤10元左右,甚至还能买到几块钱一斤的猪肉,不过这种便宜肉切开的冬瓜别放冰箱,学学菜农的方法,放一年不会坏,越放越好吃切开的冬瓜别放冰箱,学学菜农的方法,放一年不会坏,越放越好吃现在正是冬瓜成熟的季节,几毛钱一斤,买一个大冬瓜还花不了5块钱,太实惠了。冬瓜的营养价值很高,属于高钾低钠型蔬菜,含有丰保存大蒜有技巧,用家中1种调料,放1年不发芽不干瘪保存大蒜有技巧,借用家中1种调料,放1年不发芽不干瘪,个个新鲜大蒜,具有很高的营养价值保健价值,含有蛋白质碳水化合物矿物质粗纤维等,脂肪含量很低,是一种绿色健康的食物。同时,它还含姜别放冰箱保存,姜农教我一个土方法,能放1年,不干不烂不长芽姜别放冰箱保存,姜农教我一个土方法,能放1年,不干不烂不长芽姜是一种常见的食材,它的营养价值和保健价值都很高,每年的911月份,是鲜姜上市的季节,价格比较便宜,不少人都会多买一些保骨关节炎,能吃氨糖吗?医生4种可选药物,氨糖只能屈居第二您好,看完这篇文章你可能需要三分钟,但是您会知道一膝关节痛,从4种口服药物说起。二外用药好还是口服药好?膝关节疼痛的人多吗?问问身边的人你就知道了,膝关节的问题可真不少。特别是中老