Redis内存碎片

发布时间 2024-01-06 16:57:55作者: 爱新觉罗LQ

Redis内存碎片(不会影响 Redis 性能,但会增加内存消耗)

1. 什么是内存碎片?

你可以将内存碎片简单地理解为那些不可用的空闲内存
举个例子:操作系统为你分配了 32 字节的连续内存空间,而你存储数据实际只需要使用 24 字节内存空间,那这多余出来的 8 字节内存空间如果后续没办法再被分配存储其他数据的话,就可以被称为内存碎片。

2. 为什么会有 Redis 内存碎片?

Redis 存储存储数据的时候向操作系统申请的内存空间可能会大于数据实际需要的存储空间

Redis 使用 zmalloc 方法(Redis 自己实现的内存分配方法)进行内存分配的时候,除了要分配 size 大小的内存之外,还会多分配 PREFIX_SIZE 大小的内存。

频繁修改 Redis 中的数据也会产生内存碎片

当 Redis 中的某个数据删除时,Redis 通常不会轻易释放内存给操作系统。

3. 如何查看 Redis 内存碎片的信息?

https://redis.io/commands/info/

info memory  # 查看 Redis 内存相关的信息

\[mem\_fragmentation\_ratio=\frac{used\_memory\_rss}{used\_memory} \]

我们认为 mem_fragmentation_ratio > 1.5 的话才需要清理内存碎片。 mem_fragmentation_ratio > 1.5 意味着你使用 Redis 存储实际大小 2G 的数据需要使用大于 3G 的内存。
如果想要快速查看内存碎片率的话,你还可以通过下面这个命令:

redis-cli -p 6379 info | grep mem_fragmentation_ratio

4. 如何清理 Redis

Redis4.0-RC3 版本以后自带了内存整理,可以避免内存碎片率过大的问题。
直接通过 config set 命令将 activedefrag 配置项设置为 yes 即可。

config set activedefrag yes

具体什么时候清理需要通过下面两个参数控制:

# 内存碎片占用空间达到 500mb 的时候开始清理
config set active-defrag-ignore-bytes 500mb
# 内存碎片率大于 1.5 的时候开始清理
config set active-defrag-threshold-lower 50

通过 Redis 自动内存碎片清理机制可能会对 Redis 的性能产生影响,我们可以通过下面两个参数来减少对 Redis 性能的影响:

# 内存碎片清理所占用 CPU 时间的比例不低于 20%
config set active-defrag-cycle-min 20
# 内存碎片清理所占用 CPU 时间的比例不高于 50%
config set active-defrag-cycle-max 50

另外,重启节点可以做到内存碎片重新整理。如果你采用的是高可用架构的 Redis 集群的话,你可以将碎片率过高的主节点转换为从节点,以便进行安全重启