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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 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 的值,以减轻对正常请求处理的影响

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 缓存 监控
|
8天前
|
监控 安全 程序员
如何使用内存池池来优化应用程序性能
如何使用内存池池来优化应用程序性能
|
11天前
|
存储 缓存 Java
结构体和类在内存管理方面的差异对程序性能有何影响?
【10月更文挑战第30天】结构体和类在内存管理方面的差异对程序性能有着重要的影响。在实际编程中,需要根据具体的应用场景和性能要求,合理地选择使用结构体或类,以优化程序的性能和内存使用效率。
|
13天前
|
存储 NoSQL PHP
PHP与Redis结合使用,提升数据存储性能
随着互联网应用的发展,PHP与Redis的结合成为提升数据存储性能的重要手段。PHP作为流行的服务器端语言,常用于网站开发;Redis作为高性能内存数据库,以其快速读写能力,有效优化数据访问速度,减轻数据库压力。两者结合通过缓存机制显著提升应用响应速度,支持高并发场景下的稳定性和可扩展性。
|
30天前
|
存储 缓存 NoSQL
Redis Quicklist 竟让内存占用狂降50%?
【10月更文挑战第11天】
40 2
|
1月前
|
存储 缓存 监控
Linux中内存和性能问题
【10月更文挑战第5天】
38 4
|
21天前
|
存储 分布式计算 安全
阿里云服务器内存型r7、内存型r8y、内存型r8i实例规格性能对比与选择参考
在选择阿里云服务器实例规格时,针对内存密集型应用和数据库应用,内存型r7、内存型r8y和内存型r8i实例是这部分应用场景选择最多的热门实例规格。为了帮助大家更好地了解这三款实例的区别,并为选择提供参考,本文将详细对比它们的实例规格、CPU、内存、计算、存储、网络等方面的性能,并附上活动价格对比。让大家了解一下他们之间的不同,以供参考选择。
|
1月前
|
数据处理 Python
如何优化Python读取大文件的内存占用与性能
如何优化Python读取大文件的内存占用与性能
114 0
|
2月前
|
缓存 NoSQL 算法
14)Redis 在内存用完时会怎么办?如何处理已过期的数据?
14)Redis 在内存用完时会怎么办?如何处理已过期的数据?
56 0
|
2月前
|
存储 缓存 NoSQL
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
71 0