Redis核心技术与实战【学习笔记】 - 12.Redis删除数据后,为什么内存占用率还是很高?

前言

在使用 Redis 是,经常会遇到一个问题:明明做了数据删除,数据量不大,但是 使用 top 命令查看时,发现 Redis 还是占用了很多内存。

这是因为,当删除数据后,Redis 释放的内存空间会由内存分配器管理,并不会立即返回操作系统,所以,操作系统操作系统仍然会记录这给 Redis 分配了大量内存。

这往往会伴随一个潜在的风险点: Redis 释放的内存空间可能并不是联系的,那么,这些不连续的内存空间可能处于一种闲置的状态。这会导致一个问题:虽然有空闲时间,Redis 却无法用来保存数据。

所以,本章就聊聊 Redis 的内存空间存储效率问题,为什么数据明明已经删除了,但内存却闲置着没有用,以及相应的解决办法。


1. 内存碎片

通常,内存空间闲置是因为操作系统发生了严重的内存碎片。
那么,什么是内存碎片?

为方便理解,举个高铁的车厢座位的例子。假设一节车厢的座位共有 60 个,现在已经卖了 57 张票,有 3 个朋友要一起乘坐高铁出行,刚好需要三张连载一起的票。但是,在选座位时,发现已经买不到连续的座位了。于是,你们只好换了一趟车。这样一来,这 3 个朋友就要改变出行时间,而且这趟车就空置了三个座位。

其实,这趟车的空座和朋友们的人数是匹配的,只是这些空座位是分散的,如下所示:
在这里插入图片描述
我们把这些分散的空座位叫作“车厢座位碎片”。基于上面的例子,操作系统的内存碎片就很容易理解了。虽然,操作系统的剩余内存空间总量足够,但是应用申请的是一块连续地址空间的 N 字节,但是剩余内存中,没有大小为 N 字节的连续空间了,那么,这些剩余的空间就是内存碎片。

2.Redis的内存碎片是如何形成的?

其实,内存碎片的形成有内因和外因两个层面的原因。

简单来说,内因是操作系统的内存分配机制,外因是 Redis 的负载特征。

2.1 内因:内存分配器的分配策略

内存分配器的分配策略就决定了操作系统无法做到“按需分配”。这是因为,内存分配器一般是按固定大小来分配内存,而不是完全按照应用程序申请的内存空间大小来进行分配。

Redis 可以使用 libc、jemalloc、tcmalloc 多种内存分配器来分配内存,默认使用 jemelloc。下面我们就解释下 jemalloc 的分配策略和问题,其他分配器也存在类似的问题。

jemalloc 的分配策略是按照一系列固定的大小分配内存空间,例如 8 字节、16 字节、32 字节、…、2KB、4KB、8KB 等等。当程序申请的内存最近接某个固定值时,jemalloc 会给它分配相应大小的空间。

这样的分配方式本身是为了减少分配的次数。例如,Redis 申请一个 20 字节的空间报错数据,jemalloc 就会分配 32 字节,此时,如果应用还要写入 10 字节数据,Redis 就不用再向操作系统申请空间了,这就避免了一次分配的操作。

但是,如果 Redis 每次向分配器申请的内存空间大小不一样,这种分配方式就会有形成碎片的风险,而这正好来源于 Redis 的外因了。

2.2 外因:键值对大小不一样和删改操作

Redis 通常作为共有的缓存系统或键值数据库对外提供服务,所以,不同业务应用的数据都可能保存在 Redis 中,这就会带来不同大小的键值对。这样一来,Redis 申请内存空间分配时,本身就会有大小不一的空间需求。这是第一个外因。

上面刚刚讲过,内存分配器只能按固定大小分配内存,所以分配的空间一般都会比申请的空间大,不会完全一致,这本身就会造成一定的内存碎片,降低内存空间存储效率。

比如说,应用 A 保存 6 字节数据,jemalloc 按分配策略会分配 8 字节。如果应用 A 不再保存新数据,那么,这里多出来的 2 字节空间就是内存碎片了。

在这里插入图片描述

第二个外因是,这些键值对会被修改和删除,这会导致空间的扩容和释放。具体来说,一方面,如果修改后的键值对变大或变小了,就需要占用额外的空间或者释放不用的空间。另一方面,删除的键值对就不再需要内存空间了,此时,就会把空间释放出来,形成空闲空间。

