Redis学习笔记-内存碎片对性能的影响

简介: Redis学习笔记-内存碎片对性能的影响

有时候在使用 Redis 的时候会遇到这样一个现象,已经删除了很多数据,但是 Redis 还是占用了很多内存,这是因为数据删除后,Redis 释放的内存空间会由内存分配器管理,并不会立即返回给操作系统,Redis 释放的内存空间可能并不是连续的,这些不连续的内存空间很有可能处于一种闲置状态,这篇文章学习一下内存碎片是如何产生的,然后如何在不影响 Redis 性能情况下进行内存碎片清理。


1.笔记图

2.内存碎片

操作系统的剩余内存空间总量足够,应用程序申请的是一块连续地址空间的 N 字节,但在剩余的内存空间中,没有大小为 N 字节的连续空间,这些剩余空间就是内存碎片

2.1 形成原因

  • 内因:内存分配器的分配策略
  • 内存分配器一般是按固定大小来分配内存,而不是完全按照应用程序申请的内存空间大小给程序分配
  • Redis 可以使用 libc、jemalloc、tcmalloc 多种内存分配器来分配内存,默认使用 jemalloc
  • jemalloc 的分配策略之一,是按照一系列固定的大小划分内存空间(如 8KB、16KB),为了减少分配次数
  • 外因:键值对大小不一样和删改操作

  • Redis 申请内存空间分配时,大小不一的空间需求,内存分配器是按照固定大小分配内存,一般比 Redis 申请的空间大

  • 键值对会被修改和删除,这会导致空间的扩容和释放

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

  • 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
  • used_memory_rss:是操作系统实际分配给 Redis 的物理内存空间
  • used_memory:是保存数据实际申请的空间
  • mem_fragmentation_ratio:表示 Redis 当前的内存碎片率,mem_fragmentation_ratio = used_memory_rss/ used_memory,大于 1 但小于 1.5 这种是合理的,大于 1.5,表明内存碎片率已经超过 50%

2.3 如何清理内存碎片

  • 重启Redis实例:
  • 如果 Redis 中的数据没有持久化,数据就会丢失
  • 如果做了持久化,恢复时长处决于 AOFRDB 的大小
  • 自动清理(4.0以后)
  • 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,导致响应延迟升高
  • 启用自动内存碎片清理,配置项 config set activedefrag 设置为 yes
  • 参数说明

2.4 小建议

如果在实践过程中遇到 Redis 性能变慢,记得通过日志看下是否正在进行碎片清理,如果 Redis 正在清理碎片,建议调小 active-defrag-cycle-max 的值,以减轻对正常请求处理的影响

相关文章
|
运维 NoSQL 测试技术
Redis:内存陡增100%深度复盘
本文深度分析了Redis内存陡增100%的一些细节和解决方案。
479 1
Redis:内存陡增100%深度复盘
|
5月前
|
存储 缓存 NoSQL
工作 10 年!Redis 内存淘汰策略 LRU 和传统 LRU 差异,还傻傻分不清
小富带你深入解析Redis内存淘汰机制:LRU与LFU算法原理、实现方式及核心区别。揭秘Redis为何采用“近似LRU”,LFU如何解决频率老化问题,并结合实际场景教你如何选择合适策略,提升缓存命中率。
642 3
|
5月前
|
存储 缓存 NoSQL
Redis持久化深度解析:数据安全与性能的平衡艺术
Redis持久化解决内存数据易失问题,提供RDB快照与AOF日志两种机制。RDB恢复快、性能高,但可能丢数据;AOF安全性高,最多丢1秒数据,支持多种写回策略,适合不同场景。Redis 4.0+支持混合持久化,兼顾速度与安全。根据业务需求选择合适方案,实现数据可靠与性能平衡。(238字)
|
5月前
|
消息中间件 存储 关系型数据库
千亿消息“过眼云烟”?Kafka把硬盘当内存用的性能魔法,全靠这一手!
Apache Kafka 是由 LinkedIn 开发并捐赠给 Apache 基金会的分布式消息队列系统,具备高吞吐、可扩展和容错能力。其核心设计围绕主题、分区、分段和偏移量展开,通过顺序写入磁盘和 Page Cache 提升性能,广泛应用于大数据实时处理场景。
226 0
|
8月前
|
存储 监控 NoSQL
流量洪峰应对术:Redis持久化策略与内存压测避坑指南
本文深入解析Redis持久化策略与内存优化技巧,涵盖RDB快照机制、AOF重写原理及混合持久化实践。通过实测数据揭示bgsave内存翻倍风险、Hash结构内存节省方案,并提供高并发场景下的主从复制冲突解决策略。结合压测工具链构建与故障恢复演练,总结出生产环境最佳实践清单。
311 9
|
8月前
|
存储 缓存 分布式计算
高内存场景必读!阿里云r7/r9i/r8y/r8i实例架构、性能、价格多维度对比
阿里云针对高性能需求场景,一般会在活动中推出内存型r7、内存型r9i、内存型r8y和内存型r8i这几款内存型实例规格的云服务器。相比于活动内的经济型e和通用算力型u1等实例规格,这些内存型实例在性能上更为强劲,尤其适合对内存和计算能力有较高要求的应用场景。这些实例规格的云服务器在处理器与内存的配比上大多为1:8,但它们在处理器架构、存储性能、网络能力以及安全特性等方面各有千秋,因此适用场景也各不相同。本文将为大家详细介绍内存型r7、r9i、r8y、r8i实例的性能、适用场景的区别以及选择参考。
|
7月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
716 0
|
弹性计算 安全 数据库
【转】云服务器虚拟化内存优化指南:提升性能的7个关键策略
作为云计算服务核心组件,虚拟化内存管理直接影响业务系统性能表现。本文详解了内存优化方案与技术实践,助您降低30%资源浪费。
254 0
【转】云服务器虚拟化内存优化指南:提升性能的7个关键策略
|
9月前
|
存储 分布式计算 安全
阿里云服务器内存型实例怎么选?r7/r8y/r8i实例性能、适用场景与选择参考
在选择阿里云服务器时,针对内存密集型应用和数据库应用,内存型实例因其高内存配比和优化的性能表现,成为了众多用户的热门选择。在目前阿里云的活动中,内存型实例主要有内存型r7、内存型r8y和内存型r8i实例可选。为了帮助大家更好地了解这三款实例的区别,本文将详细对比它们的实例规格、CPU、内存、计算、存储、网络等方面的性能,并附上活动价格对比,以便用户能够全面了解它们之间的不同,以供选择和参考。