Redis 的数据被删除,内存占用还这么大?

099cfcd08d1698565f0d918e84ece64e.gif

作者 | 码哥

来源 | 码哥字节

操作系统分配给 Redis 的内存有 6GB,通过指标 used_memory_human 发现存储数据只使用了 4GB,为何会这样?为何无法保存数据?

通过 CONFIG SET maxmemory 100mb或者在 redis.conf 配置文件设置 maxmemory 100mb Redis 内存占用限制。当达到内存最大值,会触发内存淘汰策略删除数据。

除此之外,当 key 达到过期时间,Redis 会有以下两种删除过期数据的策略:

  • 后台定时任务选取部分数据删除;

  • 惰性删除。

具体原理请移步《Redis 的过期数据删除那些事》。

假设 Redis 实例保存了 5GB 的数据,现在删除了 2GB 数据,Redis 进程占用的内存一定会降低么?(也叫做 RSS,进程消耗内存页数)。

答案是:可能依然占用了大约 5GB 的内存,即使 Redis 的数据只占用了 3GB 左右。

大家一定要设置maxmemory,否则 Redis 会继续为新写入的数据分配内存,无法分配就会导致应用程序报错,当然不会导致宕机。


d64c5ee95c1238bd3dd92724ca0359ec.png

释放的内存去哪了

明明删除了数据,使用 top 命令查看,为何还是占用了那么多内存?

内存都去哪了?使用 info memory 命令获取 Redis 内存相关指标,我列举了几个重要的数据:

127.0.0.1:6379> info memory
# Memory
used_memory:1132832  // Redis 存储数据占用的内存量
used_memory_human:1.08M  // 人类可读形式返回内存总量
used_memory_rss:2977792  // 操作系统角度,进程占用的物理总内存
used_memory_rss_human:2.84M // used_memory_rss 可读性模式展示
used_memory_peak:1183808 // 内存使用的最大值,表示 used_memory 的峰值used_memory_peak_human:1.13M  // 以可读的格式返回 used_memory_peak的值
used_memory_lua:37888   // Lua 引擎所消耗的内存大小。
used_memory_lua_human:37.00K
maxmemory:2147483648    // 能使用的最大内存值,字节为单位。
maxmemory_human:2.00G  // 可读形式
maxmemory_policy:noeviction // 内存淘汰策略// used_memory_rss / used_memory 的比值,代表内存碎片率
mem_fragmentation_ratio:2.79

Redis 进程内存消耗主要由以下部分组成:

  • Redis 自身启动所占用的内存;

  • 存储对象数据内存;

  • 缓冲区内存:主要由 client-output-buffer-limit 客户端输出缓冲区、复制积压缓冲区、AOF 缓冲区。

  • 内存碎片。

65f51f7ac6d6688cbeebb31bdb69029b.png

内存占用

Redis 自身空进程占用的内存很小可以忽略不计,对象内存是占比最大的一块,里面存储着所有的数据。

缓冲区内存在大流量场景容易失控,造成 Redis 内存不稳定,需要重点关注。

内存碎片过大会导致明明有空间可用,但是却无法存储数据。

碎片 = used_memory_rss 实际使用的物理内存(RSS 值)除以 used_memory 实际存储数据内存。

5b725a9f1edee8385981a6b1d210df5f.png

什么是内存碎片

内存碎片会造成明明有内存空间空闲,可是却无法存储数据。举个例子,你跟漂亮小姐姐去电影院看电影,肯定想连在一块。

假设现在有 8 个座位,已经卖出了 4 张票,还有 4 张可以买。可是好巧不巧,买票的人很奇葩,分别间隔一个座位买票。

即使还有 4 个座位空闲,可是你却买不到两个座位连在一块的票,厚礼蟹!

596df038d331647717136ddc2776d228.png

内存碎片


ac8417f0543b4eaf8177ef8b9b90249e.png

内存碎片形成原因

内存碎片是什么原因导致呢?

