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,回收内存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章