排查并解决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数据库压缩版本安装与配置详细教程
May 21 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
MySQL 常见的数据表设计误区汇总
Jun 07 MySQL
解决mysql的int型主键自增问题
Jul 15 MySQL
MySQL子查询中order by不生效问题的解决方法
Aug 02 MySQL
MySQL利用UNION连接2个查询排序失效详解
Nov 20 MySQL
mysql分组后合并显示一个字段的多条数据方式
Jan 22 MySQL
Mysql Innodb存储引擎之索引与算法
Feb 15 MySQL
MySQL创建管理HASH分区
Apr 13 MySQL
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
Apr 18 MySQL
Mysql索引失效 数据库表中有索引还是查询很慢
May 15 MySQL
MySQL生成千万测试数据以及遇到的问题
Aug 05 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部分常见问题总结
2006/10/09 PHP
php mssql 时间格式问题
2009/01/13 PHP
php获取新浪微博数据API实例
2013/11/12 PHP
PHP实现图片压缩的两则实例
2014/07/19 PHP
php生成shtml类用法实例
2014/12/09 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
php实现的微信红包算法分析(非官方)
2015/09/25 PHP
PHPExcel简单读取excel文件示例
2016/05/26 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
2018/05/16 PHP
jquery $.ajax入门应用二
2008/11/19 Javascript
用js实现的检测浏览器和系统的函数
2009/04/09 Javascript
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
JavaScript 原型继承之构造函数继承
2011/08/26 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
浅谈Javascript线程及定时机制
2015/07/02 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
详解如何在angular2中获取节点
2017/11/23 Javascript
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
2017/12/24 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
2018/02/03 Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
2019/05/09 Javascript
ElementUI radio组件选中小改造
2019/08/12 Javascript
使用js获取身份证年龄的示例代码
2020/12/11 Javascript
[38:39]KG vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python对接支付宝支付自实现功能
2019/10/10 Python
服务器端jupyter notebook映射到本地浏览器的操作
2020/04/14 Python
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
项目考察欢迎辞
2014/01/17 职场文书
采购部部长岗位职责
2014/02/06 职场文书
幼儿园毕业家长感言
2014/02/10 职场文书
管理提升方案
2014/06/04 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
群众路线党员自我评议范文2014
2014/09/24 职场文书
绿色校园广播稿
2014/10/13 职场文书
2015年预备党员自我评价
2015/03/04 职场文书
活动新闻稿范文
2015/07/17 职场文书