排查并解决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复制问题的三个参数分析
Apr 07 MySQL
MySQL8.0.24版本Release Note的一些改进点
Apr 22 MySQL
MySQL 数据丢失排查案例
May 08 MySQL
分析MySQL抛出异常的几种常见解决方式
May 18 MySQL
MySQL删除和插入数据很慢的问题解决
Jun 03 MySQL
MySQL 亿级数据导入导出及迁移笔记
Jun 18 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
MyBatis 动态SQL全面详解
Oct 05 MySQL
MySQL数据库必备之条件查询语句
Oct 15 MySQL
浅谈MySql整型索引和字符串索引失效或隐式转换问题
Nov 20 MySQL
MySQL数据库 任意ip连接方法
May 20 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
2014过年倒计时示例
2014/01/31 PHP
PHP中创建和验证哈希的简单方法实探
2015/07/06 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
javascript 装载iframe子页面,自适应高度
2009/03/20 Javascript
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
js实现类似于add(1)(2)(3)调用方式的方法
2015/03/04 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
jQuery Ajax页面局部加载方法汇总
2016/06/02 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
JS实现简单短信验证码界面
2017/08/07 Javascript
vue视图不更新情况详解
2019/05/16 Javascript
微信小程序 云开发模糊查询实现解析
2019/09/02 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
2020/07/17 Javascript
[48:24]完美世界DOTA2联赛循环赛LBZS vs Forest 第一场 10月30日
2020/10/31 DOTA
Python中Random和Math模块学习笔记
2015/05/18 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
2020/03/14 Python
使用Django的JsonResponse返回数据的实现
2021/01/15 Python
详解如何在css3打包后自动追加前缀插件:autoprefixer
2018/12/18 HTML / CSS
Electrolux伊莱克斯巴西商店:家用电器、小家电和配件
2018/05/23 全球购物
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
世界各地的当地人的食物体验:Eatwith
2019/07/26 全球购物
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
个人查摆剖析材料
2014/02/04 职场文书
党校学习心得体会范文
2014/09/09 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
信访工作汇报材料
2014/10/27 职场文书
文艺节目主持词
2015/07/06 职场文书