【巡检问题分析与最佳实践】RDS MySQL 内存使用问题

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS SQL Server,基础系列 2核4GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 实例内存使用率和buffer pool命中率是RDS MySQL的关键指标之一,如果内存使用率过高会有OOM风险,如果buffer pool命中率低,大量的数据页无法命中buffer pool中缓存的数据页,需要从存储读取数据,造成IO吞吐增加和延迟增加。

查看内存使用情况

RDS MySQL的控制台提供了多种查看内存使用率的方法:

RDS控制台

监控与报警

      在RDS控制台的“监控与报警”页中的“标准监控”->“资源监控”和“引擎监控”下,可以查看实例的内存使用率和缓存池命中率监控:

1.png

2.png

数据库自治服务

在RDS控制台的“自治服务”->“性能趋势”->“MySQL CPU/内存利用率”页中可以查看内存利用率和缓冲池命中率监控:

3.png

4.png

RDS MySQL 内存高常见原因

通常InnoDB buffer pool的内存占用是最大的,buffer pool的内存占用上限受到buffer pool配置参数的限制,但是还有很多内存是在query运行中动态分配和调整的,比如内存临时表消耗的内存、prefetch cache、table cache、哈希索引、行锁对象等,详细的内存占用和相关参数限制参考MySQL官方文档https://dev.mysql.com/doc/refman/5.7/en/memory-use.html

如何查看内存占用

您还可以通过打开performance_schema,然后设置相关的内存instrumentation,查询内存占用统计table来查看各个维护的内存占用,参考MySQL官方文档 https://dev.mysql.com/doc/refman/5.7/en/memory-summary-tables.html#memory-instrumentation-behavior

performance_schema = on # 修改此参数,需要重启实例
update performance_schema.setup_instruments set enabled = 'yes' where name like 'memory%';
# 内存占用统计相关的表,从各个维度统计了内存消耗
memory_summary_by_account_by_event_name
memory_summary_by_host_by_event_name
memory_summary_by_thread_by_event_name
memory_summary_by_user_by_event_name
memory_summary_global_by_event_name

multiple statements 导致的OOM

MySQL支持将多个SQL语句用分号分隔相连,然后一起发给MySQL,MySQL Server会逐条处理SQL,但是某些内存需要等到所有的SQL执行结束才释放,这种multiple statements的发送方式,如果一次性发送的SQL非常多,比如达到数百M,SQL实际执行过程中各种对象分配累积的消耗内存非常大,很有可能触发MySQL进程OOM。一般场景下,如果存在大批量的multiple statements,网络流量会有突增,可以从网络流量监控和SQL洞察,判断是否有这种现象。建议业务实现中尽量避免multiple statements这种SQL发送方式。

5.png

buffer pool缓冲池相关问题

所有表的数据页存都放在buffer pool中,查询执行的时候如果需要的数据页直接命中buffer pool,则就没有物理IO的产生,SQL执行的效率较高,buffer pool采用LRU算法管理缓存的数据页,所有的脏页放到Flush list链表。

RDS MySQL InnoDB  buffer pool的大小设置为规格内存的75%,这部分内存通常是实例内存中占比最大的。

buffer pool相关的常见问题:

  1. 数据页没有足够的预热,导致查询的延迟较高。通常发生在实例发生过重启、冷数据读取或内存不足,缓冲池命中率较低的场景,建议升级实例规格或大促前预热数据来避免这种问题。
  2. 脏页累计太多。当当前未刷脏的最老lsn和当前Lsn的距离超过76%时,会触发用户线程同步刷脏,引发实例严重的性能下降。优化方式是业务均衡写负载,避免写入吞吐过高、调整刷脏参数、升级实例规格等。
  3. 大规格内存实例innodb_buffer_pool_instances设置较小,高QPS负载情况下,缓冲池的锁竞争会比较激烈。建议高规格内存的实例innodb_buffer_pool_instances设置为8或16,甚至更高。

临时表

内存临时表大小受到tmp_table_size 和max_heap_table_size限制,超过限制后将转化为磁盘临时表,如果瞬间有大量的连接创建大量的临时表,有可能会造成内存突增。MySQL 8.0 实现了新的temptable engine,所有线程分配的内存临时表大小之和必须小于temptable_max_ram参数,temptable_max_ram默认1G,超出后转换为磁盘临时表。

其他原因

如果表特别多或QPS很高,table cache可能也会消耗内存,建议实例避免创建太多表和设置非常大的table_open_cache参数。还有自适应哈希索引占用的内存默认是bufffer pool size的1/64。如果查询或写入长度非常大的blob大字段,会对大字段动态分配内存,也会造成内存增加。还有非常多的原因会造成内存上涨,如果碰见内存使用率异常增加或实例OOM,您可以参考官方文档 https://dev.mysql.com/doc/refman/5.7/en/memory-use.html 排查上涨原因,或提售工单,售后值班会帮您排查。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
22天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
65 2
|
2月前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
411 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
1月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
65 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
1月前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
27 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
1月前
|
数据可视化 关系型数据库 MySQL
【IDEA】配置mysql环境并创建mysql数据库
【IDEA】配置mysql环境并创建mysql数据库
100 0
|
3月前
|
SQL 数据可视化 关系型数据库
MySQL 备份可视化巡检系统
MySQL 备份可视化巡检系统
|
3月前
|
存储 C# 关系型数据库
“云端融合:WPF应用无缝对接Azure与AWS——从Blob存储到RDS数据库,全面解析跨平台云服务集成的最佳实践”
【8月更文挑战第31天】本文探讨了如何将Windows Presentation Foundation(WPF)应用与Microsoft Azure和Amazon Web Services(AWS)两大主流云平台无缝集成。通过具体示例代码展示了如何利用Azure Blob Storage存储非结构化数据、Azure Cosmos DB进行分布式数据库操作;同时介绍了如何借助Amazon S3实现大规模数据存储及通过Amazon RDS简化数据库管理。这不仅提升了WPF应用的可扩展性和可用性,还降低了基础设施成本。
83 0
|
4月前
|
关系型数据库 MySQL Serverless
函数计算产品使用问题之调用RDS MySQL的步骤是怎样的
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
缓存 关系型数据库 MySQL
分享一个实用的MySQL一键巡检脚本
分享一个实用的MySQL一键巡检脚本
58 0
|
3月前
|
SQL 关系型数据库 MySQL
MySql⭐一、配置MySql数据库,并创建一个表单
MySql⭐一、配置MySql数据库,并创建一个表单

相关产品

  • 云数据库 RDS MySQL 版
  • 云数据库 RDS
  • 下一篇
    无影云桌面