系统:CentOS6.7
配置:4C8G
应用:Redis Cluster,实例化redis
一、没法启动redis,启动后系统OOM,直接杀死
二、Redis: OOM command not allowed when used memory > ‘maxmemory’网络
内存已满,不容许数据在写入
注:
used_memory_human表示已用内存
used_memory_rss表示系统给redis分配的内存(即常驻内存)
mem_fragmentation_ratio=used_memory_rss/used_memory比例,通常状况下,used_memory_rss略高于used_memory,当内存碎片较多时,则mem_fragmentation_ratio会较大,能够反映内存碎片是否不少运维
一、首先查看redis的内存使用,如上图。能够看到已用内存5G多,常驻内存3.8G多。而咱们的机器内存只有8G可用。明显内存已经充爆。接下来想到的就应该是key的量太大了仍是value的量太大了。
二、找出redis中的key。测试
###查看key的个数(最好是把key拿出来分析)keys *echo "keys *" |/usr/local/redis/bin/redis-cli -p 6381 > /tmp/6381.log
三、分析发现key中有650000的common:order:LogCacheKey这样的key,接下来咱们须要确认下这些key的大小spa
###查看key大小的命令debug objectecho 'debug object "common:order:LogCacheKey90bef863-dfc7-4739-8404-9b6624a70196"' |/usr/local/redis/bin/redis-cli -p 6381
四、分析发现common:order:LogCacheKey所占用的内存为3G左右。所以找到元凶为这个key所致使的。
五、清理keydebug
for i in `grep common:order:Log 6381.log`;do echo "del $i" |/usr/local/redis/bin/redis-cli -p 6381; done
六、key已经找到删除,如今要查找是哪一个应用产生的。
由于开发人员没在,那从运维角度,我是从网络流量来分析的,使用iftop
根据流量大小,找到对应的主机,联系到开发人员确认。code
若是key少的话,能够直接取出每一个key对应的value的大小,按照从大到小的顺序排序blog
for i in `cat /tmp/6379.log`;do echo -n "$i "; echo "debug object $i"|/usr/local/redis/bin/redis-cli -p 6379|awk -F '[ |:]+' '{print $9}';done|sort -r -n -k2
一、问题发生后,用最快最简单的方式先把问题解决。减小影响的时间。好比升级扩大内存。
二、这次遇到的问题是在测试环境,若是确认redis中数据能够清除,能够使用暴力的方式直接清空本地的实例化文件,将内存释放出来。可是生产环境切不可进行此操做。排序