MySQL优化实战 解决CPU100%

问题表象

在24年初有一个日经问题困扰着我们,每到正点03分DB的CPU开始打满,持续1分钟又恢复正常水平。但由于日常业务交付压力较大且权限限制没有登录DB主机的权限,大家也就得过且过一直没有去认真排查。直到某天我来兴趣了也有时间了,就想起这个问题开始深入排查一下尝试解决。

排查-可能的问题点

这种一看周期性非常规律的CPU打满,又很快回落到正常水平的现象,有经验的就会猜到是定时任务导致的。的确这是一个大概率的猜测方向。但还有另一个可能,在做活动也会有周期性的流量暴增情况,但我们系统是to b的业务系统所以排除。

结合定时任务分析有2种可能,这个从Job的执行时间频率上能看出来。然后通过业务逻辑大致可以知道哪一个Job是比较重的结合时间重点排查。在我们系统中有一个核心业务,每小时会根据后台配置的计划规则,解析计划下发巡检任务给一线人员执行,这个业务逻辑会短时间5分钟内下发几千条任务。每一条任务涉及的IO会很多,可能十几次?

  1. 整点下发任务
  2. 整点03分更新任务状态

首先排查是否任务下发导致的CPU升高。但是很快通过SQL统计每个时间段的下发任务数量对比,可以排除这个问题。任务大多数是凌晨0点下发。早上9点-11点下发的任务少数。所以不太可能是任务下发导致CPU升高。再查看凌晨0点,MySQL CPU只有18%左右,相差甚远。

那么继续排查另一个方向:任务的状态修改Job。结合整点03分DB的CPU飙高,推测taskStatusUpdate定时任务导致的概率大。这个任务共有3部分。

从数据量上看,任务关闭和任务预警的数据量都比较少。不太可能是瓶颈。任务开启的数据量较多,概率比较大。着重看下任务开启的方法。

首先是一个没有索引的全表扫表。看日志这个SQL大概1~2s左右。从“开启任务数量”的日志,到“开启任务成功”的日志间隔大概25s左右。佐证这个方法耗时比较慢,可能导致DB CPU飙高。方法里面涉及到IO的以下方法。

各位读者看到下面的IO查询,可以根据给出的信息推理下哪一个是根因导致CPU升高?亦或是组合原因引起的? 下文会给出每一步的耗时日志证明本次的优化的确是优化到问题根因上了。一开始我认为是组合原因引起的,由于a表数据最大1000w以上,且二级索引的区分度比较低0.13左右,结合下面的接近700w的表两次IO更新,如果更新数据量比较大的话是可能导致CPU升高的。

// 1000w数据,workorder_id二级索引区分度13%
List<A> a = aService.list(...);// 688w数据,主键。这步可省
List<B> bList = bService.listByIds(idList);// 688w数据,主键
bService.updateBatchById(bList);// 480w,主键
cService.updateBatchById(cList);// 186w,task_id二级索引区分度13%
List<D> dList = dService.list(...);// 网络IO+auth磁盘IO,auth主键,registration_id全表扫描
pushService.push(pushDTO);

但是最后根据打的耗时日志发现居然是最后的pushService.push方法耗时最高且它就是根因,占到整个方法的90%耗时。下图贴出每一步方法的耗时日志可以对应这里的伪代码。

// 1000w数据,workorder_id二级索引区分度13%
// cost 10ms量级
List<A> a = aService.list(...);// 688w数据,主键。
// 优化后这个查询被省略了 0ms
List<B> bList = bService.listByIds(idList);// 688w数据,主键
// cost 1~2s量级
bService.updateBatchById(bList);// 480w,主键
// cost 1s量级
cService.updateBatchById(cList);// 186w,task_id二级索引区分度13%
// 100ms量级
List<D> dList = dService.list(...);// 网络IO+auth磁盘IO,auth主键,registration_id全表扫描
// 导致CPU打满的原因,耗时占总体90%
pushService.push(pushDTO);

优化方案

OK,提前破案了,把原因告诉大家了。我按照以下方法慢慢定位出pushService慢的原因。

  • 每个步骤打cost日志
  • 每个IO按需查询
  • A表优化索引,避免回表
  • 节省不必要的IO查询
  • 优化registration_id查询SQL,避免全表扫描

但是为什么pushService的推送会引起CPU的打满?这是一个给用户推送app push的方法,正常情况下不会和DB CPU产生联想。

这里面其实就有一个比较隐蔽的慢查询场景,其实我总结身边80%的数据库CPU打满都和慢SQL有关。因为慢SQL会对表进行大量扫描,通常会将数据页读到Buffer Pool中然后进行大量内存读写和计算,有可能一条慢SQL要遍历几十万~几百万的数据行才能找到目标行。这个过程会大量消耗CPU时间,如果短时间这种慢SQL并发达到一定阈值,MySQL的链接数和CPU就都会被消耗完。

