当前位置: 首页 > 网络应用技术

重新记忆分裂处理

时间:2023-03-08 00:04:24 网络应用技术

  我不知道在执行删除操作时是否注意到这种现象。删除一些大型键后,内存分配者分布的能力尚未减少,实际容量也减少了。为什么这是?演示如下

  创建一个脚本文件创建文件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