我不知道在执行删除操作时是否注意到这种现象。删除一些大型键后,内存分配者分布的能力尚未减少,实际容量也减少了。为什么这是?演示如下
创建一个脚本文件创建文件CreateTa.sh
执行权限
执行createata.sh脚本并等待执行
查看记忆容量
删除键的键值为OBJ后,检查内存容量
删除bigkey之后,use_memory_rss波动很小,二手符号会大量波动,因为used_memory_rss是系统地分配了redis的内存空间,而ready_memory是redis.recyclecling的内存空间,因此,即使某些Bigkey的密钥的密钥实际上使用了。删除了价值,Redis占据的空间仍然很大。这些空间将来会使用吗?这需要部门
这些内存片段可以重复使用吗?我们可以在下面考虑。
记忆片段的一个句子描述是,内存太多,但没有太多数据。我们以高速度的铁路购买票为例,上次旅行中有100个席位,已出售了97个席位,其余三个座位不相邻。然后,他们三个只能更改下一个高速导轨,因为座椅不符合他们的期望,然后在这辆公共汽车上有三个。
将片段放入内存中的是,有很多数据无法连续和自由地放置。如下图所示,您需要在内存中放置3个字节数据。尽管内存中有一个3字节的空闲内存,但免费内存不是连续的,它不能存储,这是内存碎片
Redis中有多种内存分配策略,例如LIBC,Jemalloc和Tcmalloc,默认情况下Jemalloc。操作系统的内存分配器根据这些分配策略分配内存,但是无法按需分配内存分布。通常,它根据固定尺寸分配。以默认分配策略为例,通常分配2个总体功率2,例如2、4、8、16、32等,例如redis申请a6-内存的字节,操作系统将分配8个字节内存的内存为redis,因此,如果将来没有其他操作,那么许多2个字节空间,那么这两个字节是内存片段。
根本没有优势吗?显然没有。例如,REDIS首次申请了操作系统的24个字节,并且分配器分配了32个字节,向Redis分配了32个字节。下次Redis在8个字节内写一个空间时,无需再次重新操作系统到操作系统。应用后,现有的内存空间可以完全满足要求,因此此分布方法可以减少应用程序的分布操作系统的空间。
由于不按需分配内存分配,因此不同的键值将为redis带来不同的片段,例如键值key1占据了5个字节,键值key2占据了7字节,并操作操作。系统分配了8个字节。密钥1键值的片段为3个字节,而键2键值的片段为1个字节。
关键值的修改和删除也将导致片段如下所示
片段信息REDIS提供了向用户监视片段的命令
内存信息中的mem_fragmentation_ratio指示器是内存的片段,片段速率计算如下
USED_MEMORY_RSS:这是指操作系统分配的内存大小。
under_memory:指示redis实例占据的内存大小。
例如,REDIS从操作系统申请了100个字节的内存。这是二手_MEMORY。操作系统为REDIS分配了128个字节。这是used_memory_rss。
当mem_fragmentation_ratio时<=1.5时,因为操作系统的分配器缘故碎片率避免不了,而且键值的修改,删除也会导致碎片率,所以这算是一个正常范畴。
当mem_fragmentation_ratio>1.5,相当于碎片率超过记忆实际占用的50%,这会导致浪费记忆,并且需要采取一些措施来减少碎片。
注意:如果在线数据显示mem_fragmentation_ratio <1,证明片段化率很低,如果片段速率较低,则更好?显然不是,片段化率少于1表示userd_memory_rss操作系统的内存较少,这意味着REDIS可以使用的物理内存还不够,这将触发交换并将内存数据替换为磁盘。磁盘中的数据将延迟。
当Redis版本低于4.0时,我们只能通过重新启动实例来解决问题,但是应该指出的是,即使为持久性打开了一些数据,也会丢失一些数据。
当Redis版本高于4.0时,我们可以完成配置的自动碎片。简单地描述零更换的想法,将自由记忆的自由记忆结合在一起,形成连续空间,如下所示,如下所示,如下所示
但是,一切都有两个方面。自动碎片打开后,将阻止主线程,因此您需要注意清洁参数控件。参数如下
如果主线程的业务处理在碎片化过程中被阻塞,则ActiveDefrag-Gycle-Max的最大比例必须很小。
本文使用文章同步助手同步
原始:https://juejin.cn/post/7102780689497456671