Redis 删除数据后内存占用依旧很高

155 阅读2分钟

如果你使用Redis的时候比较仔细,就会发现一个很奇怪的现象。数据删除后Redis的内存释放会由内存分配器管理,不会立即还给操作系统。

这里有一个潜在的风险,Redis释放的内存空间可能并不连续,如果有空闲空间,却无法用来保存数据,就会减少Redis的内存使用率,降低运行机器的成本回报率。

为什么会出现这种情况呢?Redis采用的是jemalloc库来分配内存,由于这种分配方式会按照2的N次幂数来分配空间,减少分配的次数。缺点是会造成内存碎片。如图:

如何判断是否有内存碎片呢?Redis本身提供了INFO命令。mem_fragmentation_ratio指标就表示内存碎片率。

mem_fragmentation_ratio 大于 1 但小于 1.5。这种情况是合理的。这是因为,刚才我介绍的那些因素是难以避免的。毕竟,内因的内存分配器是一定要使用的,分配策略都是通用的,不会轻易修改;而外因由 Redis 负载决定,也无法限制。所以,存在内存碎片也是正常的。

mem_fragmentation_ratio 大于 1.5 。这表明内存碎片率已经超过了 50%。一般情况下,这个时候,我们就需要采取一些措施来降低内存碎片率了。

如何解决内存碎片呢?

  • 万能的重启可以解决。

  • Redis提供了自动内存碎片清理。config set activedefrag yes开启自动清理功能

active-defrag-ignore-bytes 100mb:表示内存碎片的字节数达到 100MB 时,开始清理;

active-defrag-threshold-lower 10:表示内存碎片空间占操作系统分配给 Redis 的总空间比例达到 10% 时,开始清理。

active-defrag-cycle-min 25: 表示自动清理过程所用 CPU 时间的比例不低于 25%,保证清理能正常开展;

active-defrag-cycle-max 75:表示自动清理过程所用 CPU 时间的比例不高于 75%,一旦超过,就停止清理,从而避免在清理时,大量的内存拷贝阻塞 Redis,导致响应延迟升高。