61

我有一个 Amazon RDS 实例。自设置超过 1-2 周以来,可用内存一直在下降,从 15GB 内存下降到大约 250MB。由于它在最近几天下降到这个低点,它开始类似于锯齿模式,其中可用内存下降到这个范围(250 - 350MB),然后以锯齿模式重新回到 500 - 600MB。

申请质量没有明显下降。但是,我担心数据库会耗尽内存并崩溃。

是否存在 RDS 实例内存不足的危险?是否有一些设置或参数我应该查看以确定实例是否设置正确?是什么导致了这种锯齿状图案?

可释放内存下降

4

3 回答 3

48

简短的回答 - 您不应该担心 FreeableMemory,除非它变得非常低(大约 100-200 Mb)或发生大量交换(请参阅 RDS SwapUsage 指标)。

FreeableMemory 不是 MySQL 指标,而是 OS 指标。很难给出精确的定义,但您可以将其视为操作系统能够分配给任何请求它的内存(在您的情况下可能是 MySQL)。MySQL 有一组设置将其整体内存使用限制在某个上限(您可以使用类似的东西来实际计算它)。您的实例不太可能达到此限制,因为通常您永远不会达到最大连接数,但这仍然是可能的。

现在回到 FreeableMemory 指标中的“下降”。对于 MySQL,InnoDB 缓冲池消耗的大部分内存(请参见此处详情)。默认情况下,配置中的 RDS 实例将此缓冲区的大小设置为主机物理内存的 75% - 在您的情况下约为 12 GB。此缓冲区用于缓存在读取和写入操作中使用的所有 DB 数据。所以在你的情况下,因为这个缓冲区真的很大 - 它正在慢慢地填充缓存的数据(这个缓冲区很可能实际上大到足以缓存所有数据库)。因此,当您第一次启动实例时,该缓冲区是空的,并且一旦您开始将内容读/写到 DB 中,所有这些数据都会被带入缓存。他们将一直留在这里,直到此缓存已满并出现新请求。此时,最近最少使用的数据将被新数据替换。因此,数据库实例重启后 FreeableMemory 的初始下降可以解释这一事实。这不是一件坏事,因为您实际上希望尽可能多的数据被缓存,以便您的数据库更快地工作。唯一令人讨厌的事情是当部分或全部缓冲区将被推出物理内存进入交换时。到那时,您将有巨大的性能下降。

作为预防措施,调整用于不同事物的 MySQL 最大内存可能是一个好主意,以防 FreeableMemory 指标始终处于 100-200 Mb 的水平,以减少交换的可能性。

于 2015-01-22T21:52:26.023 回答
46

MySQL 使用可释放内存字段为其自己的进程进行缓冲和缓存。Freeable 内存量随时间减少是正常的。我不会担心它会排除旧信息,因为它需要更多空间。

于 2013-03-11T06:49:56.150 回答
2

在 AWS 获得了几张支持票后,我发现调整参数组会有所帮助,特别是共享缓冲区,降低它们以保持保留数量,以避免由于内存不足而导致丢失或故障转移

于 2019-02-05T21:28:35.330 回答