回到pushService排查,里面有一个对user表的查询,需要根据registration_id查出本次app push的目标用户,registration_id是没索引的。而这张表数据并不大只有25w的数据量。找DBA要了CPU打满时间段的慢SQL日志,查找果然这条SQL在其中,并且统计数量在1分钟内有几百条查询,每一条查询也消耗了3~4秒时间,检索22万行数据最终返回32行给客户端。

临时解决方案是给registration_id字段加普通索引,由于表数据量不大且MySQL版本5.7+,DDL是在线替换的,锁表时间很短,期间不阻塞DML语句,直接加索引。

结果回顾

加完索引后,观察下一次任务状态变更Job,MySQL服务器的CPU明显降下来了,从100%降到30~40%,并且持续时间较短。上面提到的加索引是临时解决方案,简单粗暴但有效。但是仍有优化空间,对循环调用查user表可以加缓存或者该批量查询。但是任务变更Job导致的cpu 100%下来后,就凸显了另一个Job的尖刺40~50%左右。

总结

全表扫描的SQL对DB的cpu影响比较高,如果偶发的并不多的请求数量,在监控层面看不出来影响,且单条SQL执行也很快。但是并发多了之后,短时间堆积的慢SQL就会明显占用DB资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1552969.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于51单片机的家用防火防盗控制系统设计

本设计基于51单片机的家用防火防盗控制系统&#xff0c;该系统通过模块间的协同作用实现了对烟雾与天然气浓度的监测、温度监测、人体红外监测、通信传输、声光报警等功能。利用按键模块设置报警的阈值&#xff0c;将处理后的信息与阈值进行对比。判断气体浓度和温度是否超过阈…

酒店智能门锁SDK接口pro[V10] 门锁校验C#-SAAS本地化-未来之窗行业应用跨平台架构

一、代码 int 酒店标识_int Convert.ToInt32(酒店标识);StringBuilder 锁号2024 new StringBuilder(8);//信息 "未知返回值&#xff1a;" bufCard_原始;GetGuestLockNoByCardDataStr_原始(酒店标识_int, bufCard_原始.ToString(), 锁号2024);StringBuilder 退…

C++语言学习(4): identifier 的概念

1. 什么是 identifier identifier 中文意思是标识符&#xff0c;在 cppreference 中明确提到&#xff0c;identifier 是任意长度的数字、下划线、大写字母、小写字母、unicode 字符 的序列&#xff1a; An identifier is an arbitrarily long sequence of digits, underscores…

nginx打包部署前端vue项目全过程【保姆级教程】

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持…

Python字符串string方法大全及使用方法[1]以及FastAPI框架文件上传的处理-client使用postman

一、Python字符串string方法大全及使用方法[1] 1. Python字符串string方法大全及意义解释 #将字符串的第一个字符转换为大写 capitalize() #返回一个指定的宽度 width 居中的字符串&#xff0c;fillchar 为填充的字符&#xff0c;默认为空格。 center(width, fillchar) #返…

磁编码器磁铁要求和安装要求

总结来说&#xff0c; 磁铁需要是径向两极充磁、牌号N35、直径10mm、高度2.5mm的烧结钕铁硼磁铁。 磁铁的固定套必须是非导磁材料&#xff0c;比如铜、铝、塑料。 磁铁要距离电机轴至少2mm以上。 磁铁距离磁编码芯片0.5~3mm&#xff0c;最好1到2mm。 使用磁编码器的伺服&#…

css设置文本样式属性

目录 1.font-size&#xff1a;字体大小 案例&#xff1a;通过font-size属性设置字体的大小 1.代码 2.效果 2.font-family:字体的展现形式 案例&#xff1a;使用font-family属性设置字体的风格 1.代码实现 2.效果 3. font-weight:字体的粗细 案例&#xff1a;使用font-weight定义…

基于SSM+Vue技术的定制式音乐资讯平台

文未可获取一份本项目的java源码和数据库参考。 一、选题的背景与意义&#xff1a; 随着个人计算机的普及和互联网技术的日渐成熟&#xff0c;网络正逐渐成为人们获取信息及消费的主要渠道。然而在当前这个信息时代&#xff0c;网络中的信息种类和数量呈现爆炸性增长的趋势&a…

爱拼才会赢,甲骨文公司智算中心标配英伟达GPU10万颗

