-
内存碎片
-
现象:内存空间闲置
-
生成原因:操作系统的内存分配机制 + Redis 的负载特征
-
操作系统按固定大小分配内存,而不是完全按照应用程序申请的内存空间大小给程序分配
-
当程序申请的内存最接近某个固定值时,Redis 使用的 jemalloc 会给它分配相应大小的空间
- 为了减少分配次数
-
-
判断是否有内存碎片
-
-
执行 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,应该升级服务器配置或增加集群实例数量
-
-
清理
-
-
暴力:重启 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,导致响应延迟升高
-