首页 » Redis » Redis内存碎片mem_fragmentation_ratio

Redis内存碎片mem_fragmentation_ratio

众所周知Redis是一款内存数据库,内存碎片会影响Redis的访问效率, 平时需要对Redis的运行健康度检查时,需要关注该指标,同时需要综合判断,是否需要人工干预,Redis自己的内存管理机制可以自动清理碎片,但有可能在清理时会有性能波动或带了CPU消耗。

在oracle数据库中同样在表空间级也有碎片,使用FSFI(Free Space Fragmentation index)做为指标

REM                       largest extent                  100
REM     FSFI = 100 * sqrt(------------------) * (-------------------------------)
REM                      sum of all extents      sqrt(sqrt((number of extents)))
REM     "Tablespaces with an FSFI value greater than 30 may need free space manually coalesced."

Redis中的碎片率
查看方法
$ redis-cli info memory

mem_fragmentation _ratio = used_memory_rss /used_memory

used_memory_rss : redis从操作系统申请到的实际物理内存(包含已删除数据分配的内存)
used_memory: Redis内存分配器为数据使用分配的内存大小

used memory_rss 73797632/used memory 11977304 =6.1
比如 mem_fragmentation_ratio:6.18

mem_fragmentation_ratio<1 Redis内存分配超过了物理内存,可能在使用swap. mem_fragmentation_ratio=1 -- or -- < 1.5. 理想状态。 mem_fragmentation_ratio>1.5 Redis内存分配超过了实际需要的150%,需要关注,可能存在碎片,需要关注碎片占用内存空间mem_fragmentation_bytes. 这种就是redis的内存管理员当key delete时没有直接release给OS,而是只还给了redis的内存池。

释放内存的方法
redis4.0后增加启动自动内存碎片清理机制,方法为:
开启:config set activedefrag yes
关闭:config set activedefrag no
查看:config get activedefrag

自动内存碎片清理机制触发条件:

设置触发内存清理的条件:
active-defrag-ignore-bytes 100mb:表示内存碎片的字节数达到100MB时,开始清理;
active-defrag-threshold-lower 10:表示内存碎片空间占操作系统分配给Redis的总空间比例达到10%时,开始清理。

控制清理操作占用CPU时间比例的上、下限:
active-defrag-cycle-min 25: 表示自动清理过程所用CPU时间的比例不低于25%,保证清理能正常开展;
active-defrag-cycle-max 75:表示自动清理过程所用CPU时间的比例不高于75%,一旦超过,就停止清理,从而避免在清理时,大量的内存拷贝阻塞Redis,导致响应延迟升高。

像上面举例的碎片率达6.1,但实际使用内存过小(69.16M),未达到自动清理内存碎片的阈值(100M),不会对redis性能产生影响,所以可忽略。

打赏

目前这篇文章有1条评论(Rss)评论关闭。

  1. splash | #1
    2023-09-28 at 04:29

    I truly appreciate your technique of writing a blog. I added it to my bookmark site list and will