【科技明说 &#xff5c; 科技热点关注】 之前有有外媒消息&#xff0c;甲骨文宣布推出了多款智算集群&#xff0c;可通过甲骨文云基础设施提供AI训练服务&#xff0c;其中最顶级的一款配备了超过10万块的NVIDIA Blackwell GPU。 它一共使用了多达131072万块B200 GPU加速卡&…

单链表及其代码实现

目录 前言单链表1.1 单链表的定义1.2单链表代码实现1.2.1 头文件1.2.2 函数实现文件1.2.3 测试文件1.2.4 野指针问题 总结 前言 本文介绍单链表&#xff0c;主要是创销、增删改查代码实现。 注&#xff1a;文章中函数命名采取STL库。 单链表 1.1 单链表的定义 单链表是链线…

北京市大兴区启动乐享生活 寻味大兴 美食嘉年华 系列促销费活动

北京市大兴区启动乐享生活 寻味大兴 系列促销费活动 区商务局副局长 兰莉 致开幕辞 区餐饮行业协会会长 董志明 介绍活动内容 2024年9月30日&#xff0c;由大兴区商务局主办、大兴区餐饮行业协会承办&#xff0c;并得到高米店街道和大兴绿地缤纷城大力支持的“乐享生活 寻味大…

OceanBase—02(入门篇——对于单副本单节点,由1个observer扩容为3个observer集群)——之前的记录,当初有的问题未解决,目前新版未尝试

OceanBase—02&#xff08;入门篇——对于单副本单节点&#xff0c;由1个observer扩容为3个observer集群&#xff09;——之前的记录&#xff0c;有的问题未解决&#xff0c;新版未尝试 1、前言—安装单副本单节点集群1.1 docker安装OB 2、查看现有集群情况2.1 进入容器&#x…

SOMEIP_ETS_147: SD_Send_triggerEventUINT8_Eventgroup_2

测试目的&#xff1a; 验证DUT在Tester订阅事件组后&#xff0c;能够响应Tester触发的triggerEventUINT8方法&#xff0c;并将TestEventUINT8事件发送到订阅请求中端点选项指定的IP地址和端口。 描述 本测试用例旨在确保DUT能够正确处理事件组的订阅请求&#xff0c;并且在T…

VSOMEIP代码阅读整理(1) - 网卡状态监听

一. 概述 ​ 在routing进程所使用的配置文件中&#xff0c;存在如下配置项目&#xff1a; {"unicast" : "192.168.56.101",..."service-discovery" :{"enable" : "true","multicast" : "224.244.224.245&q…

在2核2G服务器安装部署MySQL数据库可以稳定运行吗?

阿里云2核2G服务器可以安装MySQL数据库吗&#xff1f;当然可以&#xff0c;并且可以稳定运行MySQL数据库&#xff0c;目前阿里云服务器网aliyunfuwuqi.com使用的就是阿里云2核2G服务器&#xff0c;在云服务器上安装MySQL数据库&#xff0c;可以稳定运行。 目前阿腾云用于运行M…

C++系列-继承补充

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 继承和友元 友元关系不能继承&#xff0c;父亲的朋友不能是你的朋友 比如在这个例子当中&#xff1a; class Student; class Person { public:friend void Display(const Per…

厦门网站设计的用户体验优化策略

厦门网站设计的用户体验优化策略 在信息化快速发展的今天&#xff0c;网站作为企业与用户沟通的重要桥梁&#xff0c;用户体验&#xff08;UX&#xff09;的优化显得尤为重要。尤其是在交通便利、旅游资源丰富的厦门&#xff0c;吸引了大量企业进驻。在这样竞争激烈的环境中&am…

netty之NettyServer字符串编码器

前言 netty通信就向一个流水channel管道&#xff0c;我们可以在管道的中间插入一些‘挡板’为我们服务。比如字符串的编码解码&#xff0c;在前面我们使用new StringDecoder(Charset.forName(“GBK”))进行字符串解码&#xff0c;这样我们在收取数据就不需要手动处理字节码。那…

linux文件编程_进程通信

1.进程间通信介绍 进程间通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同进程之间传播或交换信息。 进程是操作系统的概念&#xff0c;每当我们执行一个程序时&#xff0c;对于操作系统来讲就创建了一个进程&#xff0c;在这个过程中&…

已解决:org.springframework.web.HttpMediaTypeNotAcceptableException

文章目录 写在前面问题描述报错原因分析&#xff1a; 解决思路解决办法1. 确保客户端请求的 Accept 头正确2. 修改 Controller 方法的 produces 参数3. 配置合适的消息转换器4. 检查 Spring 配置中的媒体类型5. 其他解决方案 总结 写在前面 在开发过程中&#xff0c;Spring 框…