排查并解决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部分操作
Apr 05 MySQL
MySQL时间设置注意事项的深入总结
May 06 MySQL
详解MySQL连接挂死的原因
May 18 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
如何自己动手写SQL执行引擎
Jun 02 MySQL
MySQL 服务和数据库管理
Nov 11 MySQL
SQL优化老出错,那是你没弄明白MySQL解释计划用法
Nov 27 MySQL
MySQL学习之基础操作总结
Mar 19 MySQL
MySQL去除密码登录告警的方法
Apr 20 MySQL
MySQL数据库中的锁、解锁以及删除事务
May 06 MySQL
MySQL中EXPLAIN语句及用法
May 20 MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 15 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
Php Cookie的一个使用注意点
2008/11/08 PHP
PHP中使用addslashes函数转义的安全性原理分析
2014/11/03 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
2016/11/20 PHP
php正则修正符用法实例详解
2016/12/29 PHP
javascript firefox兼容ie的dom方法脚本
2008/05/18 Javascript
jquery实现多级下拉菜单的实例代码
2013/10/02 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
JS动态创建元素的两种方法
2016/04/20 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
vue.js中Vue-router 2.0基础实践教程
2017/05/08 Javascript
微信小程序 自定义消息提示框
2017/08/06 Javascript
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
Angular-UI Bootstrap组件实现警报功能
2018/07/16 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
2019/08/08 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
JavaScript实现10秒后再次获取验证码
2020/12/02 Javascript
Python写的服务监控程序实例
2015/01/31 Python
Python文件去除注释的方法
2015/05/25 Python
python 异常处理总结
2016/10/18 Python
python利用lxml读写xml格式的文件
2017/08/10 Python
python绘制圆柱体的方法
2018/07/02 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
2019/10/18 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
Python识别html主要文本框过程解析
2020/02/18 Python
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
意外伤害赔偿协议书
2014/09/16 职场文书
公务员政审个人总结
2015/02/12 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
如何用JavaScript学习算法复杂度
2021/04/30 Javascript
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers
Java 多线程并发FutureTask
2022/06/28 Java/Android