Redis 内存是如何划分的?

查询内存命令

info memory

查询Redis自身使用内存的统计数据。通过这个命令,可以了解 Redis 实例的内存分配情况、内存碎片、键空间使用情况等

  1. 内存分配情况:

    • used_memory:Redis 实例当前使用的内存总量(以字节为单位)。

    • used_memory_human:以人类可读格式显示的内存使用量。

    • used_memory_rss:Redis 占用的物理内存总量(包括操作系统使用的内存)。

    • used_memory_peak:Redis 实例历史上使用的最大内存总量。

    • used_memory_peak_human:以人类可读格式显示的历史内存使用的最大值。

  2. 内存碎片情况:

    • mem_fragmentation_ratio:内存碎片比率,表示内存碎片与已分配内存的比率。

    • mem_allocator:Redis 使用的内存分配器。

  3. 键空间相关信息:

    • keyspace_hits:成功查找键的次数。

    • keyspace_misses:未能查找键的次数。

    • expired_keys:过期的键的数量。

    • evicted_keys:因为内存满而被驱逐的键的数量。

  4. 持久化相关信息:

    • rdb_changes_since_last_save:上次 RDB 快照以来的更改数量。

    • rdb_last_save_time:上次成功创建 RDB 快照的时间戳。

    • rdb_last_bgsave_time_sec:最近一次创建 RDB 快照所花费的秒数。

  5. 客户端和对象相关信息:

    • connected_clients:当前连接到服务器的客户端数量。

    • client_longest_output_list:客户端输出缓冲区中最长的等待时间(以字节为单位)。

需要重点关注的指标有: used_memory_rssused_memory以及它们的比值mem_fragmentation_ratio

  • mem_fragmentation_ratio>1时, 说明used_memory_rss-used_memory多出的部分内存并没有用于数据存储, 而是被内存碎片所消耗, 如果两者相差很大, 说明碎片率严重。
  • mem_fragmentation_ratio<1时, 这种情况一般出现在操作系统把Redis内存交换(Swap) 到硬盘导致, 出现这种情况时要格外关注, 由于硬盘速度远远慢于内存, Redis性能会变得很差, 甚至僵死。

内存划分

Redis进程内消耗主要包括: 自身内存+对象内存+缓冲内存+内存碎片

对象内存

对象内存是Redis内存占用最大的一块, 存储着用户所有的数据。 Redis 所有的数据都采用key-value数据类型, 每次创建键值对时, 至少创建两个类型对象: key对象和value对象。 对象内存消耗可以简单理解为sizeof(keys)+sizeof(values) 。 键对象都是字符串, 在使用Redis时很容易忽略键对内存消耗的影响, 应当避免使用过长的键。

缓冲内存

缓冲内存主要包括: 客户端缓冲、 复制积压缓冲区、 AOF缓冲区。客户端缓冲指的是所有接入到Redis服务器TCP连接的输入输出缓冲。输入缓冲无法控制, 最大空间为1G, 如果超过将断开连接。 输出缓冲通过参数client-output-buffer-limit控制 。

客户端缓冲
普通客户端

除了复制和订阅的客户端之外的所有连接, Redis的默认配置是: client-output-buffer-limit normal000

Redis并没有对普通客户端的输出缓冲区做限制, 一般普通客户端的内存消耗可以忽略不计, 但是当有大量慢连接客户端接入时这部分内存消耗就不能忽略了, 可以设置maxclients做限制

从客户端

主节点会为每个从节点单独建立一条连接用于命令复制,默认配置是: client-output-buffer-limit slave256mb64mb60。 当主从节点之间网络延迟较高或主节点挂载大量从节点时这部分内存消耗将占用很大一部分, 建议主节点挂载的从节点不要多于2个

订阅客户端

当使用发布订阅功能时, 连接客户端使用单独的输出缓冲区, 默认配置为: client-output-buffer-limit pubsub32mb8mb60, 当订阅服务的消息生产快于消费速度时, 输出缓冲区会产生积压造成输出缓冲区空间溢出。

复制积压缓冲区

Redis在2.8版本之后提供了一个可重用的固定大小缓冲区用于实现部分复制功能, 根据repl-backlog-size参数控制, 默认1MB。 对于复制积压缓冲区整个主节点只有一个, 所有的从节点共享此缓冲区, 因此可以设置较大的缓冲区空间, 如100MB, 这部分内存投入是有价值的, 可以有效避免全量复制, 更多细节见第6.4节。

AOF缓冲区

这部分空间用于在Redis重写期间保存最近的写入命令,具体细节见5.2节。 AOF缓冲区空间消耗用户无法控制, 消耗的内存取决于AOF重写时间和写入命令量,这部分空间占用通常很小。

碎片

