Redis内存碎片高

最近使用redis作为kv存一些业务数据,给redis设置了最大使用内存以及数据淘汰规则。

maxmemory 60g
maxmemory-policy allkeys-lru

设置完之后以为redis进程最多会占用60g的内存,所以就放心的使用。

但是前几天收到redis进程退出报警,查看机器内存曲线,发现redis的使用已经达到100g左右的水平,再加上其他进程也占用了一些内存,整个机器的内存被用尽,导致redis没有内存可分配异常退出。

通过info memory命令发现,redis的used_memory在60g左右,但是used_memory_rss在100g左右水平,而后者才是整个redis进程占用内存,redis的mem_fragmentation_ratio = used_memory_rss/used_memory_rss已经大于1.5,网上查询资料发现是redis本身的内存碎片化导致。

对比另外一处使用的redis服务,存储了也有50g左右的数据,使用一年多mem_fragmentation_ratio才1多一点。

通过对两个业务场景进行分析,发现内存碎片较高的redis每天都有定时任务在往里面写入大量数据,这些数据的key和原来的数据有好多不一致,这样redis本身就会通过lru策略将部分旧数据淘汰,而被淘汰的数据本身占用的内存却没有被redis进程释放,导致redis内存的有效数据虽然只有60g,但是整个进程的内存在一直增长。而另外一台内存碎片较低的机器虽然也会定期写入数据,但是因为key的重合度很高,没有大量内存的再分配。

根据现在查询的资料,没有太好的解决办法,只能对机器设置内存监控,超过95%的内存使用率之后重启redis,回收内存。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值