在这里插入图片描述

  • 一开始,应用 A、B、C、D 分别保存了 3、1、2、4 字节的数据,并占据了相应的内存空间。
  • 然后,应用 D 删除了 1 字节,这 1 字节的内存空间就空出来了。
  • 紧接着,应用 A 修改了数据,从 3 字节变为 4 字节。为了保持 A 数据空间的连续性,操作系统就把 B 的数据拷贝到别的空间,比如拷贝到 D 刚刚是否的空间中。
  • 此时,应用 C 和 D 也分别删除了 2 字节和 1 字节的数据,整个内存空间上就分别出现了 2 字节和 1 字节的空闲碎片。
  • 如果 E 想要一个 3 字节的连续空间,显然是不能满足的。因为虽然空间总量足够,但是确实碎片空间,并不是连续的。

好了,我们知道了造成内存碎片的内因和外因,其中内存分配器的策略是内因,而 Redis 的负载属于外因,包括了大小不一的键值对和键值对修改删除带来的内存空间变化。

大量的内存碎片会造成 Redis 的内存实际利用率变低,接下来,我们就要来解决这个问题了。不过在解决这个问题之前,还要判断 Redis 在运行过程中是否存在内存碎片。

3.如何判断是否有内存碎片?

为了能让用户监测到实时内存使用情况,Redis 自身提供了 INFO 命令,可以用来查询内存使用的详细信息,命令如下:

127.0.0.1:6379> 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

这里有这么一个参数 mem_fragmentation_ratio 的指标,它表示 Redis 当前的内存碎片率。那么,这个内存碎片率是怎么计算的?

mem_fragmentation_ratio = used_memory_rss / used_memory
  • used_memory_rss:操作系统实际分配给 Redis 的物理内存空间,里面就包含了内存碎片。
  • used_memory:是 Redis 为保持数据实际申请使用的空间地址。

例如,Redis 申请使用了 100 字节(used_memory),操作系统实际分配了 128 字节(used_memory_rss ),此时 mem_fragmentation_ratio 就是 1.28。

知道了这个指标,我们该如何使用?

  • mem_fragmentation_ratio 大于 1 但小于 1.5:这种情况是合理的。这是因为刚才介绍的因素是难以避免的。毕竟,内因的分配器是一定要使用的,分配策略是通用的,不会轻易修改;而外因由 Redis 负载决定,也无法限制。所以,存在内存碎片也是正常的。
  • mem_fragmentation_ratio 大于 1.5:这种表明内存碎片率已经超过了 50%。一般情况下,这个时候,我们就需要采取一些措施来降低内存碎片了。

4.如何清理内存碎片?

Redis 发送内存碎片后,一个“简单粗暴”的方法就是重启 Redis 实例。当然,这并不是一个“优雅”的方法,毕竟,重启 Redis 会带来两个后果:

  • 如果 Redis 中的数据没有持久化,那么数据就会丢失
  • 即使 Reids 持久化了,还需要通过 AOF 或 RDB 进行恢复,恢复时长取决于 AOF 或 RDB 的大小,如果只有一个 Redis 实例,恢复阶段无法提供服务。

幸运的是,从 Redis 4.0.3 版本以后,Redis 自身提供了一种内存碎片自动清理的方法,我们先来看下这个方法的基本原理。

操作系统:碎片清理的基本原理

内存碎片清理,简单来说,就是“搬家让位,合并空间”。比如说,刚刚的高铁车厢选座的例子,你和小家伙不想耽误时间,所以直接买了作为不在一起的三张票。但是,上车后,你和小伙伴通过和别人调换作为,又坐在一起了。

例如,在碎片清理前,这段 10 字节的空间中分别有 1 个 2 字节和 1 个 1 字节的空闲空间,只是这两个空间并不连续。操作系统在清理碎片时,会先把应用 D 的数据拷贝到 2 字节的空闲空间中,并释放 D 原来占用的空间。然后,再把 B 的数据拷贝到 D 原来的空间中。这样一来,这段 10 字节空间的最后三个字节就是一块连续的空间了。到这里,碎片清理结束。
在这里插入图片描述

不过,需要注意,碎片清理是有代价的,操作系统需要把多分数据拷贝到新位置,把原有空间释放出来,这会带来时间开销。因为 Redis 是单线程,在数据拷贝时,Redis 只能等着,这就导致 Redis 无法及时处理请求,性能就会降低。而且,有时候,数据拷贝还需要注意顺序,就像刚刚说的清理内存碎片的例子,操作系统需要先拷贝 D,并释放 D 的空间后,才能拷贝 B。这种对顺序性的要求,会进一步增加 Redis 的等待时间,导致性能下降。

有什么办法可以尽量缓解这个问题吗? 这就要提到,Redis 专门为自动内存碎片清理机制设置的参数了。我们可以通过设置参数,来控制内存碎片清理的开始和结束时机,以及占用的 CPU 比例,从而减少碎片清理对 Redis 本身请求处理的性能影响。

Redis:内存碎片清理

首先,Redis 需要启用自用内存碎片清理,可以把 activedefrag 配置项设置为 yes,命令如下:

127.0.0.1:6379> config set activedefrag yes
OK

这个命令只是启动了自动清理功能,但是具体什么时候清理,会受到下面这两个参数的控制。这两个参数分别设置了触发内存清理的条件,如果同时满足这两个条件,就开始清理。在清理过程中,只要有一个条件不满足了,就停止自动清理。

  • active-defrag-ignore-bytes 100mb:表示内存碎片的字节数达到 100 MB 时,开始清理;
  • active-defrag-threshold-lower 10:表示内存碎片空间占操作系统分配给 Redis 的总空间的比例达到 10% 时,开始清理。
127.0.0.1:6379> config set active-defrag-ignore-bytes 100mb
OK
127.0.0.1:6379> config set active-defrag-threshold-lower 10
OK

为了尽可能减少碎片清理对 Redis 正常请求处理的影响,自动内存碎片清理功能在执行时,还会监控清理操作占用的 CPU 时间,而且还设置了两个参数,分别用于控制清理操作占用的 CPU 时间比例的上、下限,既保证清理工作能正常进行,又避免降低 Redis 性能。这两个参数具体如下:

  • active-defrag-cycle-min 25:表示自动清理过程所用 CPU 的时间比例不低于 25%,保证清理能正常清理。
  • active-defrag-cycle-max 75:表示自动清理过程所用 CPU 的时间比例不高于 75%,一旦超过,就停止清理,从而避免在清理时,大量的内存拷贝阻塞 Redis,导致响应延迟高。
127.0.0.1:6379> config set active-defrag-cycle-min 25
OK
127.0.0.1:6379> config set active-defrag-cycle-max 75
OK

自动内存碎片清理机制在控制碎片清理启停的时机上,既考虑了碎片的空间占比、对 Redis 内存使用效率的影响,还考虑了清理机制本身的 CPU 时间占比、对 Redis 性能的影响。而且,清理机制还提供了 4 个参数,让我们可以根据实际应用中的数据量需求和性能,灵活使用。

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

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

相关文章

《数字化运维路线图》第三部分-数字化运维转型平台 震撼发布!

数字化转型已不再是企业追求效益最大化的手段,而是成为经济发展变革、提升国家数字竞争的核心动力。在此背景下,博睿数据继续发力,隆重推出「数字化运维转型平台」,汇聚了我们对数字化转型的深刻洞见与实践经验,以期为…

༺༽༾ཊ—Unity之-01-工厂方法模式—ཏ༿༼༻

首先创建一个项目, 在这个初始界面我们需要做一些准备工作, 建基础通用文件夹, 创建一个Plane 重置后 缩放100倍 加一个颜色, 任务:使用工厂方法模式 创建 飞船模型, 首先资源商店下载飞船模型&#xff0c…

《区块链简易速速上手小册》第6章:区块链在金融服务领域的应用(2024 最新版)

文章目录 6.1 金融服务中的区块链6.1.1 金融服务中区块链的基础6.1.2 主要案例:跨境支付6.1.3 拓展案例 1:去中心化金融(DeFi)6.1.4 拓展案例 2:代币化资产 6.2 区块链在支付系统中的作用6.2.1 支付系统中区块链的基础…

Linux - iptables 防火墙

