redis占用内存较高排查
现象
发现生产环境上的一台服务器出现内存使用率达到阈值的告警
登上服务器使用 top 命令发现,这台服务器上的 redis实例消耗了大量的内存,而且cpu使用率很高,应该是有应用往 redis 上进行大量的读写操作
定位问题
我们首先看一下任意key的过期时间是多少
# 从当前数据库中随机返回一个 key
127.0.0.1:6379> RANDOMKEY
127.0.0.1:6379> TTL key
(integer) 12032145
# 我们发现,key的过期时间设置成了一千多万秒!这个过期时间也太长了吧
再查看一下 Redis 的内存回收策略配置
127.0.0.1:6379> info memory
maxmemory:0
maxmemory_policy:"noeviction"
# 可以看到,我们没有设置内存最大限制,而且内存回收策略是noeviction,即不淘汰任何键值对
查看了这两个选项之后,问题就清晰起来了:
key的过期时间设置的太长,没有设置最大可用内存限制而且内存回收策略是noeviction 就会使得原先的数据还没过期,又有新的数据写进来,导致消耗内存越来越多,而系统又无法进行回收
解决方法
- 重新给键设置过期时间: 这个不太现实,因为生产环境中的 Redis 有大量的 Key,不可能说一个一个的重新设置过期时间
- 修改配置文件(推荐使用): 我们可以更改 Redis 的配置,设置最大内存使用限制以及内存回收策略
修改 Redis 配置文件,添加如下两个字段:
maxmemory:10G
maxmemory_policy:"volatile-lru"
我们设置了最大内存使用限制为10G,一旦redis占用内存超过10GB,就会触发内存回收机制volatile-lru,在设置了过期时间的key里,删除最近最少使用的key
更改配置后重启一下,等待一段时间后发现 Redis 消耗的内存降下去了,也不再告警了

浙公网安备 33010602011771号