内存利用率过高

最近更新时间:2024-06-12 15:53:32

我的收藏

现象描述

TDSQL-C MySQL 版出现内存突增,内存持续增长不释放的情况。具体表现在实例监控的内存利用率监控图表中,如下图所示:
说明:
可在监控告警页下查询实例的内存使用率情况。

在突增之后,或者长期缓慢增长的过程中,最终达到一个过高的水平(>96%),且在一定范围内小幅度变动,有可能会经常性的触发自定义的腾讯云可观测平台内存告警。

故障风险

低效的 SQL 语句或数据库参数设置不当都可能会导致内存利用率升高,遇到突发业务高峰时,可能会导致云数据库内存 OOM(Out Of Memory),当云数据库由于 OOM 导致不可用时,会触发主备切换,主备切换的过程中会导致业务在短时间内不可用,实例不可用的时长正常情况下不超过60秒。如果在业务高峰期发生了主备切换,则会严重影响业务的稳定和连续性。

解决思路

TDSQL-C MySQL 版的内存大体可以分为 global 级的共享内存和 session 级的私有内存两部分:
共享内存是实例创建时即分配的内存空间,并且是所有连接共享的。
私有内存用于每个连接到 TDSQL-C MySQL 版服务器时才分配各自的缓存。 一些特殊的 SQL 或字段类型会导致单个线程可能分配多次缓存,因此当出现 OOM 异常,都是由各个连接的私有内存造成的,通过限制数据库的连接数和优化低效 SQL,可降低内存利用率过高的风险,若 TDSQL-C MySQL 版的内存利用率依然过高,可通过升级内存配置来提升数据库的整体并发量和稳定性。

处理步骤

1. 优化慢 SQL,减少 session 级的私有内存使用量。可以通过 DBbrain 对慢 SQL 进行分析
2. 减少无效的长连接,在不影响业务的情况下,降低程序侧的连接池配置或者降低程序侧的并发度。可以通过 DBbrain 查看当前会话信息
3. 监控内存使用情况(可选):开启 performance_schema 的内存监控功能,需要开启 performance_schema 后,在 performance_schema 库中查询名字为 memory_summary 开头的表来得知内存使用情况,例如,全局维度的内存利用率分析表:memory_summary_global_by_event_name。
4. 优化完成之后的手段:调整计算配置调整存储空间
说明:
升级过程中不影响业务的正常使用,升级完成后会进行切换,仅有秒级别的闪断,请确保业务具备重连机制。
避免因内存或 CPU 资源不足而影响业务的正常运行,请为现网实例配置资源的合理告警策略,可提前发现资源不足的隐患,详情请参见 监控指标告警