主要有两个原因:

  • 内存分配器的分配策略。

  • 键值对的大小不一样和删改操作:Redis 频繁做更新操作、大量过期数据删除,释放的空间(不够连续)无法得到复用,导致碎片率上升。

接下来我分别探讨实际发生的原因……


a5408fa2eb9be0636f2fd380aeb4381c.png

内存分配器的分配策略

Redis 默认的内存分配器采用 jemalloc,可选的分配器还有:glibc、tcmalloc。

内存分配器并不能做到按需分配,而是采用固定范围的内存块进行分配。

例如 8 字节、16 字节…..,2 KB,4KB,当申请内存最近接某个固定值的时候,jemalloc 会给它分配最接近固定值大小的空间。

这样就会出现内存碎片,比如程序只需要 1.5 KB,内存分配器会分配 2KB 空间,那么这 0.5KB 就是碎片。

这么做的目的是减少内存分配次数,比如申请 22 字节的空间保存数据,jemalloc 就会分配 32 字节,如果后边还要写入 10 字节,就不需要再向操作系统申请空间了,可以使用之前申请的 32 字节。

删除 key 的时候,Redis 并不会立马把内存归还给操作系统,出现这个情况是因为底层内存分配器管理导致,比如大多数已经删除的 key 依然与其他有效的 key 分配在同一个内存页中。

另外,分配器为了复用空闲的内存块,原有 5GB 的数据中删除了 2 GB 后,当再次添加数据到实例中,Redis 的 RSS 会保持稳定,不会增长太多。

因为内存分配器基本上复用了之前删除释放出来的 2GB 内存。

9a0e84f8c3cd9f94fc049f75446e9dfe.png

键值对大小不一样和删改操作

由于内存分配器是按照固定大小分配内存,所以通常分配的内存空间比实际数据占用的大小多一些,会造成碎片,降低内存的存储效率。

另外,键值对的频繁修改和删除,导致内存空间的扩容和释放,比如原本占用 32 字节的字符串,现在修改为占用 20 字节的字符串,那么释放出的 12 字节就是空闲空间。

如果下一个数据存储请求需要申请 13 字节的字符串,那么刚刚释放的 12 字节空间无法使用,导致碎片。

碎片最大的问题:空间总量足够大,但是这些内存不是连续的,可能大致无法存储数据。

7dee5cbb1b99f2f2d89ad4375033cb85.png

内存碎片解决之道

那该如何解决呢?

首先要确定是否发生了内存碎片,重点关注前面 INFO memory 命令提示的 mem_fragmentation_ratio 指标,表示内存碎片率:

mem_fragmentation_ratio = used_memory_rss/ used_memory

如果 1 < 碎片率 < 1.5,可以认为是合理的,而大于 1.5 说明碎片已经超过 50%,我们需要采取一些手段解决碎片率过大的问题。

645294bd9b3acba51d08ca6e3f00252a.png

重启大法

最简单粗暴的方式就是重启,如果没有开启持久化,数据会丢失。

开启持久化的话,需要使用 RDB 或者 AOF 恢复数据,如果只有一个实例,数据大的话会导致恢复阶段长时间无法提供服务,高可用大打折扣。

咋办呢?码哥靓仔?

9626c22e3f4aa247719329d20c5d8bfe.png

自动清理内存碎片

既然你都叫我靓仔了,就倾囊相助告诉你终极杀招:Redis 4.0 版本后,自身提供了一种内存碎片清理机制。

怎么清理呢?

很简单,还是上面的例子,想要买两张连在一块的电影票。与与别人沟通调换下位置,就实现了。

对于 Redis 来说,当一块连续的内存空间被划分为好几块不连续的空间的时候,操作系统先把数据以依次挪动拼接在一块,并释放原来数据占据的空间,形成一块连续空闲内存空间。。

如下图所示:

21926f5e156ca15231611b5bc6dbd338.png

碎片清理


db98d0e4162048b9d50e3993086372bd.png

