Redis 内存碎片详解

article/2025/9/25 0:24:33

什么是内存碎片?

你可以将内存碎片简单地理解为那些不可用的空闲内存。

举个例子:操作系统为你分配了 32 字节的连续内存空间,而你存储数据实际只需要使用 24 字节内存空间,那这多余出来的 8 字节内存空间如果后续没办法再被分配存储其他数据的话,就可以被称为内存碎片。
在这里插入图片描述

Redis 内存碎片虽然不会影响 Redis 性能,但是会增加内存消耗。

为什么会有 Redis 内存碎片?

Redis 内存碎片产生比较常见的 2 个原因:

1、Redis 存储存储数据的时候向操作系统申请的内存空间可能会大于数据实际需要的存储空间。

以下是这段 Redis 官方的原话:

To store user keys, Redis allocates at most as much memory as the maxmemory setting enables (however there are small extra allocations possible).

Redis 使用 zmalloc 方法(Redis 自己实现的内存分配方法)进行内存分配的时候,除了要分配 size 大小的内存之外,还会多分配 PREFIX_SIZE 大小的内存。

zmalloc 方法源码如下(源码地址:https://github.com/antirez/redis-tools/blob/master/zmalloc.c):

void *zmalloc(size_t size) {
// 分配指定大小的内存
void ptr = malloc(size+PREFIX_SIZE);
if (!ptr) zmalloc_oom_handler(size);
#ifdef HAVE_MALLOC_SIZE
update_zmalloc_stat_alloc(zmalloc_size(ptr));
return ptr;
#else
((size_t)ptr) = size;
update_zmalloc_stat_alloc(size+PREFIX_SIZE);
return (char
)ptr+PREFIX_SIZE;
#endif
}
另外,Redis 可以使用多种内存分配器来分配内存( libc、jemalloc、tcmalloc),默认使用 jemalloc,而 jemalloc 按照一系列固定的大小(8 字节、16 字节、32 字节…)来分配内存的。jemalloc 划分的内存单元如下图所示:

在这里插入图片描述

当程序申请的内存最接近某个固定值时,jemalloc 会给它分配相应大小的空间,就比如说程序需要申请 17 字节的内存,jemalloc 会直接给它分配 32 字节的内存,这样会导致有 15 字节内存的浪费。不过,jemalloc 专门针对内存碎片问题做了优化,一般不会存在过度碎片化的问题。

2、频繁修改 Redis 中的数据也会产生内存碎片。

当 Redis 中的某个数据删除时,Redis 通常不会轻易释放内存给操作系统。

这个在 Redis 官方文档中也有对应的原话:
在这里插入图片描述

文档地址:https://redis.io/topics/memory-optimization 。

如何查看 Redis 内存碎片的信息?

使用 info memory 命令即可查看 Redis 内存相关的信息。下图中每个参数具体的含义,Redis 官方文档有详细的介绍:https://redis.io/commands/INFO 。

在这里插入图片描述

Redis 内存碎片率的计算公式:mem_fragmentation_ratio (内存碎片率)= used_memory_rss (操作系统实际分配给 Redis 的物理内存空间大小)/ used_memory(Redis 内存分配器为了存储数据实际申请使用的内存空间大小)

也就是说,mem_fragmentation_ratio (内存碎片率)的值越大代表内存碎片率越严重。

一定不要误认为used_memory_rss 减去 used_memory值就是内存碎片的大小!!!这不仅包括内存碎片,还包括其他进程开销,以及共享库、堆栈等的开销。

很多小伙伴可能要问了:“多大的内存碎片率才是需要清理呢?”。

通常情况下,我们认为 mem_fragmentation_ratio > 1.5 的话才需要清理内存碎片。 mem_fragmentation_ratio > 1.5 意味着你使用 Redis 存储实际大小 2G 的数据需要使用大于 3G 的内存。

如果想要快速查看内存碎片率的话,你还可以通过下面这个命令:

redis-cli -p 6379 info | grep mem_fragmentation_ratio
另外,内存碎片率可能存在小于 1 的情况。这种情况我在日常使用中还没有遇到过,感兴趣的小伙伴可以看看这篇文章 故障分析 | Redis 内存碎片率太低该怎么办?- 爱可生开源社区 。

如何清理 Redis 内存碎片?

Redis4.0-RC3 版本以后自带了内存整理,可以避免内存碎片率过大的问题。

直接通过 config set 命令将 activedefrag 配置项设置为 yes 即可。

config set activedefrag yes
具体什么时候清理需要通过下面两个参数控制:

内存碎片占用空间达到 500mb 的时候开始清理

config set active-defrag-ignore-bytes 500mb

内存碎片率大于 1.5 的时候开始清理

config set active-defrag-threshold-lower 50
通过 Redis 自动内存碎片清理机制可能会对 Redis 的性能产生影响,我们可以通过下面两个参数来减少对 Redis 性能的影响:

内存碎片清理所占用 CPU 时间的比例不低于 20%

  config set active-defrag-cycle-min 20

内存碎片清理所占用 CPU 时间的比例不高于 50%

config set active-defrag-cycle-max 50

另外,重启节点可以做到内存碎片重新整理。如果你采用的是高可用架构的 Redis 集群的话,你可以将碎片率过高的主节点转换为从节点,以便进行安全重启。


http://chatgpt.dhexx.cn/article/gxZGSsbd.shtml

相关文章

redis之内存碎片问题如何解决

写在前面 本文一起看下如何处理Redis的内存碎片问题。 1:什么是内存碎片 当操作系统内存充足,但是却无法申请连续N字节内存空间时,这些剩余的内存空间就叫内存碎片。 2:内存碎片是如何形成的 内存碎片的形成有两方面的因素&a…

如何解决内存碎片

内存碎片的产生: 内存分配有静态分配和动态分配两种 静态分配在程序编译链接时分配的大小和使用寿命就已经确定,而应用上要求操作系统可以提供给进程运行时申请和释放任意大小内存的功能,这就是内存的动态分配。 因此动态分配…

内存中,外部碎片与内部碎片,解决办法

什么是内部碎片、外部碎片 外部碎片,是由于大量信息由于先后写入、置换、删除而形成的空间碎片。为了便于理解,我们将信息比作货物,将存储空间比作仓库来举例子。假设,我们有编号为1、2、3、4、5、6的6间仓库库房,前天…

内存碎片

内存碎片的产生: 内存分配有静态分配和动态分配两种 静态分配在程序编译链接时分配的大小和使用寿命就已经确定,而应用上要求操作系统可以提供给进程运行时申请和释放任意大小内存的功能,这就是内存的动态分配。 因此动态分配…

内存碎片---内部碎片外部碎片

内部碎片的产生:因为所有的内存分配必须起始于可被 4、8 或 16 整除(视处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的内存块分配给客户。假设当某个客户请求一个43字节的内存块时&…

内存碎片是什么?关于内存碎片的解释

内存碎片是什么?关于内存碎片 内存碎片通常分为内部碎片和外部碎片。 内部碎片 所谓内部碎片指的就是,系统为某项功能分派了一定的内存,但是该功能的实现没有用完所有系统分配的。余下的部分就被成为内存碎片的内部碎片。 外部碎片 外部内存…

内存碎片概念

内存碎片是无法被系统利用的内存区域,分为外部碎片和内部碎片。 1 外部碎片 系统有空闲内存区域,空闲内存的总量足够,但应用就是分配不到空间。无法被利用的内存被称为外部碎片。假设当前系统内存布局(空白区域表示空闲内存) 例如&#xf…

内存碎片产生原因及解决方法

文章目录 1、现象描述2、原因分析3、解决方法 1、现象描述 某些应用程序频繁调用 malloc函数申请内存空间,且申请空间的大小差别比较大,使用完成后通过 free函数释放内存空间,但内存空间依然缓存在glibc中,没有归还操作系统&#…

内存碎片:理解、应用场景和防止措施

目录 摘要1. 引言2. 内存碎片的概念3. 内存碎片的产生原因4. 应用场景4.1 应用场景一:长时间运行的服务器4.2 应用场景二:嵌入式系统 5. 预防和处理内存碎片6. 示例代码:生成内存碎片7. 总结 摘要 本文旨在向初学者详细介绍内存碎片的概念、…

内存碎片产生原因及解决办法

来源:知乎 链接:https://www.zhihu.com/question/51836333/answer/145693402 内存碎片通常分为内部碎片和外部碎片: 1. 内部碎片是由于采用固定大小的内存分区,当一个进程不能完全使用分给它的固定内存区域时就产生了内部碎…

POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 与其他的商业数据库在HTAP的异同点(译)...

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

TiDB HTAP

TiDB 数据库 HTAP 概述 HTAP技术 OLAP和OLTP带来了多副本的问题。 HTAP的要求 HTAP的架构 异步复制,不参与投票。 HTAP的特性 行列混合 列存支持基于主键的实时更新TiFlash作为列存副本OLTP和OLAP业务隔离 智能选择(CBO自动或者人工选择)…

如何给一个 HTAP 数据库做基准测试?StoneDB学术分享会第4期

在最新一届国际数据库顶级会议 ACM SIGMOD 2022 上,来自清华大学的李国良和张超两位老师发表了一篇论文:《HTAP Database: What is New and What is Next》,并做了 《HTAP Database:A Tutorial 的专项报告。这几期学术分享会的文章&#xff0…

​网易游戏实时 HTAP 计费风控平台建设

本文整理自网易互娱资深工程师, Flink Contributor, CDC Contributor 林佳,在 FFA 实时风控专场的分享。本篇内容主要分为五个部分: 实时风控业务会话会话关联的 Flink 实现HTAP 风控平台建设提升风控结果数据能效发展历程与展望未来 众所周知&#xff…

黄东旭:开发者的“技术无感化”时代,从 Serverless HTAP 数据库开始 | PingCAP DevCon 2022

12 月 1 日,以"去发现,去挑战"为主题的 PingCAP DevCon 2022 主论坛在线上成功举办,为数万观众带来一场技术盛宴。PingCAP 联合创始人兼 CTO 黄东旭,在大会上分享了“The Future of Database”的主题演讲,分…

快速上手TiDB,体验全新的一栈式实时HTAP数据库

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10年DBA工作经验 一位上进心十足的【大数据领域博主】!😜😜…

CNCC技术论坛|分布式数据库HTAP的探索与实践

本文转载自微信公众号“中国计算机学会” 编者按 12月8-10日,中国计算机协会即将全线上举办CNCC2022,大会覆盖118个计算行业、人工智能、云计算、教育、安全等30个热门专业领域的技术论坛,700余位专家将着力探讨计算技术与未来宏观发展趋势&a…

TiDB:基于 Raft 的 HTAP 数据库

目录 1. 简介 2. 基于 Raft 的 HTAP 3. TiDB 架构 4. Multi-Raft 存储 5. HTAP 引擎 6. 实验 7. 相关工作 8. 结论 摘要 混合事务和分析处理(HTAP)数据库处理事务查询和分析查询时需要隔离,以消除它们之间的干扰。要实现这一点&…

云原生 HTAP -- Cloud-Native Transactions and Analytics in SingleStore

文章目录 背景1 存算分离2. 统一的表存储 (行列混存)2.1 二级索引2.2 行锁 3. 自适应查询引擎3.1 Segment skipping 实现3.2 Filtering 选择 4 性能总结 背景 上篇看了 PolarDB-IMCI 在HTAP的实践,其中提到了其也有借鉴 SingleStore 的实现思…

真正的 HTAP 对用户和开发者意味着什么?

作者 | 杨传辉 OceanBase 关于作者: 杨传辉,OceanBase CTO。2010年作为创始成员之一加入 OceanBase 团队,主导了 OceanBase 历次架构设计和技术研发,从无到有实现 OceanBase 在蚂蚁集团全面落地。同时,他也主导了两次…