• 内存碎片

  • 现象:内存空间闲置

  • 生成原因:操作系统的内存分配机制 + Redis 的负载特征

    • 操作系统按固定大小分配内存,而不是完全按照应用程序申请的内存空间大小给程序分配

    • 当程序申请的内存最接近某个固定值时,Redis 使用的 jemalloc 会给它分配相应大小的空间

      • 为了减少分配次数
  • 判断是否有内存碎片

      1. 执行 INFO memory

      • used_memory_rss:操作系统实际分配的物理内存空间,包含了碎片
      • used_memory:保存数据实际申请使用的空间
      • mem_fragmentation_ratio:当前的内存碎片率
      • mem_fragmentation_ratio = used_memory_rss / used_memory
    • 经验阈值

      • 合理情况:mem_fragmentation_ratio 大于 1 但小于 1.5
      • 需要采取措施:mem_fragmentation_ratio 大于 1.5
      • 小于 1 时在使用 Swap,应该升级服务器配置或增加集群实例数量
  • 清理

    • image.png

    • 暴力:重启 Redis 实例

    • 4.0-RC3 之后提供了内存碎片自动清理的方法

      • “搬家让位,合并空间”
      • 启用: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,导致响应延迟升高