资讯

展开

Redis内存管理

作者:快盘下载 人气:

微信公众号:DBA随笔

01、redis内存管理

在Redis中删除数据之后,可能会出现Redis占用的内存不释放的问题,今天我们来看看这个问题。

Redis的内存并不由Redis本身控制,而是由内存分配管理器来负责回收或者分配。常见的内存分配管理器有libc,jemalloc,tcmalloc等,默认使用jemalloc。这些内存分配器有一个特点,都是以连续的空间为单位,向Redis分配内存,以jmelloc为例,它分配内存的单位是8字节、16字节、32字节...1kb、2kb等等,可以看到,呈指数形式,当我们的客户端程序申请的内存最接近某个固定的值时,jmelloc会分配指定的大小的内存空间,例如我们一个命令需要100字节的内存空间,jemalloc会自动分配128字节的内存空间来容纳这个key,这样就有了28字节的余量,下次再来28字节的请求,就不用重新分配资源了。

Redis释放内存的时候,是不连续的,例如,释放一个key的资源,就是释放掉这个key占用的内存空间。这就造成了连续的内存空间中,有一些不连续的内存空洞,这些不连续的内存空洞,我们就称之为内存碎片,当内存中的碎片很多的时候,内存资源可能会被浪费。设想这样一种情况,内存分配器分配了1G内存,而由于频繁的数据增删操作,导致内存碎片有500M,这样,这500M的内存就浪费掉了。

总之,内存碎片的原因有2个:

1、内存分配器不是按需分配,而是留有余量,这会导致有碎片;

2、数据增删之后,内存中会有空洞;

02、Redis中内存相关命令

Redis中使用info memory来查看内存情况。

其中有几个关键指标:

used_memory_rss:内存分配器分配的值

used_memory:实际使用的值

mem_fragmentation_ratio:分配的值除以实际值

加入分配了128k,使用了100k,此时比值就是1.28

通常情况下,这个比值在1~1.5之间比较正常;如果大于1.5,说明内存碎片率很高了,我们需要采取一定的措施。

03、如何清理内存碎片?

1、重启Redis实例。

这是一个比较粗暴的办法,但是很管用。

2、Redis4.0中提供了一种优雅的办法,内存碎片自动清理。它的本质是通过内存中的数据复制来实现的。

Redis内存管理

这种清理,可以看出来,是有代价的。因为它需要进行数据拷贝,拷贝的时候,Redis线程只能等着,无法处理业务请求。同时,要注意拷贝数据的顺序,所以会进一步降低Redis的性能。

Redis4.0以上的版本中,要开启自动碎片清理,配置如下;

config set activedefrag yes

跟自动清理功能相关的一些参数如下:

1、自动清理还有一些触发清理的条件参数:

active-defrag-ignore-bytes 100mb:表⽰内存碎⽚的字节数达到100MB时,开始清理;active-defrag-threshold-lower 10:表⽰内存碎⽚空间占操作系统分配给Redis的总空间⽐例达到10%时,开始清理

2、为了避免对性能的影响过大,配置有2个性能参数:

active-defrag-cycle-min 25:表⽰⾃动清理过程所⽤CPU时间的⽐例不低于25%,保证清理能正常开展; active-defrag-cycle-max 75:表⽰⾃动清理过程所⽤CPU时间的⽐例不⾼于75%,⼀旦超过,就停⽌清理,从⽽避免在清理时,⼤量的内存拷⻉阻塞Redis,导致响应延迟升高

加载全部内容

相关教程
猜你喜欢
用户评论
快盘暂不提供评论功能!