20 | 删除数据后,为什么内存占用率还是很高?

极客时间 | 《Redis核心技术与实战》学习笔记目录

原文

什么是内存碎片?

如何判断是否有内存碎片?

  • 内存利用率的高低直接关系到 Redis 运行效率的高低
  • 为了让用户能监控到实时的内存使用情况,Redis 自身提供了 INFO 命令,可以用来查询内存使用的详细信息,命令如下:
1
2
3
4
5
6
7
8
INFO memory
# Memory
used_memory:1073741736
used_memory_human:1024.00M
used_memory_rss:1997159792
used_memory_rss_human:1.86G
mem_fragmentation_ratio:1.86
  • mem_fragmentation_ratio 表示的就是 Redis 当前的内存碎片率
  • mem_fragmentation_ratio = used_memory_rss/ used_memor
  • used_memory_rss 是操作系统实际分配给 Redis 的物理内存空间,里面就包含了碎片
  • used_memory 是 Redis 为了保存数据实际申请使用的空间

一些经验阈值

  • mem_fragmentation_ratio 大于 1 但小于 1.5:合理范围
  • mem_fragmentation_ratio 大于 1.5:表明内存碎片率已经超过了 50%。一般情况下,需要采取一些措施来降低内存碎片率

如何清理内存碎片?

  • 重启 Redis 实例
    • 简单粗暴
    • 会丢失没有持久化的数据
    • 通过 AOF 或 RDB 进行恢复,恢复时长取决于 AOF 或 RDB 的大小,如果只有一个 Redis 实例,恢复阶段无法提供服务
  • 启用自动内存碎片清理,可以把 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,导致响应延迟升高。
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus