REDIS-内存OOM-LRU挤掉KEY

问题描述:
开发人员反应有一个redis从库,数据比其他集群中的数据少,导致应用出现问题。

# 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_6379.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 xxx -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内存耗尽,操作系统可能变的不稳定。

 

posted @ 2019-10-11 00:53  monkeybron  阅读(868)  评论(0编辑  收藏  举报