redis - Redis 快速填满内存,运行 --bigkeys 释放它
问题描述
一个月前,Redis 突然开始快速填满服务器内存。为了调试问题,我们运行了 redis-cli --bigkeys,令我们惊讶的是,所有使用的内存都被释放了。
我们有一个由 6 个节点组成的集群,分别是 3 个主节点和 3 个从节点,每个主节点数据库大约 15GB。每个节点都存储在一个专用的盒子中,每个盒子有 64GB。Redis 每天两次填满 64GB 的整个内存。我们有一个每天两次运行 redis-cli --bigkeys 的 cron 来释放使用的内存。
可能是什么原因?
谢谢你。
解决方案
除非您每天运行两次,否则听起来您会遇到OOM command not allowed
错误。redis-cli --bigkeys
如果是这种情况,您可能有很多和/或大键EXPIRE
,不断添加。过期的密钥从内存中删除:
- 被动:当你尝试访问它并且发现密钥超时时。这就是
redis-cli --bigkeys
帮助您的方式,它强制在所有键空间中进行被动删除。 - 主动:每 100 毫秒,它会尝试从内存中随机删除过期的密钥,每个周期在其上投入的时间不会超过 1 毫秒,直到它估计剩余的过期密钥少于 25%。逻辑不是那么简单,请参阅activeExpireCycle。
因此,在您的情况下,活动到期无法赶上这一切。
根据您的评论,maxmemory=0
和maxmemory-policy=noeviction
。您可能需要考虑设置一个maxmemory
值,然后maxmemory-policy=noeviction
(volatile-ttl
删除具有最近到期时间的键)。
这是做什么的,每当写命令发现你结束时maxmemory
,它会根据策略尝试为新密钥释放空间。该volatile-ttl
策略将首先驱逐任何剩余的过期密钥。见 evict.c。
您还可以增加后台任务的频率,以更频繁地清除过期密钥,请参阅redis.conf中的 hz 。你可以加倍到20。
默认 "hz" 设置为 10。提高该值会在 Redis 空闲时使用更多 CPU,但同时会在有多个 key 同时过期时使 Redis 响应更快,超时可能会处理更多精确。
另外,activedefrag
=yes
可能会有所帮助,请参见此处。
有一个新的active-expire-effort
redis.conf 设置可以让你在 active-expire 中投入更多的 CPU,但它在最新的稳定版本 (5.0.7) 中不可用。
用于INFO memory
了解您的 redis 服务器内存状态。如果上述内容对您没有帮助,请使用此输出更新问题。
推荐阅读
- c++ - 将 std::string 称为 char*
- oop - 减少 DTO 验证的代码重复
- java - # 网格中最小值为 88 的子网格数
- python - 如何将正在运行的帧与opencv中的新屏蔽帧结合起来?
- javascript - 为什么小书签脚本被阻止?网页 CSP 似乎没问题
- java - 以编程方式创建文本视图的问题
- ajax - 如何刷新传单标记值
- python - PYTHON - 将元组转换为字符串
- snakemake - Snakemake 扩展功能替代
- amazon-web-services - 从一个帐户中的 jenkins 启动 aws ssm 到另一个实例中的 ec2 以进行数据传输