Redis性能篇(四)Redis内存碎片

Redis被广泛使用的一个很重要的原因是它的高性能。因此我们必要要重视所有可能影响Redis性能的因素、机制以及应对方案。影响Redis性能的五大方面的潜在因素,分别是:

Redis内部的阻塞式操作

CPU核和NUMA架构的影响

Redis关键系统配置

Redis内存碎片

Redis缓冲区

这一讲学习Redis的内存空间存储效率问题,探索一下,为什么数据已经删除了,但内存却闲置着没有用,以及相应的解决方案。

什么是内存碎片

我们用高铁车厢说明,假设一个车厢的座位总共有60个,现在已经卖 了57张票,需要三张连在一起的票,但发现买不到了,只好换一趟车。我们可以把这些分散的空座位叫作“车厢座位碎片”。

内存碎片类似上面高铁座位的例子。虽然操作系统的剩余空间总量足够,但申请一块连续地址空间N字节时,剩余内存空间中没有大小为N字节的连续空间,那么这些剩余空间就是内存碎片

内存碎片是如何形成的?

内存碎片形成有内因和外因。

内因:内存分配器的分配策略

内存分配器的分配策略决定操作系统无法做到“按需分配”。内存分配器必须分配一块固定大小的连续内存空间。

以jemalloc为例,是按照一系列固定的大小划分内存空间,例如8字节、16字节、32字节、...、2KB、4KB等。当程序申请的内存最接近某个固定值时,jemalloc就会给它分配相应大小的空间。

外因:键值对大小不一样和删改操作

一是,前面讲到,内存分配器只能按照固定大小分配内存,所以,分配的内存空间一般都会比申请的空间大一些,不会完全一致,这本身就千万一定的碎片,降低内存空间存储效率。

二是,这些键值被修改和删除,会导致空间的扩容和释放。

大量内存碎片的存在,会造成Redis的内存实际利用率变低。那如何解决这些内存碎片呢?在此之前,我们先来学习如何判断是否有内存碎片。

如何判断是否有内存碎片?

Redis提供INFO命令,用来查询内存使用的详细信息,命令如下:

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywdyz.html