排查并解决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 相关文章推荐
Mysql官方性能测试工具mysqlslap的使用简介
May 21 MySQL
为什么MySQL分页用limit会越来越慢
Jul 25 MySQL
Mysql8.0递归查询的简单用法示例
Aug 04 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
全面盘点MySQL中的那些重要日志文件
Nov 27 MySQL
教你使用VS Code的MySQL扩展管理数据库的方法
Jan 22 MySQL
MySQL中一条update语句是如何执行的
Mar 16 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
MySQL中EXPLAIN语句及用法
May 20 MySQL
delete in子查询不走索引问题分析
Jul 07 MySQL
分享很少见很有用的SQL功能CORRESPONDING
Aug 05 MySQL
MySQL中LAG()函数和LEAD()函数的使用
Aug 14 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
初学者入门:细述PHP4的核心Zend
2006/09/05 PHP
php的控制语句
2006/10/09 PHP
PHP中使用unset销毁变量并内存释放问题
2012/07/05 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
php curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
Symfony的安装和配置方法
2016/03/17 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
2017/04/20 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
2017/08/10 PHP
javaScript 判断字符串是否为数字的简单方法
2009/07/25 Javascript
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
js日期、星座的级联显示代码
2014/01/23 Javascript
JS控制表格实现一条光线流动分割行的方法
2015/03/09 Javascript
纯js实现仿QQ邮箱弹出确认框
2015/04/29 Javascript
Ionic 2 实现列表滑动删除按钮的方法
2017/01/22 Javascript
vue.js学习之UI组件开发教程
2017/07/03 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
Vue引用Swiper4插件无法重写分页器样式的解决方法
2018/09/27 Javascript
[01:09:13]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第三场 1月19日
2021/03/11 DOTA
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
python创建属于自己的单词词库 便于背单词
2019/07/30 Python
浅析PyTorch中nn.Module的使用
2019/08/18 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
python将数组n等分的实例
2019/12/02 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
入党积极分子介绍信
2014/01/17 职场文书
保安的辞职报告怎么写
2014/01/20 职场文书
秋天的雨教学反思
2014/04/27 职场文书
区级文明单位申报材料
2014/05/15 职场文书
高中运动会广播稿
2014/09/16 职场文书
小学少先队活动总结
2015/05/08 职场文书
2015年共青团工作总结
2015/05/15 职场文书
教师岗位说明书
2015/09/30 职场文书
解决python3安装pandas出错的问题
2021/05/20 Python
Redis Cluster集群动态扩容的实现
2021/07/15 Redis