如何排查内存碎片的问题

数据库NoSQL数据库技术服务知识库
问题描述

使用 info memory 命令查看 redis 内存相关使用情况,发现内存碎片较多,我们该如何排查此类问题?

问题分析

内存碎片的产生通常有如下两个原因:

  1. 操作系统的内存分配机制:内存分配器通常按照固定大小来分配内存,而不是按照程序实际申请的空间来分配,做不到按需分配
  2. 用户的业务特征:Redis 作为 KV 类型的缓存数据库,对于增删改查的操作,如果键值对大小不一致,可能会产生较大的内存碎片。同时,键值对的删除修改也会带来内存空间变化

如何判断内存碎片

Redis 自身提供了 INFO 命令,可以用来查询内存使用的详细信息,命令如下

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 当前的内存碎片率。上面的命令中的两个指标 used_memory_rss 和 used_memory 相除的结果得出碎片率

解决方案

在 redis 4.0 之前,我们只能通过重启实例来进行解决,从 4.0 开始,我们可以通过设置如下参数来让 redis 启用自动内存碎片整理:

  1. activedefrag yes : 启用自动内存碎片清理。
  2. active-defrag-ignore-bytes 100mb:碎片清理的最小碎片内存,碎片内存到达 100mb 后开始清理。
  3. active-defrag-threshold-lower 10:表示内存碎片空间占分配给 redis 总空间的 10% 开始清理,此参数和 active-defrag-ignore-bytes 必须同时满足,有一个不满足停止自动清理。

为了尽可能减少内存碎片整理影响正常的业务请求,redis 还提供了额外两个参数:

  1. active-defrag-cycle-min 25:表示碎片清理占用CPU最少的比例,保证碎片清理可以正常运行。
  2. active-defrag-cycle-max 75:表示碎片清理占用CPU最大的比例,让碎片清理的影响降到最低。
44
0
0
0
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论