排查经过
公司使用的 RDS 服务器出现告警,提示内存使用率平均值超过阈值 60% 。
查看了最近两个月的内存使用情况,发现数据库内存从 20% 一路上涨到了 60%
image.png
担心有内存泄漏,使用命令查看内存数据
show variables where variable_name in ('innodb_buffer_pool_size','innodb_log_buffer_size','innodb_additional_mem_pool_size','key_buffer_size','query_cache_siz';
查询结果
+-------------------------+------------+
| Variable_name | Value |
+-------------------------+------------+
| innodb_buffer_pool_size | 3087007744 |
| innodb_log_buffer_size | 8388608 |
| key_buffer_size | 16777216 |
+-------------------------+------------+
innodb_buffer_pool_size 所占用的空间最大,查看阿里云RDS的相关配置,发现此参数设置为 2868M,RDS 实例的内存为 4G 。
image.png
因此当内存阈值设置为 60% 的时候,自然会触发告警。
对 innodb_buffer_pool 的理解一开始有误差,以为会有类似 Java Heap 类似的回收的概念,后来仔细研究了一下,这个参数的大小,只能控制 Mysql 使用内存的上限,Mysql 会尽可能的使用缓存。那么之前曲线增长缓慢,也是因为业务在逐渐增长,到目前为止,还没有把缓存使用完。
后续
后来在阿里云官方文档《云数据库MySQL实例的内存使用率告警》中,也找到了对应的说明:
云数据库 RDS MySQL 版的缓冲池默认使用实例内存规格的80%,在实例使用过程中势必会造成缓冲池内存占比的增加。
当内存使用超过80%出现告警,且确认为缓冲池内存占用时,建议将监控指标设置为90%。
网友评论