一、什么是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:说明已经开始使用交换内存,也就是使用硬盘了,正常的内存不够用了,需要考虑是否要进行内存的扩容。
来源:oschina
链接:https://my.oschina.net/wuhairong/blog/4912500