首页 > 解决方案 > Redis 快速填满内存,运行 --bigkeys 释放它

问题描述

一个月前,Redis 突然开始快速填满服务器内存。为了调试问题,我们运行了 redis-cli --bigkeys,令我们惊讶的是,所有使用的内存都被释放了。

我们有一个由 6 个节点组成的集群,分别是 3 个主节点和 3 个从节点,每个主节点数据库大约 15GB。每个节点都存储在一个专用的盒子中,每个盒子有 64GB。Redis 每天两次填满 64GB 的整个内存。我们有一个每天两次运行 redis-cli --bigkeys 的 cron 来释放使用的内存。

可能是什么原因?

谢谢你。

标签: redisredis-cluster

解决方案


除非您每天运行两次,否则听起来您会遇到OOM command not allowed错误。redis-cli --bigkeys

如果是这种情况,您可能有很多和/或大键EXPIRE,不断添加。过期的密钥从内存中删除:

  • 被动:当你尝试访问它并且发现密钥超时时。这就是redis-cli --bigkeys帮助您的方式,它强制在所有键空间中进行被动删除。
  • 主动:每 100 毫秒,它会尝试从内存中随机删除过期的密钥,每个周期在其上投入的时间不会超过 1 毫秒,直到它估计剩余的过期密钥少于 25%。逻辑不是那么简单,请参阅activeExpireCycle

因此,在您的情况下,活动到期无法赶上这一切。

根据您的评论,maxmemory=0maxmemory-policy=noeviction。您可能需要考虑设置一个maxmemory值,然后maxmemory-policy=noevictionvolatile-ttl删除具有最近到期时间的键)。

这是做什么的,每当写命令发现你结束时maxmemory,它会根据策略尝试为新密钥释放空间。该volatile-ttl策略将首先驱逐任何剩余的过期密钥。见 evict.c

您还可以增加后台任务的频率,以更频繁地清除过期密钥,请参阅redis.conf中的 hz 。你可以加倍到20。

默认 "hz" 设置为 10。提高该值会在 Redis 空闲时使用更多 CPU,但同时会在有多个 key 同时过期时使 Redis 响应更快,超时可能会处理更多精确。

另外,activedefrag=yes可能会有所帮助,请参见此处

有一个新的active-expire-effortredis.conf 设置可以让你在 active-expire 中投入更多的 CPU,但它在最新的稳定版本 (5.0.7) 中不可用。

用于INFO memory了解您的 redis 服务器内存状态。如果上述内容对您没有帮助,请使用此输出更新问题。


推荐阅读