内存碎片解释:
操作系统的剩余内存空间总量足够,但是应用申请的是一块连续地址空间的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%,一旦超过,就会停止清理;