0
点赞
收藏
分享

微信扫一扫

20 删除数据后,为什么内存占用率还是很高?

洛茄 2022-04-13 阅读 119
redis

当删除掉 Redis 数据之后,其中释放掉的内存会交给内存分配器管理,并不会直接返还给操作系统,因此 Redis 就可能会存在删除大量数据之后,实际占用的数据量很小,但是操作系统显示 Redis 实例的内存占用率还是会很高的情况。其中有个风险就是 Redis 释放的数据内存分布本身就是不确定的,使其释放的内存空间是零散的,就有可能导致大量的零散的内存空间不能被不利于再次进行内存分配使用,使得即使 Redis 又足够的内存空间,但是却不能被利用起来,Redis 无法将其用于保存数据,导致减少了 Redis 实际保存数据量。

一、什么是内存碎片?

内存中细小的难以利用的内存空间。

二、内存碎片是如何形成的?

内存碎片产生的又两个原因,一个是内因一个是外因。内因:操作系统的内存分配机制导致;外因:Redis 自身的负载特性。

  • 内因:操作系统在进行内存分配的时候就必须按照操作系统的内部固定的最小的物理页进行内存的分配,因此就无法做到按需分配,操作系统就必须以物理页内存的大小为内存分配的基本单位进行分配给比需求的内存空间大小的大于等于的内存。
  • 外因:Redis 通常作为共用的缓存系统或者是键值对数据库对外提供服务。因此在 Redis 中保存的键值对的大小本身就是不一样,然而内存分配机制需要以物理页为基本单位为其分配一个大于等于的内存空间,导致产生一些内存碎片。同时在对键值对进行修改删除的时候就涉及到内存的释放及其再分配,这也是导致产生内存碎片的外因。
    我们可以使用 Redis 的 INFO 命令来查看内存的实际使用率,可以看到操作系统实际分配的内存空间和实际存储的数据量所占用的内存大小。

三、如何清除内存碎片?

  • 当发现 Redis 实例中含有大量的内存碎片的时候最简单的方式就是重启 Redis,但是这样做会导致还未来得及持久化的数据丢失,即使已经完成了持久化数据也需要后续通过加载 RDB 文件和执行 AOF 文件的方式来进行数据的恢复,并且恢复的时间损耗会随着 RDB 和 AOF 文件的大小递增增长。并且在没有进行切片集群部署的话,那么在 Redis 重启以及数据恢复期间都无法对外提供服务,即使拥有切片集群在进行主从切换期间仍然无法支持写操作的执行,因此这样做是不被推荐的。
  • 在 Redis 4.0-RC3 版本之后,Redis 就提供了内存碎片清除机制,该机制简单说就是“搬家让位,合并空间”(复制整理)。将原先因为分布零散的数据导致内存空间变得不连续的数据进行复制拷贝,将原先的内存空间释放出来称为一块连续的内存空间。
  • 但是“内存碎片清除”是需要代价的,其中需要将源数据复制拷贝到新的内存中,然后再释放原先所占用的内存空间,这样进行数据的迁移操作对于单线程 Redis 而言无疑时会造成阻塞的,并且其复制拷贝的还需要保证执行的顺序,即为某个数据进行复制拷贝迁移数据之后,必须先把源数据占用的内存先进行释放才能迁移其他的数据,对于有顺序执行的操作,会进一步增加 Redis 被阻塞的等待时间,导致 Redis 的性能降低。
  • 为了避免进行内存碎片清除操作造成对 Redis 正常处理请求带来较大的影响,我们可以通过设置内存碎片清楚机制的相关参数来设置清除内存碎片的开始和结束时间以及清除工作占用 CPU 的比例控制。当触及两种之间的任意一个参数就会触发内存碎片清除机制。
    • 首先将配置参数 activedefrag(动态内存碎片整理)设置为 yes,那么此时 Redis 就开启了自动进行内存碎片的清除工作。
    • active-defrag-ignore-bytes(动态内存碎片整理忽略字节)参数配置:当设置为 100mb,那么当内存碎片达到了 100mb 就开始进行内存碎片的清除。
    • active-defrag-threshold-lower(动态内存碎片整理最低门槛)参数配置:当设置为 10% 时,那么当Redis 中的内存碎片的大小达到操作系统分配给 Redis 的总空间的 10 % 就进行内存碎片清除操作。
    • active-defrag-cycle-min(动态内存碎片整理周期最小值)参数配置:当设置为 25%,表示进行内存碎片清除操作占用的 CPU 占用率不低于 25%,该参数用于保证内存碎片清除工作的正常执行。
    • active-defrag-cycle-max(动态内存碎片整理周期最大值)参数配置:当设置为 75%,表示进行内存碎片整理工作所占用的 CPU 使用率不能超过 75%,避免在进行内存碎片整理工作过程中大量的数据的复制拷贝工作阻塞掉 Redis 主线程。
举报

相关推荐

查看GPU占用率

0 条评论