REDIS-内存OOM-LRU挤掉KEY
Posted monkeybron
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了REDIS-内存OOM-LRU挤掉KEY相关的知识,希望对你有一定的参考价值。
问题描述:
开发人员反应有一个redis(172.31.92.81)从库,数据比其他集群中的数据少,导致应用出现问题。
# Keyspace
db0:keys=73,expires=5,avg_ttl=0 ----正常数据
# Keyspace
db0:keys=60,expires=5,avg_ttl=0 ----异常数据
=============
问题分析:
----------
检查操作系统日志,没有发现问题。
# cat /var/log/messages
----------
检查redis日志,没有发现问题。
$ tail -f redis_server_6380.log
----------
检查配置文件,没有发现问题。
cat /usr/local/redis/redis.conf
----------
删除dump.rdb文件并重启redis,重置从库
观察redis发现keys=73,但是2分钟以后下降到keys=60
----------
监控redis运行命令,没有发现问题。
# /usr/local/redis/bin/redis-cli -a xxx -h 172.31.92.81 -p xx monitor|grep -v "hget"
----------
尝试写入一条数据
set a a1
报错OOM
检查内存信息: info memory
# Memory
used_memory:5834791440 --由 Redis 分配器分配的内存总量
used_memory_human:5.43G --使用的内存量。
used_memory_rss:4738400256
used_memory_rss_human:4.41G
used_memory_peak:5836954968
used_memory_peak_human:5.44G
used_memory_peak_perc:99.96% --使用内存达到峰值内存的百分比
used_memory_overhead:1075204528
used_memory_startup:786664
used_memory_dataset:4759586912 --数据占用的内存大小
used_memory_dataset_perc:81.58% --数据占用的内存大小的百分比
total_system_memory:16657612800
total_system_memory_human:15.51G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:4294967296
maxmemory_human:4.00G
maxmemory_policy:noeviction
mem_fragmentation_ratio:0.81
观察到的现象:
used_memory_dataset_perc 达到100% ,内存溢出
redis内部算法,会删除一部分key,可以使用 monitor 命令观察到。
当删除一部分key之后,db0:keys=60,used_memory_dataset_perc:81.58%
redis状态趋于稳定。
临时解决方法:
注释掉最大内存限制:
vim redis.conf
#maxmemory 4294967296
重启之后发现,
db0:keys=73,expires=5,avg_ttl=0
一切正常。
检查内存信息: info memory
# Memory
used_memory:5834791440 --由 Redis 分配器分配的内存总量
used_memory_human:5.43G --使用的内存量。
内存使用量达到了5.43G
最初给的内存最大值为4G,说明给的内存过小。
确认问题为used_memory参数设置太小。应该把最大值调大。
----------
注释掉used_memory存在的隐患:
如果内存使用继续增大,os内存耗尽,操作系统可能变的不稳定。
以上是关于REDIS-内存OOM-LRU挤掉KEY的主要内容,如果未能解决你的问题,请参考以下文章