Redis默认的内存分配器采用jemalloc, 可选的分配器还有: glibc、tcmalloc。 内存分配器为了更好地管理和重复利用内存, 分配内存策略一般采用固定范围的内存块进行分配。 例如jemalloc在64位系统中将内存空间划分为: 小、 大、 巨大三个范围。 每个范围内又划分为多个小的内存块单位, 如下所示:

  • 小: [8byte], [16byte, 32byte, 48byte, ..., 128byte], [192byte,428256byte, ..., 512byte], [768byte, 1024byte, ..., 3840byte]

  • 大: [4KB, 8KB, 12KB, ..., 4072KB]

  • 巨大: [4MB, 8MB, 12MB, ...]

比如当保存5KB对象时jemalloc可能会采用8KB的块存储, 而剩下的3KB空间变为了内存碎片不能再分配给其他对象存储。 内存碎片问题虽然是所有内存服务的通病, 但是jemalloc针对碎片化问题专门做了优化, 一般不会存在过度碎片化的问题, 正常的碎片率( mem_fragmentation_ratio) 在1.03左右。 但是当存储的数据长短差异较大时, 以下场景容易出现高内存碎片问题:

  • 频繁做更新操作, 例如频繁对已存在的键执行append、 setrange等更新操作。

  • 大量过期键删除, 键对象过期删除后, 释放的空间无法得到充分利用, 导致碎片率上升。

出现高内存碎片问题时常见的解决方式如下:

  • 数据对齐: 在条件允许的情况下尽量做数据对齐, 比如数据尽量采用数字类型或者固定长度字符串等, 但是这要视具体的业务而定, 有些场景无法做到。

  • 安全重启: 重启节点可以做到内存碎片重新整理, 因此可以利用高可用架构, 如Sentinel或Cluster, 将碎片率过高的主节点转换为从节点, 进行安全重启。

子进程内存消耗

子进程内存消耗主要指执行AOF/RDB重写时Redis创建的子进程内存消耗。 Redis执行fork操作产生的子进程内存占用量对外表现为与父进程相同,理论上需要一倍的物理内存来完成重写操作。 但Linux具有写时复制技术(copy-on-write) , 父子进程会共享相同的物理内存页, 当父进程处理写请求时会对需要修改的页复制出一份副本完成写操作, 而子进程依然读取fork时整个父进程的内存快照。

  • Redis产生的子进程并不需要消耗1倍的父进程内存, 实际消耗根据期间写入命令量决定, 但是依然要预留出一些内存防止溢出。

  • 需要设置sysctl vm.overcommit_memory=1允许内核可以分配所有的物理内存, 防止Redis进程执行fork时因系统剩余内存不足而失败。

  • 排查当前系统是否支持并开启THP, 如果开启建议关闭, 防止copy-onwrite期间内存过度消耗。

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

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

相关文章

LeetCode 面试经典150题 45.跳跃游戏II

题目&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到…

【初学者】Visual Studio 2019没有 C 项目,只有C++怎么办? 怎么创建第一个项目教程。

起因&#xff1a; 想要在 Visual Studio 上创建一个 C 项目&#xff0c;发现只有 C 的。 解决&#xff1a; C 是 C 的超集。只要创建 C 的项目就行了&#xff0c;将新增的 .cpp 文件改后缀为 .c 即可。不会有问题的。 C 的语法更加严格&#xff0c;而 C 的项目更宽松。虽然…

【云呐】固定资产管理系统的功能有哪些?管理工具

为了提高经营效率&#xff0c;降低企业成本&#xff0c;许多企业选择固定资产管理系统。那么&#xff0c;固定资产管理系统有什么作用呢&#xff1f; 资产登记&#xff1a;  固定资产管理系统可以方便地登记公司的固定资产&#xff0c;包括资产名称、规格型号、购买日期、使…

3dmax渲染卡光子、灯光缓存的处理方法

1、在vray全局开关勾选最大射线强度 2、将场景材质转换为vray类型 3、关闭置换 4、清理空物体等场景垃圾 可以试一下优化场景的工具&#xff0c;清理空物体、空代理、适当塌陷精简场景、清理场景垃圾等 有3dmax效果图渲染需求可以使用渲染100&#xff08;注册填邀请码‘7788…

微信小程序简单实现手势左右滑动和点击滑动步骤条功能

使用微信小程序实现左右滑动功能&#xff0c;自定义顶部图案&#xff0c;点击文字滑动和手势触屏滑动&#xff0c;功能简单&#xff0c;具体实现代码如下所示&#xff1a; 1、wxss代码&#xff1a; /* 步骤条 */ .tab-box {display: flex;flex-direction: row;position: fix…

Netty服务器结合WebSocke协议监听和接收数据

目录 1.pom依赖2.配置属性3.创建netty服务器4.建立监听和响应5.创建启动器6.前端static下页面7.前端js8.注意异常问题9.创建netty服务器--使用守护线程 1.pom依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId>&l…

Spring集成hazelcast实现分布式缓存

1.Hazelcast介绍 Hazelcast是Hazelcast公司开源的一款分布式内存数据库产品&#xff0c;提供弹性可扩展、高性能的分布式内存计算。并通过提供诸如Map&#xff0c;Queue&#xff0c;ExecutorService&#xff0c;Lock和JCache等Java的许多开发人员友好的分布式实现。 Hazelcast优…

