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

简介: 实例内存使用率和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 排查上涨原因,或提售工单,售后值班会帮您排查。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
11月前
|
SQL 存储 关系型数据库
MySQL内存引擎:Memory存储引擎的适用场景
MySQL Memory存储引擎将数据存储在内存中,提供极速读写性能,适用于会话存储、临时数据处理、高速缓存和实时统计等场景。但其数据在服务器重启后会丢失,不适合持久化存储、大容量数据及高并发写入场景。本文深入解析其特性、原理、适用场景与限制,并提供性能优化技巧及替代方案比较,助你合理利用这一“内存闪电”。
|
11月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1652 152
|
11月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
1125 156
|
存储 弹性计算 缓存
阿里云服务器ECS经济型、通用算力、计算型、通用和内存型选购指南及使用场景分析
本文详细解析阿里云ECS服务器的经济型、通用算力型、计算型、通用型和内存型实例的区别及适用场景,涵盖性能特点、配置比例与实际应用,助你根据业务需求精准选型,提升资源利用率并降低成本。
821 3
|
12月前
|
存储 SQL 关系型数据库
RDS DuckDB技术解析一:当 MySQL遇见列式存储引擎
RDS MySQL DuckDB分析实例以​列式存储与向量化计算​为核心,实现​复杂分析查询性能百倍跃升​,为企业在海量数据规模场景下提供​实时分析能力​,加速企业数据驱动型决策效能。​​
|
10月前
|
设计模式 缓存 Java
【JUC】(4)从JMM内存模型的角度来分析CAS并发性问题
本篇文章将从JMM内存模型的角度来分析CAS并发性问题; 内容包含:介绍JMM、CAS、balking犹豫模式、二次检查锁、指令重排问题
244 1
|
11月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
11月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
存储 人工智能 自然语言处理
AI代理内存消耗过大?9种优化策略对比分析
在AI代理系统中,多代理协作虽能提升整体准确性,但真正决定性能的关键因素之一是**内存管理**。随着对话深度和长度的增加,内存消耗呈指数级增长,主要源于历史上下文、工具调用记录、数据库查询结果等组件的持续积累。本文深入探讨了从基础到高级的九种内存优化技术,涵盖顺序存储、滑动窗口、摘要型内存、基于检索的系统、内存增强变换器、分层优化、图形化记忆网络、压缩整合策略以及类操作系统内存管理。通过统一框架下的代码实现与性能评估,分析了每种技术的适用场景与局限性,为构建高效、可扩展的AI代理系统提供了系统性的优化路径和技术参考。
953 4
AI代理内存消耗过大?9种优化策略对比分析
|
11月前
|
关系型数据库 MySQL 数据库
云时代MySQL:RDS与自建数据库的抉择
在云计算时代,选择合适的数据库部署方案至关重要。本文深入对比了AWS RDS与自建MySQL的优劣,帮助您在控制权、运维成本和业务敏捷性之间找到最佳平衡点。内容涵盖核心概念、功能特性、成本模型、安全性、性能优化、高可用方案及迁移策略,为您提供全面的决策参考。

相关产品

  • 云数据库 RDS MySQL 版
  • 云数据库 RDS
  • 推荐镜像

    更多