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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 实例内存使用率和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 排查上涨原因,或提售工单,售后值班会帮您排查。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
存储 Arthas 监控
JVM工作原理与实战(三十):堆内存状况的对比分析
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了堆内存状况的对比分析、产生内存溢出的原因等内容。
13 0
|
9天前
|
缓存 Linux
linux性能分析之内存分析(free,vmstat,top,ps,pmap等工具使用介绍)
这些工具可以帮助你监视系统的内存使用情况、识别内存泄漏、找到高内存消耗的进程等。根据具体的问题和需求,你可以选择使用其中一个或多个工具来进行内存性能分析。注意,内存分析通常需要综合考虑多个指标和工具的输出,以便更好地理解系统的行为并采取相应的优化措施。
29 6
|
12天前
|
机器学习/深度学习 分布式计算 数据处理
Spark是一个基于内存的通用数据处理引擎,可以进行大规模数据处理和分析
【5月更文挑战第2天】Spark是一个基于内存的通用数据处理引擎,可以进行大规模数据处理和分析
23 3
|
14天前
|
监控 算法 测试技术
【Go语言专栏】Go语言的性能优化与内存分析
【4月更文挑战第30天】本文探讨了Go语言的性能优化策略和内存分析方法。性能优化原则包括基准测试、分析瓶颈、避免过早优化和持续监控。优化策略涉及减少内存分配、避免内存逃逸、利用并发、优化算法和数据结构以及减少系统调用。内存分析借助于Go的`pprof`工具、内存分配跟踪和第三方工具,以发现内存泄漏和管理问题。通过这些方法,开发者能提升Go程序效率和资源利用率。
|
14天前
|
DataWorks 关系型数据库 MySQL
DataWorks产品使用合集之在DataWorks中配置RDS MySQL数据源的步骤如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
27 0
|
15天前
|
存储 SQL 关系型数据库
MySql入门教程--MySQL数据库基础操作
MySql入门教程--MySQL数据库基础操作
|
15天前
|
存储 关系型数据库 MySQL
RDS for MySQL测试
【4月更文挑战第28天】
|
16天前
|
SQL 关系型数据库 MySQL
【MySQL 探索之旅】初始MySQL数据库
【MySQL 探索之旅】初始MySQL数据库
|
16天前
|
存储 关系型数据库 MySQL
【MySQL探索之旅】MySQL数据库下载及安装教程
【MySQL探索之旅】MySQL数据库下载及安装教程
|
16天前
|
缓存 Java Android开发
安卓开发中的内存泄漏分析与优化策略
【4月更文挑战第27天】 在移动应用开发领域,性能优化始终是提升用户体验的关键因素之一。特别是对于安卓平台,由于设备的硬件配置差异较大,良好的内存管理对于保证应用流畅运行尤为重要。本文将深入探讨安卓开发中常见的内存泄漏问题,并提供一系列检测和解决内存泄漏的实用策略。通过对工具的使用、代码实践以及系统架构设计的多维度分析,旨在帮助开发者有效避免和处理内存泄漏,确保应用性能稳定。

相关产品

  • 云数据库 RDS MySQL 版