排查并解决MySQL生产库内存使用率高的报警


Posted in MySQL onApril 11, 2022

    近期频繁收到一个MySQL实例的内存使用率高的报警,今天我们花时间排查一下问题出在哪里。

修改performance_schema

因为公司生产环境使用的阿里云RDS,修改参数相对方便,performance_schema默认为0,此次修改为1。修改之后提交参数,数据库会进行重启,建议在业务低峰进行。

打开内存监控

登录MySQL数据库,执行如下SQL,打开内存监控。

update performance_schema.setup_instruments set enabled = 'yes' where name like 'memory%';

打开之后验证一下。

select * from performance_schema.setup_instruments where name like 'memory%innodb%' limit 5;

**注意:**该命令是在线打开内存统计,所以只会统计打开后新增的内存对象,打开前的内存对象不会统计,建议您打开后等待一段时间再执行后续步骤,便于找出内存使用高的线程。

查找内存消耗

统计事件消耗内存

select event_name,
       SUM_NUMBER_OF_BYTES_ALLOC
from performance_schema.memory_summary_global_by_event_name
order by SUM_NUMBER_OF_BYTES_ALLOC desc
LIMIT 10;
+---------------------------------------+-------------------------------------+
| event_name                            | SUM_NUMBER_OF_BYTES_ALLOC           |
+---------------------------------------+-------------------------------------+
| memory/sql/Filesort_buffer::sort_keys | 763523904056                        |
| memory/memory/HP_PTRS                 | 118017336096                        |
| memory/sql/thd::main_mem_root         | 114026214600                        |
| memory/mysys/IO_CACHE                 | 59723548888                         |
| memory/sql/QUICK_RANGE_SELECT::alloc  | 14381459680                         |
| memory/sql/test_quick_select          | 12859304736                         |
| memory/innodb/mem0mem                 | 7607681148                          |
| memory/sql/String::value              | 1405409537                          |
| memory/sql/TABLE                      | 1117918354                          |
| memory/innodb/btr0sea                 | 984013872                           |
+---------------------------------------+-------------------------------------+

可以看到内存消耗最高的event是Filesort_buffer,根据经验,这个应该是排序有关。

统计线程消耗内存

select thread_id,
       event_name,
       SUM_NUMBER_OF_BYTES_ALLOC
from performance_schema.memory_summary_by_thread_by_event_name
order by SUM_NUMBER_OF_BYTES_ALLOC desc
limit 10;
+---------------------+---------------------------------------+-------------------------------------+
| thread_id           | event_name                            | SUM_NUMBER_OF_BYTES_ALLOC           |
+---------------------+---------------------------------------+-------------------------------------+
| 105                 | memory/memory/HP_PTRS                 | 69680198792                         |
| 183                 | memory/sql/Filesort_buffer::sort_keys | 49210098808                         |
| 154                 | memory/sql/Filesort_buffer::sort_keys | 43304339072                         |
| 217                 | memory/sql/Filesort_buffer::sort_keys | 37752275360                         |
| 2773                | memory/sql/Filesort_buffer::sort_keys | 31460644712                         |
| 218                 | memory/sql/Filesort_buffer::sort_keys | 31128994280                         |
| 2331                | memory/sql/Filesort_buffer::sort_keys | 28763981248                         |
| 106                 | memory/memory/HP_PTRS                 | 27938197584                         |
| 191                 | memory/sql/Filesort_buffer::sort_keys | 27701610224                         |
| 179                 | memory/sql/Filesort_buffer::sort_keys | 25624723968                         |
+---------------------+---------------------------------------+-------------------------------------+

可以看到内存消耗多的线程都跟Filesort_buffer相关。

定位具体SQL

根据前边我们查到的thread_id去日志里查找对应的SQL,阿里云RDS审计日志相对还是比较强大的。我们直接根据thread_id直接检索。

排查并解决MySQL生产库内存使用率高的报警

    我们在日志里看到大量这样的SQL,扫描行数在几千到几万不等。虽然每次查询时间并不长,大概在几十到几百毫秒,但是并发量很大。
    跟开发同学核实之后,这个查询没有做分页,取到的数据有很多行,而且最后要做排序,并且排序字段并没有合适的索引。到此,这次内存使用率出现异常的罪魁祸首已经找到。

到此这篇关于分享MySQL生产库内存异常增高的排查过程的文章就介绍到这了,更多相关MySQL生产库内存异常增高内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
left join、inner join、right join的区别
Apr 05 MySQL
MySQL获取所有分类的前N条记录
May 07 MySQL
MySQL 表空间碎片的概念及相关问题解决
May 07 MySQL
MySQL中VARCHAR与CHAR格式数据的区别
May 26 MySQL
详解MySQL中的pid与socket
Jun 15 MySQL
解决mysql的int型主键自增问题
Jul 15 MySQL
mysql事务对效率的影响分析总结
Oct 24 MySQL
MySQL限制查询和数据排序介绍
Mar 25 MySQL
排查并解决MySQL生产库内存使用率高的报警
Apr 11 MySQL
MySQL数据库实验之 触发器和存储过程
Jun 21 MySQL
MySQL下载安装配置详细教程 附下载资源
Sep 23 MySQL
MySQL数据管理操作示例讲解
Dec 24 MySQL
Windows下载并安装MySQL8.0.x 版本的完整教程
MySQL数据库优化之通过索引解决SQL性能问题
Apr 10 #MySQL
MySQL 外连接语法之 OUTER JOIN
Apr 09 #MySQL
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
Apr 09 #MySQL
进阶篇之linux环境下安装MySQL数据库
MySQL的存储函数与存储过程的区别解析
Apr 08 #MySQL
MySQL数据库查询进阶之多表查询详解
You might like
Zerg建筑一览
2020/03/14 星际争霸
php操作xml入门之xml基本介绍及xml标签元素
2015/01/23 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
php的优点总结 php有哪些优点
2019/07/19 PHP
使用CSS和jQuery模拟select并附提交后取得数据的代码
2013/10/18 Javascript
Javascript浅谈之引用类型
2013/12/18 Javascript
使用JS实现jQuery的addClass, removeClass, hasClass函数功能
2014/10/31 Javascript
jQuery简单实现input文本框内灰色提示文本效果的方法
2015/12/02 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
动态加载css方法实现和深入解析
2017/01/18 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
JS中Object对象的原型概念基础
2018/01/29 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
[05:05]给小松五分钟系列 第二期介绍为什么打DOTA2
2014/07/02 DOTA
深入了解Python数据类型之列表
2016/06/24 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
2017/08/07 Python
如何实现删除numpy.array中的行或列
2018/05/08 Python
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
python实现图片识别汽车功能
2018/11/30 Python
python Canny边缘检测算法的实现
2020/04/24 Python
Python如何定义接口和抽象类
2020/07/28 Python
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
2019年Java面试必问之经典试题
2012/09/12 面试题
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
企业精神口号
2014/06/11 职场文书
2014物价局群众路线对照检查材料思想汇报
2014/09/21 职场文书
保管员岗位职责
2015/02/14 职场文书
2014年度个人总结范文
2015/03/09 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
大学生党课感想
2015/08/11 职场文书
干货!开幕词的写作方法
2019/04/02 职场文书
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
2021/05/30 Javascript
JavaWeb Servlet开发注册页面实例
2022/04/11 Java/Android
Nginx利用Logrotate实现日志分割
2022/05/20 Servers