数据库自治服务DAS的巡检评分功能,支持对Redis的内存碎片率进行健康评分,本文介绍什么是Redis内存碎片,Redis内存碎片如何形成,以及如何通过Redis内存碎片率判断Redis是否存在内存碎片。
什么是Redis内存碎片?
操作系统的剩余空间总量足够,但申请一块N字节连续地址的空间时,剩余内存空间中没有大小为N字节的连续空间,那么这些剩余内存空间中,小于N字节的连续内存空间就是内存碎片。
若数据库实例为阿里云数据库 Tair(兼容 Redis)实例,内存碎片带来的膨胀不会影响该实例的内存配额,也不会产生额外的费用。
例如配额为1 GB的云数据库 Tair(兼容 Redis)实例,已使用700 MB内存,内存碎片率为2倍,实际占用系统内存为2 GB,但该实例剩余可用容量仍为300 MB(1 GB减去700 MB)。
Redis内存碎片是如何形成的?
内存碎片形成有内部原因和外部原因:
内部原因:内存分配器的分配策略决定操作系统无法做到“按需分配”。
Redis使用libc、jemalloc、tcmalloc多种内存分配器来分配内存,默认使用jemalloc。
内存分配器是按照固定大小来分配内存空间,不是完全按照应用程序申请的内存大小来分配。
以jemalloc为例,是按照一系列固定的大小划分内存空间,例如8字节、16字节、32字节、...、2KB、4KB等。当程序申请的内存最接近某个固定值时,jemalloc就会给它分配相应大小的空间。
外部原因:键值对大小不一样,并且键值对可以被修改和删除。
Redis申请内存空间分配时,对于大小不一的内存空间需求,内存分配器按照固定大小分配内存空间,分配的内存空间一般都会比申请的内存空间大一些,这会产生一定的内存碎片。
键值对会被修改和删除,会导致空间的扩容和释放。
如何判断Redis是否有内存碎片?
DAS通过Redis提供的INFO命令,查询内存使用的详细信息,命令如下:
INFO memory
# Memory
used_memory:350458970752
used_memory_human:326.39G
used_memory_rss:349066919936
used_memory_rss_human:325.09G
…
mem_fragmentation_ratio:1.00
used_memory:表示Redis为了保存数据实际申请使用的内存空间。
used_memory_rss:表示操作系统实际分配给Redis的物理内存空间,其中包含了内存空间碎片。
mem_fragmentation_ratio:表示Redis当前的内存碎片率。
计算公式:mem_fragmentation_ratio=used_memory_rss/used_memory
mem_fragmentation_ratio大于等于1但小于等于1.5,这种情况是合理的。
mem_fragmentation_ratio大于1.5,表明内存碎片率已经超过了50%。