1、Redis内存碎片是如何形成的
一是内存分配器的分配策略,内存分配器一般是按固定大小来分配内存,而不是按实际使用大小来分配。例如8字节、16字节、32字节...,2KB,4KB,8KB等,按程序申请时最接近某个固定值。
二是Redis键值大小不一和删改操作,Redis申请内存分配空间时,本身就会有键值大小不一的空间需求,然后这些键值会被修改和删除,如修改变大或变小,就需要额外占用空间或释放不用的空间。Redis删除键值也会释放内存空间,形成空闲内存。
如图所示内存碎片形成:
大量内存碎片的存在,会造成Redis内存利用率低。
2、如何判断内存碎片
Redis提供了INFO命令,可以利用INFO命令来查询:
INFO memory
# Memory
used_memory:1024000000
used_memory_human:1024.00M
used_memory_rss:1998000000
used_memory_rss_human:1.86G
...
mem_fragmentation_ratio:1.86
mem_fragmentation_ratio 大于1小于1.5时,一般来说是合理的
mem_fragmentation_ratio 大于1.5时,内存碎片率已经超过50%了,这个时候我们就要采取一些措施来降低内存碎片率了。
mem_fragmentation_ratio < 1 时,这种情况就需要非常注意了,这说明系统的内存已经严重不足了,Redis的内存已经与磁盘进行了swap,严重影响Redis性能。
3、如何处理Redis内存碎片
(1)重启Redis实例,使用主从切换的方式减小重启的影响,重启后重新同步主的实例数据
(2)Redis 4.0-RC3版本对接下,Redis自身提供了一种内存碎片自动清理的方法,简单来说就是:搬家让位,合并空间。不过,需要注意碎片清理是有代价的。
Redis启用自动内存碎片清理配置设为:yes
config set activedefrag yes
启用自动清理功能后,还依赖两个参数的控制,只要有一个条件不满足,就停止自动清理
active-defrag-ignore-byte 100mb:表示内存碎片的字节数达到100MB时,开始清理
active-defrag-threshold-lower 10:表示内存碎片空间占操作系统分配给Redis的总空间比例达到10%时,开始清理
为了尽可能的减少内存碎片清理对Redis正常请求的影响,Redis内存碎片在清理执行时,还会监控清理操作占用CPU的时间,设置了两个参数,分别用于控制清理操作占用CPU时间比例的上、下限。
active-defrag-cycle-min 25:表示自动清理过程中所用CPU时间的比例不低于25%,保证清埋工作正常展开
active-defrag-cycle-max 75:表示自动清理过程中所用CPU时间的比例不高于75%,一量超过,立即停止,减少对Redis主进程的影响