redis内存碎片产生原因

2021-01-19 11:27发布

一、什么是redis内存碎片?

由于一块连续空闲的空间比所要申请的空间小,导致这块空间不可用,对于内存整体来说就是内存碎片。

二、redis内存碎片产生原因

常用的增删改redis都会产生一定的碎片。

1.写入数据

内存是根据分配策略固定的大小来划分内存空间的 , 为了减少分配次数,Redis 会根据申请的内存最接近的固定值分配相应大小的空间。

2.修改数据

键值对进行修改时,可能会变大也会变小,相应的就会占用额外空间或者释放不用的空间。

3.删除数据

删除某个value后,删除了字节,释放了空间。

三、redis内存碎片危害性

在 Redis 中,由于大量的碎片存在,会导致实际利用率变低。

三、如何解决

1.版本低于4.0

如果你的Redis版本是4.0以下的,Redis服务器重启后,Redis会将没用的内存归还给操作系统,碎片率会降下来。

2.版本高于4.0

可以在不重启的情况下,线上整理内存碎片 ,自动碎片清理,只要设置了如下的配置,内存就会自动清理了。

config set activedefrag yes

下面参数都是满足任一条件后就可以进行清理:

active-defrag-ignore-bytes 100mb:表示内存碎片的字节数达到 100MB 时,开始清理;

active-defrag-threshold-lower 10:表示内存碎片空间占操作系统分配给 Redis 的总空间比例达到 10% 时,开始清理。

active-defrag-threshold-upper 100    :表示内存碎片超过 100%,尽最大清理。

Redis 同时还提供了监控 CPU 占用比例的参数,在满足以下条件时才会保证清理正常开展:

active-defrag-cycle-min 25: 表示自动清理过程所用 CPU 时间的比例不低于 25%,保证清理能正常开展;

active-defrag-cycle-max 75:表示自动清理过程所用 CPU 时间的比例不高于 75%,一旦超过,就停止清理,从而避免在清理时,大量的内存拷贝阻塞 Redis,导致响应延迟升高。

    手动清理 :memory purge 

    查看内存 :info memory 

        这里有一个 mem_fragmentation_ratio 的指标,它表示的就是 Redis 当前的内存碎片率 。

         mem_fragmentation_ratio = used_memory_rss/ used_memory               

                大于1:说明内存有碎片,一般在1到1.5之间是正常的。

                大于1.5:说明内存碎片率比较大,需要考虑是否要进行内存碎片清理,要引起重视。

                小于1:说明已经开始使用交换内存,也就是使用硬盘了,正常的内存不够用了,需要考虑是否要进行内存的扩容。

标签: