备案 控制台
文档
产品文档

RDS MySQL内存使用问题

更新时间:
一键部署
产品详情
相关技术圈
我的收藏

本文介绍查看内存使用情况的方式,以及各种内存问题的原因和解决方案。

背景信息

实例内存使用率和缓冲池命中率是RDS MySQL的关键指标。如果内存使用率过高,会有内存耗尽风险;如果缓冲池命中率低,大量的数据页无法命中缓冲池的数据页,需要从磁盘读取数据,造成I/O吞吐增加和延迟增加。

查看内存使用情况

RDS管理控制台提供多种查看活跃线程的方法:

  • 监控与报警

    在控制台的监控与报警页面,单击标准监控页签,可以查看实例的MySQL CPU/内存 利用率InnoDB Buffer Pool 命中率

    内存使用率缓存命中率

  • 数据库自治服务DAS

    在控制台的自治服务 > 性能趋势页面,单击性能趋势页签,查看MySQL CPU/内存 利用率InnoDB Buffer Pool 命中率情况。

    内存利用率缓存命中率

您还可以使用performance_schema,设置相关的内存仪表(instrumentation),通过内存占用统计表查看内存占用。详情请参见 MySQL官方文档。

  • 要在实例启动时开启内存检测,您可以在控制台修改performance_schema参数,RDS MySQL5.6设置为ON,RDS MySQL5.7、8.0设置为1,设置方法请参见 查看实例参数。设置完成后重启实例即生效。

  • 要在实例运行中开启内存检测,请执行如下命令:

    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:统计指定事件名称的事件。

RDS MySQL内存高常见原因

通常InnoDB Buffer Pool的内存占用是最大的,Buffer Pool的内存占用上限受到Buffer Pool配置参数的限制,但是还有很多内存是在请求执行中动态分配和调整的,例如内存临时表消耗的内存、prefetch cache、table cache、哈希索引、行锁对象等,详细的内存占用和相关参数限制,请参见 MySQL官方文档。

多语句(multiple statements)

MySQL支持将多个SQL语句用英文分号(;)分隔,然后一起发给MySQL,MySQL会逐条处理SQL,但是某些内存需要等到所有的SQL执行结束才释放。

这种multiple statements的发送方式,如果一次性发送的SQL非常多,例如达到数百兆,SQL实际执行过程中各种对象分配累积消耗的内存非常大,很有可能导致MySQL进程内存耗尽。

一般场景下,如果存在大批量的multiple statements,网络流量会有突增,可以从网络流量监控和SQL洞察,判断是否有这种现象。建议业务实现中尽量避免multiple statements的SQL发送方式。

内存耗尽

缓冲池(Buffer Pool)问题

所有表的数据页都存放在缓冲池中,查询执行的时候如果需要的数据页直接命中缓冲池,就不会发生物理I/O,SQL执行的效率较高,缓冲池采用LRU算法管理数据页,所有的脏页放到Flush List链表中。

RDS MySQL的InnoDB Buffer Pool大小默认设置为内存的75%,这部分内存通常是实例内存中占比最大的。

Buffer Pool相关的常见问题:

  • 数据页预热不足导致查询的延迟较高。通常发生在实例重启、冷数据读取或缓冲池命中率较低的场景,建议升级实例规格或大促前预热数据。

  • 脏页累积太多。当未刷新脏页的最旧LSN和当前LSN的距离超过76%时,会触发用户线程同步刷新脏页,导致实例性能严重下降。优化方式是均衡写入负载、避免写入吞吐过高、调整刷新脏页参数或升级实例规格等。

  • 高内存实例的参数innodb_buffer_pool_instances设置较小。高QPS负载情况下,缓冲池的锁竞争会比较激烈。建议高内存的实例将参数innodb_buffer_pool_instances设置为8或16,甚至更高。

临时表

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

其他原因

如果实例内表特别多或QPS很高,Table Cache可能也会消耗内存,建议实例避免创建太多表或设置参数table_open_cache过大。

自适应哈希索引占用的内存默认是Bufffer Pool的1/64。如果查询或写入长度非常大的Blob大字段,会对大字段动态分配内存,也会造成内存增加。

还有非常多的原因会造成内存上涨,如果出现内存使用率异常增加或实例内存耗尽,您可以参考 MySQL官方文档排查上涨原因。

上一篇:RDS MySQL慢SQL问题 下一篇:RDS MySQL空间不足问题
  • 本页导读 (1)

深圳SEO优化公司大芬网站建设爱联关键词按天扣费南山网站优化排名龙华企业网站改版东莞企业网站建设塘坑百度网站优化光明网站建设坪山设计网站坑梓网站建设福田网站制作大芬SEO按效果付费大鹏seo优化布吉优化布吉网站建设木棉湾百度爱采购平湖网站开发荷坳关键词按天扣费平湖网站优化按天收费南澳网络营销福永优秀网站设计深圳营销型网站建设民治百度网站优化大芬百度网站优化排名坑梓企业网站建设深圳SEO按天收费横岗seo光明网站优化按天计费光明模板网站建设光明网站优化软件沙井百搜词包歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化