一. 安全技术和防火墙 1.安全技术 入侵检测系统(Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报警和事后监督为主,提供有针对性的指导措施和安全…

专业数据治理:数据中台系统塑造企业未来的数字化运营管理新秩序

随着信息化进程的快速推进,数据已然成为企业最为宝贵的资产。对于众多企业而言,如何有效整合、治理以及充分利用这些数据,使之成为推动业务发展的引擎,成为当前难题。数据中台应运而生,它被认为是企业数字化转型的至关…

元素的显示与隐藏,精灵图,字体图标,CSSC三角

元素的显示与隐藏 类似网站广告,当我们点击关闭就不见了,但是我们重新刷新页面,会重新出现 本质:让元素在页面中隐藏或者显示出来。 1.display显示隐藏 2.visibility显示隐藏 3.overflow溢出显示隐藏 1.display属性(…

远EC600E-CN LTE Standard模块硬件设计手册

EC600E-CN是一款LTE-FDD、LTE-TDD无线通信模块,支持LTE-FDD和LTE-TDD数据连接,可为客户在特定场景应用中提供语音功能。 模块封装紧凑,仅为22.9mm21.9mm2.4mm,能满足大部分M2M应用需求,例如自动化领域、智能计量、跟踪…

IP网络对讲系统高清可视寻呼话筒管理中心主机10寸大屏有线呼叫器监狱看守所监狱收费站可视对讲系统

SV-2017P网络可视话筒产品简介 产品特点 专业寻呼主机外形,桌面式设计,采用10.1寸高清IPS屏幕,分辨率1280*720,全虚拟按键加实体按键,外形美观大方;采用工业级4核嵌入式CPU芯片1G内存,保证系统…

arcgis自定义dem高程实现地形抬高 - 操作矢量,转tin、adf(tif),cesiumlab切高程服务

这次记录分享一下arcgis自定义高程全过程 /(ㄒoㄒ)/~~ 我的场景:前端实现地面抬高效果 自定义高程实现地形抬高 一、数据处理 - arcgis操作矢量1、准备工作(可选)2、绘制外围矢量(可选)3、操作矢量数据 二、创建tin - …

VUE PC端可拖动悬浮按钮

一、实现效果&#xff1a; 二、FloatButton.vue <template><div><div class"sssss"><div class"callback float" mousedown"down" touchstart"down" mousemove"move" touchmove"move" mous…

C语言——柔性数组

柔性数组概念&#xff1a; 这个概念你可能没听说过&#xff0c;但是这个概念确实存在&#xff0c;在C99中&#xff0c;结构体中最后一个成员允许是未知大小的数组&#xff0c;这就叫做【柔性数组】成员。 struct S {char c;int i;int arr[0];//未知大小的数组 - 柔性数组成员 }…

Java项目:基于SSM框架实现的西安旅游管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm811基于SSM框架实现的西安旅游管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&am…

Portainer访问远程Docker (TLS加密)

前言&#xff1a; docker的2375端口&#xff0c;出于安全性考虑即(Docker Remote API未授权访问漏洞)&#xff0c;是不开放的&#xff0c;如果想要管理远程docker&#xff0c;可以使用TLS机制来进行访问&#xff0c;这里以Portainer访问连接为例 文章参考&#xff1a;https://b…

单机搭建hadoop环境(包括hdfs、yarn、hive)

单机可以搭建伪分布式hadoop环境&#xff0c;用来测试和开发使用&#xff0c;hadoop包括&#xff1a; hdfs服务器 yarn服务器&#xff0c;yarn的前提是hdfs服务器&#xff0c; 在前面两个的基础上&#xff0c;课可以搭建hive服务器&#xff0c;不过hive不属于hadoop的必须部…

MacBook安装软件时允许任何来源的软件

MacBook安装软件时允许任何来源的软件 临时设置允许未知来源的app 当下载网上的软件并安装时,会安装失败, 因为MacOS默认只允许安装App Store上的软件 这时可以临时允许安装,如下设置 开启设置—->安全性与隐私—->未知来源的app 这种方式比较安全 设置允许任何来源…

计算机毕业设计 | SpringBoot 房屋租赁网 房屋租赁平台(附源码)

1&#xff0c;绪论 1.1 背景调研 在房地产行业持续火热的当今环境下&#xff0c;房地产行业和互联网行业协同发展&#xff0c;互相促进融合已经成为一种趋势和潮流。本项目实现了在线房产平台的功能&#xff0c;多种技术的灵活运用使得项目具备很好的用户体验感。 这个项目的…

2024年美国大学生数学建模比赛MCM问题A:资源可用性和性别比例-思路解析与代码解答

2024 MCM Problem A: Resource Availability and Sex Ratios 一、题目翻译 背景 虽然一些动物物种存在于通常的雄性或雌性性别之外&#xff0c;但大多数物种实质上是雄性或雌性。虽然许多物种在出生时的性别比例为1&#xff1a;1&#xff0c;但其他物种的性别比例并不均匀。…

【A题完整论文】2024美赛完整论文+代码参考(无偿分享)

A题&#xff1a;资源可用性和性别比例 一、问题分析 1.1 问题一分析 针对该问题&#xff0c;若七鳃鮼的性别比例受到外部环境因素的影响&#xff0c;那么这可能会导致种群大小和结构的变化。如果雌性在某些环境条件下更为优势&#xff0c;种群的增加可能对其他物种的竞争和资源…

闲聊电脑(4)硬盘分区

夜深人静&#xff0c;万籁俱寂&#xff0c;老郭趴在电脑桌上打盹&#xff0c;桌子上的小黄鸭和桌子旁的冰箱又开始窃窃私语…… 小黄鸭&#xff1a;冰箱大哥&#xff0c;上次你说的那个“分区”和“格式化”是什么意思&#xff1f; 冰箱&#xff1a;分区么&#xff0c;就是分…

数学建模 - 线性规划入门:Gurobi + python

在工程管理、经济管理、科学研究、军事作战训练及日常生产生活等众多领域中&#xff0c;人们常常会遇到各种优化问题。例如&#xff0c;在生产经营中&#xff0c;我们总是希望制定最优的生产计划&#xff0c;充分利用已有的人力、物力资源&#xff0c;获得最大的经济效益&#…