文档

如何解决Redis内存使用率突然升高

更新时间:

如果Redis实例的内存使用率突然飙升,可参考本文排查原因并解决问题。

问题现象

Redis实例之前的内存使用率较低。但从某个时间点开始,内存使用率突然迅速升高,甚至达到100%。

问题原因

可能内存使用率突然升高的主要原因如下:

  • 短时间内大量写入新数据。

  • 短时间内大量创建新连接。

  • 突发访问产生大量流量超过网络带宽,导致输入缓冲区和输出缓冲区积压。

  • 客户端处理速度跟不上Redis的处理速度,导致输出缓冲区积压。

解决方案

请依次排查内存使用率突然升高的原因,并参考对应的解决方案解决问题。

排查是否写入大量新数据

排查方法:

查看Redis性能监控的入流量写QPS。如果入流量与写QPS的趋势与内存使用率的趋势一致,说明大量的数据写入导致内存使用率突然升高。

解决方案:

  1. 通过设置Key的过期时间自动清理不再需要的Key,或手动删除不再需要的Key。

  2. 升级实例规格,通过增加内存容量缓解内存使用率升高的问题。详情请参见变更实例配置

  3. 如果您的实例为标准版,扩容内存规格后仍无法解决内存使用率高的问题,可以考虑升级为集群版,将数据分布到多个数据分片节点上,减轻单个数据分片节点的内存压力。详情请参见变更实例配置

排查是否创建大量新连接

排查方法:

查看Redis性能监控的连接数。如果连接数突然增长,且与内存使用率的趋势一致说明大量新建连接导致内存使用率突然升高。

解决方案:

  1. 排查是否存在连接泄漏。

  2. 设置连接超时时间,自动关闭空闲连接。详情请参见设置客户端的超时时间

排查是否突发流量导致输入和输出缓冲区积压

排查方法:

  1. 查看性能监控的出入口流量使用率是否达到100%。

  2. 执行MEMORY STATS命令,查看clients.normal占用的内存是否过多。

    说明

    clients.normal反映了所有普通客户端连接的输入和输出缓冲区所占用的内存总量。

解决方案:

  1. 排查业务流量突发原因。

  2. 增加实例的网络带宽。详情请参见手动增加实例带宽开启带宽弹性伸缩

  3. 升级实例规格,以保证输入输出缓冲区的使用。详情请参见变更实例配置

排查是否因客户端性能问题导致输出缓冲区积压

排查方法:

在Redis中,执行MEMORY DOCTOR命令,查看big_client_buf的值。当big_client_buf=1时,代表至少有一个客户端的输出缓冲区占用内存较大。

解决方案:

执行CLIENT LIST命令,查看哪个客户端的输出缓冲区内存占用量(omem)较大。排查该客户端应用是否存在性能问题。

  • 本页导读 (1)