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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 实例内存使用率和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
相关文章
|
1月前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
2月前
|
编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(上)
动态内存分配与管理详解(附加笔试题分析)
58 1
|
3月前
|
程序员 编译器 C++
【C++核心】C++内存分区模型分析
这篇文章详细解释了C++程序执行时内存的四个区域:代码区、全局区、栈区和堆区,以及如何在这些区域中分配和释放内存。
58 2
|
17天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
46 1
|
19天前
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
38 3
|
1月前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
1月前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
215 9
|
2月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
2月前
|
程序员 编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(下)
动态内存分配与管理详解(附加笔试题分析)(下)
56 2
|
2月前
|
缓存 监控 关系型数据库
如何查看MySQL使用的内存
如何查看MySQL使用的内存
140 1

相关产品

  • 云数据库 RDS MySQL 版
  • 云数据库 RDS