背景
腾讯云数据库内存 100% 确实是常年以来的热点咨询问题,以下是针对此问题的介绍说明。
一、现象分析
当遇到数据库内存长期过满,以下两种现象情况请注意和把握:
1、如果从监控中看到内存并没有持续增长,是有做回收的,说明没有持续泄露的问题 ,如果是内存持续上涨一直无法降下来 ,这明显是有问题的是需要特别关注的。
2、如果是前期内存涨的比较快(还未进入稳定平衡状态),但是后期持续保持稳定,实例也是正常稳定的。
二、原因分析
由于各家云厂商对内存的使用和统计并不完全一样,这里监控内存的显示是会有区别的,但这并不完全意味着性能或能力上存在差异。这里咱们在腾讯云侧购买规格跟阿里是一样的,但要注意的是两家云厂商的数据库实例不一定参数也是一样。因此这里不可能完全对标对比,如果要对比的话,需要在阿里云开下performance_schema 参数,保持两边的内存参数设置一致,最后再对比下两边的统计输出,因为假设腾讯云侧默认的 tmp_table_size 是 1G ,阿里 tmp_table_size 默认值很低的只有几 M ,这都会导致内存显示差异。
三、原理分析
通常内存使用分为两大类:公共和私有 。
公共部分就是上边提到的大头 innodb_buffer_pool的使用 ,这部分内存不使用就等于浪费 ,bp 会将磁盘中的数据加载到内存中处理,内存的速度是比磁盘快很多的 ,如果 bp 装不下会淘汰相对较冷的数据页加入新的数据页,所以长时间运行稳定的数据库 bp 通常是会持续占满的,可以简单理解 bp 缓存的越多,性能越好。另一部分是私有内存,私有部分是为每个数据库连接分配使用的 ,这部分内存会随着连接数增多而增多,但连接断开后并不一定会立即释放给操作系统,mysql 的内存分配器会继续保留一部分 ,当下次新连接进来的时候就不用单独再去问操作系统申请内存了,也是一种优化 ,因为从操作系统申请内存也是比较重的操作。整体两部分内存加在一起,长期稳定运行的话内存会稳定到一个值,这个值可能会比较高比如 98%-100%这样 。其实客户这个实例已经运行很久了,可以观察到之前内存一直都是这个水平的,并不是最近才突然涨到 100%的,实例也是一直在稳定运行的 ,不会是到 100%就会触发 oom 重启。
注:后续腾讯云侧也会优化下这里内存监控的显示,让客户能更直观的观测到具体用了多少内存。
参考资料
1、关于 mysql 内存使用介绍可参考:
https://cloud.tencent.com/developer/article/1727167
2、performance_schema 的使用可以参考下
https://blog.csdn.net/qq_33158376/article/details/106256988