Redis内存消耗

2018-10-10  本文已影响0人  杨鑫科

Redis内存使用统计

命令

info memory

重点关注的指标有:used_memory_rss和used_memory以及它们的比值mem_fragmentation_ratio。

当 mem_fragmentation_ratio > 1 时,说明used_memory_rss - used_memory多出的部分内存并没有用于数据存储,而是被内存碎片所消耗,如果两者相差很大,说明碎片率严重。

当 mem_fragmentation_ratio < 1 时,这种情况一般出现在操作系统把Redis内存交换到(Swap)到硬盘导致,出现这种情况时要格外关注,由于硬盘速度远远慢于内存,Redis性能会变得很差,甚至僵死。

内存消耗划分

Redis进程内消耗主要包括:自身内存+对象内存+缓冲内存+内存碎片。

1. 对象内存

对象内存是Redis内存占用最大的一块,存储着用户所有的数据。Redis所有数据都采用key-value数据类型,每次创建键值对时,至少创建两个类型对象:key对象和value对象。内存消耗可以简单的理解为sizeof(keys)+sizeof(values)。键对象都是字符串,在使用Redis时很容易忽略键对内存消耗的影响,应当避免使用过长的键。value对象更复杂些,主要包括5种基本数据类型:字符串、列表、哈希、集合、有序集合。每种value对象类型根据使用规模不同,占用内存不同。在使用时一定要合理预估并监控value对象占用情况,避免内存溢出。

2. 缓冲内存

缓冲内存主要包括:客户端缓冲、复制积压缓冲区、AOF缓冲区。

3.内存碎片

Redis默认的内存分配器采用jemalloc,可选的分配器还有:glibc、tcmalloc。内存分配器为了更好地管理和重复利用内存,分配内存策略一般采用固定范围的内存块进行分配。
以下场景容易出现高内存碎片问题:

  1. 频繁做更新操作,例如频繁对已存在的键执行append、setrange等更新操作。
  2. 大量过期键删除,键对象过期删除后,释放的空间无法得到充分利用,导致碎片率上升。

解决方式:
1. 数据对齐:在条件允许的情况下尽量做数据对齐,比如数据尽量采用数字类型或者固定长度字符串等,但是这要视具体业务而定。
2.安全重启:重启节点可以做到内存碎片重新整理,因此可以利用高可用架构,比如Sentinel或Cluster,将碎片率过高的主节点转换为从节点,进行安全重启。

上一篇下一篇

猜你喜欢

热点阅读