排查并解决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 07 MySQL
一文读懂navicat for mysql基础知识
May 31 MySQL
你知道哪几种MYSQL的连接查询
Jun 03 MySQL
MySQL为id选择合适的数据类型
Jun 07 MySQL
python中的mysql数据库LIKE操作符详解
Jul 01 MySQL
MySQL 8.0 驱动与阿里druid版本兼容问题解决
Jul 01 MySQL
MySQL千万级数据表的优化实战记录
Aug 04 MySQL
MySQL基础快速入门知识总结(附思维导图)
Sep 25 MySQL
MySQL如何快速创建800w条测试数据表
Mar 17 MySQL
讲解MySQL增删改操作
May 06 MySQL
Mysql开启外网访问
May 15 MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 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 防止单引号,双引号在接受页面转义
2008/07/10 PHP
PHP XML error parsing SOAP payload on line 1
2010/06/17 PHP
php设计模式 Builder(建造者模式)
2011/06/26 PHP
优化PHP程序的方法小结
2012/02/23 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
2014/06/23 PHP
php微信公众号开发模式详解
2016/11/28 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
Prototype Hash对象 学习
2009/07/19 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
jQuery - css() 方法示例详解
2014/01/16 Javascript
Google Maps API地图应用示例分享
2014/10/23 Javascript
学习javascript面向对象 掌握创建对象的9种方式
2016/01/04 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
canvas绘制七巧板
2017/02/03 Javascript
浅谈JS中的反柯里化( uncurrying)
2017/08/17 Javascript
vue.js或js实现中文A-Z排序的方法
2018/03/08 Javascript
浅谈Vue 数据响应式原理
2018/05/07 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
2018/08/20 Javascript
vue forEach循环数组拿到自己想要的数据方法
2018/09/21 Javascript
[原创]微信小程序获取网络类型的方法示例
2019/03/01 Javascript
解决vue单页面应用中动态修改title问题
2019/06/09 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
python实现复制整个目录的方法
2015/05/12 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
英国奢侈品在线精品店:Hervia
2020/09/03 全球购物
董事长秘书岗位职责
2013/11/29 职场文书
《学棋》教后反思
2014/04/14 职场文书
高中学生会竞选演讲稿
2014/08/25 职场文书
2016学习依法治国心得体会
2016/01/15 职场文书
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python