自动清理内存碎片的代价

自动清理虽好,可不要肆意妄为,操作系统把数据移动到新位置,再把原有空间释放是需要消耗资源的。

Redis 操作数据的指令是单线程,所以在数据复制移动的时候,只能等待清理碎片完成才能处理请求,造成性能损耗。

如何避免清理碎片对性能的影响又能实现自动清理呢?

好问题,通过以下两个参数来控制内存碎片清理和结束时机,避免占用 CPU 过多,减少清理碎片对 Redis 处理请求的性能影响。

开启自动内存碎片清理

CONFIG SET activedefrag yes

这只是开启自动清理,何时清理要同时满足以下两个条件才会触发清理操作。

清理的条件

active-defrag-ignore-bytes 200mb:内存碎片占用的内存达到 200MB,开始清理;

active-defrag-threshold-lower 20:内存碎片的空间占比超过系统分配给 Redis 空间的 20% ,开始清理。

避免对性能造成影响

清理时间有了,还需要控制清理对性能的影响。由一项两个设置先分配清理碎片占用的 CPU 资源,保证既能正常清理碎片,又能避免对 Redis 处理请求的性能影响。

active-defrag-cycle-min 20:自动清理过程中,占用 CPU 时间的比例不低于 20%,从而保证能正常展开清理任务。

active-defrag-cycle-max 50:自动清理过程占用的 CPU 时间比例不能高于 50%,超过的话就立刻停止清理,避免对 Redis 的阻塞,造成高延迟。

112f6d880a5049f60107db35a56a21e0.png

总结

如果你发现明明 Redis 存储数据的内存占用远小于操作系统分配给 Redis 的内存,而又无法保存数据,那可能出现大量内存碎片了。

通过 info memory 命令,看下内存碎片mem_fragmentation_ratio 指标是否正常。

那么我们就开启自动清理并合理设置清理时机和 CPU 资源占用,该机制涉及到内存拷贝,会对 Redis 性能造成潜在风险。

如果遇到 Redis 性能变慢,排查下是否由于清理碎片导致,如果是,那就调小 active-defrag-cycle-max 的值。

参考

[1].Redis 核心技术与实战

[2].https://juejin.cn/post/6844903967298682893#heading-4

[3].https://redis.io/docs/reference/optimization/memory-optimization/#memory-allocation

597cc6498afe27a1eebec0348573a030.gif

往期推荐

手机+卫星,到底有多难?

突发!GitHub 将关闭 Trending 热榜,开发者不答应

5G+元宇宙创新应用来了,第五届“绽放杯”5G 应用征集大赛云 XR 专题赛落下帷幕

2022 互联网中秋月饼大赏,腾讯送火腿,字节寓意圆满,你最钟爱哪款呢?

aa203c32fc59ff46c101d50f1c0f7b50.gif

点分享

19131d61e81a6248678b6fb5744a924b.gif

点收藏

ed179344dbceaa81002343b686029e04.gif

点点赞

e70f83d342eaba8c5db6c4b745965083.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云架构师解读四大主流游戏架构

简介&#xff1a;游戏行业是阿里云最早聚焦的行业之一&#xff0c;近年来游戏行业的变化、云计算产品技术的变化都与日俱进。随着行业业务的变化、技术架构的演进以及阿里云产品的迭代演进&#xff0c;整体的产品技术选型在不同的游戏场景、业务场景也不尽相同。本文将聚焦阿里…

国内唯一连续入选Gartner,Quick BI是如何做到的?

简介&#xff1a;阿里云Quick BI凭借灵活的公共云部署&#xff0c;私有化独立部署能力、无缝对接各类云上数据库和自建数据库、可视化搭建分析、高效数据处理能力与强大数据计算能力&#xff0c;使得在2022年持续入选Gartner ABI魔力象限报告。 作者 | 馨心 来源 | 阿里开发者公…