DM数据库(docker)

docker安装 安装必要的系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 配置阿里云Docker Yum源: yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 更新yum缓存 yum makecache fast 安装docker-CE: y…

微机二次消谐装置是怎样运行的

微机二次消谐装置是怎样运行的&#xff1f;微机二次消谐装置是一种用于电力系统中的无功补偿和谐波控制的装置&#xff0c;它采用先进的数字信号处理技术和微机控制技术&#xff0c;能够实现对电力系统中的无功功率和谐波进行快速有效的控制和补偿&#xff0c;以保证电力系统的…

Kotlin入门基础知识

前言 实践是最好的学习方式&#xff0c;技术也如此。 文章目录 前言1、安装 Java 和 Kotlin 环境2、程序基本结构3、数据类型1&#xff09;基本数据类型2&#xff09;布尔类型3&#xff09;字符类型4&#xff09;字符串类型 1、安装 Java 和 Kotlin 环境 2、程序基本结构 fun…

【JavaScript】变量的解构赋值

变量的解构赋值用途很多。 &#xff08;1&#xff09;交换变量的值 let x 1; let y 2;[x, y] [y, x];上面代码交换变量x和y的值&#xff0c;这样的写法不仅简洁&#xff0c;而且易读&#xff0c;语义非常清晰。 &#xff08;2&#xff09;从函数返回多个值 函数只能返回…

Issue 2046:Missing array size check in NewFixedArray

文章目录 环境搭建漏洞分析漏洞触发 漏洞利用总结参考 环境搭建 sudo apt install pythongit reset --hard 64cadfcf4a56c0b3b9d3b5cc00905483850d6559 export DEPOT_TOOLS_UPDATE0 gclient sync -D// debug version tools/dev/v8gen.py x64.debug ninja -C out.gn/x64.debug/…

备战蓝桥杯Day29 - 贪心-活动选择问题

问题描述 假设有n个活动&#xff0c;这些活动要占用同一片场地&#xff0c;而场地在某时刻只能供一个活动使用。 每个活动都有一个开始时间 si 和结束时间 fi (题目中时间以整数表示) ,表示活动在[si, f)区间占用场地。 问:安排哪些活动能够使该场地举办的活动的个数最多? 解…

FDA: 用于语义分割的傅里叶域自适应

论文链接&#xff1a;https://arxiv.org/abs/2004.05498 代码链接&#xff1a;GitHub - YanchaoYang/FDA: Fourier Domain Adaptation for Semantic Segmentation 机构&#xff1a;UCLA 发表于2020CVPR 这篇文章别的地方略读了&#xff0c;主要看看方法&#xff0c;感兴趣自…

【C语言】命令行参数;终止程序

终端命令行参数 On many systems, it is possible to pass arguments to main from a command line by including parameters int argc and char argv[] in the parameter list of main. Parameter argc receives the number of command-line arguments. Parameter argv is an …

如何理解“高频信息/高级语义”和“低频信息/低级语义”?

如何区分高频信息和低频信息&#xff1f; 如果一个东西是高度离散化和语义化的&#xff0c;一个字的差异也可能导致词语之间的含义发生重大变化&#xff0c;就是高频东西。例如一句话&#xff0c;如果你改变了一个单词&#xff0c;这个句子就会变成其他的意思。还有就是经过en…

部署高斯喷射项目gaussian-splatting

硬件要求 支持 CUDA 的 GPU&#xff0c;具有 7.0 的计算能力24 GB VRAM 软件要求 Conda用于 PyTorch 扩展的 C 编译器&#xff08;Visual Studio 2019&#xff09; CUDA SDK 11 for PyTorch 扩展&#xff0c;在 Visual Studio 之后安装C 编译器和 CUDA SDK 必须兼容 拉取源码 …

Poly Kernel Inception Network在遥感检测中的应用

摘要 https://export.arxiv.org/pdf/2403.06258 遥感图像&#xff08;RSI&#xff09;中的目标检测经常面临一些日益严重的挑战&#xff0c;包括目标尺度的巨大变化和多样的上下文环境。先前的方法试图通过扩大骨干网络的空间感受野来解决这些挑战&#xff0c;要么通过大核卷积…

.Net使用ElasticSearch

文章目录 前言主体内容一.Kibana中ElasticSearch的基础操作1.GET&#xff08;查询&#xff09;1.POST&#xff08;新增&#xff09;1.PUT&#xff08;修改&#xff09;1.DELET&#xff08;删除&#xff09; 二.在.Net中&#xff0c;对ElasticSearch进行基础操作1.DotNet连接Ela…

低代码与AI:构建面向未来的智能化应用

引言 在当今数字时代&#xff0c;技术的快速发展为各行各业带来了前所未有的机遇和挑战。企业和组织面临着如何迅速开发和交付高质量应用的需求&#xff0c;同时还需要应对日益复杂的业务需求和用户期望。在这样的背景下&#xff0c;低代码与人工智能&#xff08;AI&#xff0…