概述
最近使用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,回收内存。
最后
以上就是现实小伙为你收集整理的Redis内存碎片高的全部内容,希望文章能够帮你解决Redis内存碎片高所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复