我是靠谱客的博主 现实小伙,最近开发中收集的这篇文章主要介绍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,回收内存。

最后

以上就是现实小伙为你收集整理的Redis内存碎片高的全部内容,希望文章能够帮你解决Redis内存碎片高所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部