龙蜥开源Plugsched:首次实现 Linux kernel 调度器热升级 | 龙蜥技术

简介&#xff1a;对于plugsched而言&#xff0c;无论是 bugfix&#xff0c;还是性能优化&#xff0c;甚至是特性的增、删、改&#xff0c;都可胜任。 文/龙蜥社区内核开发人员 陈善佩、吴一昊、邓二伟 Plugsched 是 Linux 内核调度器子系统热升级的 SDK&#xff0c;它可以实现…

出家12年,北大数学天才柳智宇下山还俗:从事心理咨询,主动要求降薪至2万...

整理 | 于轩 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;提到北大数学天才&#xff0c;大家脑海中首先浮现的或许是有“北大扫地僧”之称的韦东奕。虽有“扫地僧”的称呼&#xff0c;但韦东奕并不是一位真正的僧人&#xff0c;相反&#xff0c;他的师兄&am…

启明创投合伙人叶冠泰:我对云原生投资趋势的思考 | 云原生加速器观点

简介&#xff1a;投资就是一种相信&#xff0c;要相信这个产业&#xff0c;这位企业家&#xff0c;通过我们的相信去传递给下一轮合作的投资人。“相信相信的力量”&#xff0c;我相信软件的未来&#xff0c;也相信软件在中国发展的力量。 作者 | 叶冠泰 3 月 3 日 - 4 日&am…

天翼云打造国云安全品牌 铸牢企业云上安全防线

9月7日&#xff0c;2022年国家网络安全宣传周在安徽省合肥市举办。活动期间&#xff0c;中国电信天翼云举办了云原生安全产品“红盾”系列介绍会&#xff0c;会议以“红云天翼 安全普惠”为主题&#xff0c;详细介绍了“红盾”系列产品的主要功能及优势等。 数字经济时代&…

让微服务开源更普惠,阿里云微服务引擎MSE全球开服

简介&#xff1a;MSE 于2020年10月在国内开启商业化服务&#xff0c;目前已吸引近万客户使用&#xff0c;用于在云上更低成本构建、更稳定运行微服务架构。此次&#xff0c;MSE 向阿里云国际站开放服务&#xff0c;旨在帮助更多客户享受到更加普惠的微服务技术。 随着微服务技…

Dubbo-go-Mesh 开启新一代 Go 微服务形态

简介&#xff1a;Proxyless Service Mesh 能力将跟随 Dubbo-go 下一版本发布&#xff0c;稳定的性能需要社区成员们共同的关注与建设。在此基础之上&#xff0c;我们还会进一步探索轻量级 sdk sidecar的模型&#xff1b;探索基于第三方流量治理组件的金丝雀发布能力&#xff1…

2022数据安全技术大会举办

9月6日&#xff0c;2022数据安全技术大会暨中国信息协会信息安全专业委员会年会在北京举行。本届大会由中国信息协会信息安全专业委员会主办、中国信息协会信息安全专业委员会数据安全技术工作部和天空卫士联合承办&#xff0c;逾3000家企业线上参与。 国家信息中心副主任周民…

css默认样式以及解决办法

display:inline-block元素之间存在缝隙如何解决&#xff1f; 父级添加font-size&#xff1a;0; 解决前 解决后 vertical-align是干嘛的&#xff1f; 属性设置元素的垂直对齐方式 场景&#xff1a;垂直对齐一幅图像 属性&#xff1a; baseline 默认。元素放置在父元素的基线…

如何发起 MQTT 亿级连接和千万消息吞吐性能测试

简介&#xff1a;MQTT 协议凭借简单易实现、支持 QoS、报文小等特点&#xff0c;占据了物联网协议的半壁江山。 作者&#xff1a;亦炎 随着 5G 时代的来临&#xff0c;万物互联的伟大构想正在成为现实。联网的物联网设备 在 2021 年已经达到了 120 亿&#xff0c;在未来两年&…

阿里云云原生应用平台总经理丁宇:“连接、合作、赋能”,携手加速器伙伴助力企业云上创新

