内存碎片

内存碎片解释:

操作系统的剩余内存空间总量足够,但是应用申请的是一块连续地址空间的N字节,但在剩余的内存空间中,没有大小为N字节的连续空间,那么,这些剩余空间就是内存碎片.

内存碎片形成的原因:

内因是操作系统的内存分配机制,外因是Redis的负载特性

内因:

Redis默认使用jemalloc内存分配器来分配内存,jemalloc的分配策略之一,是按照一系列固定的大小划分内存空间,例如8字节,16字节,32字节..2KB.当程序申请的内存最接近某个固定值时,jemalloc会给它分配相应大小的空间.

外因:

Redis不同大小的键值对要申请内存空间分配时,本身就会有大小不一的空间需求;内存分配器只会按固定大小内存分配,一般要比申请的空间大一些,不会完全一致,这本身就会造成一定的碎片,降低内存空间存储效率.

Redis的键值对会进行修改和删除,导致空间的释放和扩容

判断是否有内存碎片

INFO memory



# Memory
used_memory:1073741736
used_memory_human:1024.00M
used_memory_rss:1997159792
used_memory_rss_human:1.86G

mem_fragmentation_ratio:1.86

 

其中

used_memory :Redis为了保存数据实际申请使用的空间

used_memory_rss:操作系统实际分配给Redis的物理内存空间

mem_fragmentation_ratio = used_memory_rss/used_memory

mem_fragmentation_ratio 大于1但小于1.5 这种情况是合理的

mem_fragmentation_ratio 大于1.5 表明内存碎片率已经超过了50%,这个时候就要降低内存碎片率了.

mem_fragmentation_ratio小于1 说明used_memory大于used_memory_rss,意味着Redis实际存储数据的内存要大于操作系统分配给Redis进程的物理内存,说明Redis没有足够的物理内存可以使用了.

清理内存碎片的措施

1 重启redis实例 (不可取),

因为Redis中的数据没有持久化,那么数据就会丢失;

即使Redis数据持久化了,我们还需要通过AOF或RDB进行恢复,恢复时长取决于APF和RDB的大小

2 Redis自身的内存碎片自动清理功能

config set activeegefrag yes ##确定启用自动内存碎片清理

  

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

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

以上两个条件,只要有一个条件不满足了,就会停止自动清理功能

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

active-defrag-cycle-max 72:表示自动清理过程所用CPU时间的比例不高于75%,一旦超过,就会停止清理;

 

posted @ 2022-06-24 18:10  X__cicada  阅读(200)  评论(0编辑  收藏  举报