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)评论关闭。