简介&#xff1a;阿里巴巴研究员、阿里云智能云原生应用平台总经理丁宇表示&#xff0c;如果用三个词来形容我们希望达到的效果&#xff0c;就是连接、合作、赋能。 云原生加速器路演导师评委 进入数智化时代&#xff0c;云上创新是企业加速数字化转型、提升竞争力的必经之路。…

聚焦业务价值:分众传媒在 Serverless 上的探索和实践

简介&#xff1a;随着业务规模的增长&#xff0c;业务方对后台服务的弹性诉求越来越强怎么办&#xff1f;云原生峰会前线最佳落地实践心得分享&#xff1a;看分众传媒如何借助 Serverless 函数计算提升 80% 开发运维效率&#xff0c;有效降低计算成本~ 作者 | 吴松&#xff08;…

当Unity实时3D引擎遇上AI虚实交互,Unity要成为元宇宙时代的新引擎

游戏引擎巨头Unity&#xff0c;还在为蔚来、小鹏、理想等14家车厂提供智能座舱等解决方案&#xff0c;以及为香港机场、北京城建、海尔卡奥斯提供数字孪生方案。实时3D引擎&#xff0c;也将是元宇宙时代的核心支撑。 编辑 | 宋慧 出品 | CSDN AI 领域的年度盛会——2022世界人…

告警运维中心|构建高效精准的告警协同处理体系

简介&#xff1a;基于报告&#xff0c;ARMS 能快速的整合上下文&#xff0c;包括 Prometheus 监控进行监控。还有前端监控的相关数据&#xff0c;都会整合到报告里面&#xff0c;进行全方位检测来收敛相关问题。 作者&#xff1a;延福 在开始正式内容前&#xff0c;我想跟大家…

数字人技术在直播场景下的应用

作者 | 薄志浩本文介绍了在数字人AI技术发展迅猛&#xff0c;整体AI数字人市场呈现高速增长的趋势下&#xff0c;与强调高实时性互动的直播业务场景的结合与应用&#xff0c;通过数字人渲染技术、强大的AI全栈能力、算力为虚拟主播赋能&#xff0c;在面部表情、肢体动作、问答对…

如何帮助业务丝滑配置?阿里巴巴用了 11 年的“功能开关” 是什么?

简介&#xff1a;AHAS 功能开关是一个轻量级的动态配置框架&#xff0c;通过功能开关可以动态管理代码中的配置项&#xff0c;根据需求为某个应用开启或关闭部分功能&#xff0c;或设置某个性能指标的阈值。功能开关通常用于设置黑白名单、运行时动态调整日志级别、降级业务功能…

摆脱 AI 生产“小作坊”:如何基于 Kubernetes 构建云原生 AI 平台

简介&#xff1a;本文将介绍和梳理我们对云原生 AI 这个新领域的思考和定位&#xff0c;介绍云原生 AI 套件产品的核心场景、架构和主要能力。 作者&#xff1a;张凯 前言 云原生&#xff08;Cloud Native&#xff09;[1]是云计算领域过去 5 年发展最快、关注度最高的方向之一…

Node 之父斥责 Oracle:你们也不用,那请交出 JavaScript 商标!

整理 | 苏宓出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;也许 13 年前&#xff0c;Oracle 以 74 亿美元收购 Sun Microsystems 公司时&#xff0c;也不会想到自己后续要牵扯到诸多的版权诉讼与投诉的漩涡之中。众所周知&#xff0c;Oracle 在收购 Sun 之后&…

OPLG:新一代云原生可观测最佳实践

简介&#xff1a;OPLG 体系拥有成熟且富有活力的开源社区生态&#xff0c;同时也经过了大量企业生产环境的实践检验&#xff0c;是当下建设新一代云原生统一可观测平台的热门选择。但是&#xff0c;OPLG 只是提供了一个技术体系&#xff0c;如何灵活运用&#xff0c;解决实际问…