高效利用内存首先需要理解redis内存消耗在哪里

有些内存消耗是必不可少的,有些内存是可以通过调整参数、合理使用来避免内存浪费。

内存消耗:进程自身消耗和子进程消耗。

info memory

used_memory:856560 redis分配器分配的内存总量,所有数据的内存总量
used_memory_human:836.48K 以可读的格式返回used_memory
used_memory_rss:2805760 从操作系统的角度表示redist进程占用的物理内存
used_memory_rss_human:2.68M 以可读的格式返回used_memory_rss
used_memory_peak:897016 内存使用的最大值,表示used_memory峰值
used_memory_lua:37888 lua引擎所消耗的内存大小
mem_fragmentation_ratio:3.44 内存碎片率 used_memory_rss/used_memory比值

重点关注的指标:used_memory_rss,used_memory、mem_fragmentation_ratio
mem_fragmentation_ratio>1,多出的数据没有用到数据存储,而是被内存碎片所消耗。这里是不理解的
mem_fragmentation_ratio<1,这种情况是出现在操作系统把redis内存交换到硬盘所导致,出现这种情况要格外关注。其实这里也不理解。

redis进程内存消耗主要包括:
自身内存+对象内存+缓冲内存+内存碎片,其中redis空进程消耗较少,通常used_memory_rss消耗在3MB左右,used_memory在800KB左右。空的redis进程可忽略不计。
对象内存:是redis内存占用最大的一块,存储着用户所有数据。redis数据采用key-value,即创建是是创建两个对象。key对象,value对象。,两个都需要消耗内存。key是采用字符串,为了避免浪费内存,避免使用过长的键。value是采用5种数据类型等,每种数据类型占用内存不同,使用时需要合理预估并监控value对象占用情况。这里有一个不明白的地方:怎么监控、预估?
缓冲内存:客户端缓冲、复制积压缓冲区,AOF缓冲区
客户端缓冲:通过参数client-output-buffer-limit输出缓存控制。 client-output-buffer-limit normal 0 0 0,redis没有对普通客户端的输出缓存区做控制一般忽略不计。当有大量慢连接客户端接入时,就需要关注。采取的方法时:maxclients做限制。特别是当使用大量数据输出的命令且数据无法及时推送给客户端,monitor命令, 容易造成redis服务器内存突然飙升。
从客户端:主节点会为每个从节点单独建立一条连接用于命令复制,默认配置是: client-output-buffer-limit salve 256mb 64mb 60.内存消耗较大分两种情况:主节点网络延迟较高或主节点挂载大量从节点。从节点尽量小于两个,主节点不要配置在网络较差环境下,异地跨机房,防止复制客户端连接缓慢造成溢出。
订阅客户端:当使用发布订阅功能时,配置:client-output-buffer-limit pubsub 32mb 8mb 60,订阅服务的消费生产快于消费速度时,输出缓冲区会产生积压造成输出缓存区空间溢出。输入输出在大流量场景需要重点监控。
复制积压缓冲区:根据repl-backlog-size参数控制,默认1MB,可以设置大一点,避免全量复制。
AOF缓冲区:用于在resdis重写期间保存最近的写入命令。AOF缓存区空间消耗没办法控制,消耗内存取决于AOF重写时间和写入命令量,这部分空间占用通常很小
内存碎片:redis内存分配器jemalloc在64位系统中,将空间划分为小,大,巨大,三个范围。每个范围又分为多个小的内存块单位:
小:8byte,16,32,48…3840byte
大:4kb,8kb,12kb…4072kb
巨大:4Mb,8mb,12MB
保存5kb对象,redis内存分配器会采用8kb快存储,剩下的3kb空间变为了内存碎片,又不能再分配给其他的对象存储。内存碎片问题内存服务的通病,但是redis内存分配器针对碎片化问题做了优化,一般不会存在过度碎片化问题,正常的碎片率 mem_fragmentation_ratio在1.03左右。
较容易出现高内存碎片问题:
频繁对已存在的键做更新操作,例如append,setrange等
大量过期键删除:键对象过期删除后,释放空间无法得到充分利用,导致碎片率上升。
解决办法:
数据对齐,在条件允许下尽量做数据对齐,尽量采用数字类型或者固定长度字符串等,具体业务定。
安全重启:重启节点可以做到内存碎片重新整理,可以利用高可用架构,如sentinel,cluster,将碎片率过高的主节点转换为从节点。

子进程内存消耗:
主要是AOF和RDB重写时redis创建的子进程内存消耗,,redis执行fork操作产生的子进程内存占用量对外表现与父进程一样,理论是需要一倍的物理内存,不需要消耗1倍的父进程内存,实际消耗由写入命令决定,但是依然要预留内存防止溢出。
需要设置sysctl vm.overcommit_memory=1允许内核可以分配所有的物理内存,防止redis进程之星fork因系统内存不足而失败。
排查当前系统是否支持开启THP,如果开启建议关闭,防止写时复制技术过度消耗。这里怎么排查不理解

redis内存理解---内存消耗相关推荐

  1. 【死磕 Redis】------ 理解 Redis 的内存

    原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』 我们知道 Redis 的所有数据都存储在内存中,内存是我们系统中的一个 ...

  2. Redis理解内存《Redis开发与运维读书笔记》

    文章目录 内存的消耗 内存划分 内存管理 内存优化 内存的消耗 可以使用info memory 查看内存消耗. 内存划分 对象内存 = sizeof(key) + sizeof(value) 应避免使 ...

  3. 挑战Redis单实例内存最大极限,“遭遇”NUMA陷阱!

    我们公司的基础架构部有个云Redis平台,其中Redis实例在申请的时候可以自由选择需要的内存的大小.然后就引发了我的一个思考,Redis单实例内存最大申请到多大比较合适?假设母机是64GB内存的物理 ...

  4. JVM学习笔记之-垃圾回收相关概念 System.gc()的理解 内存溢出与内存泄漏 STW 垃圾回收的并行与并发 安全点与安全区域 再谈引用:强引用 软引用 弱引用 虚引用 终结器引用

    System.gc()的理解 在默认情况下,通过System.gc()或者Runtime. getRuntime ( ).gc ()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试 ...

  5. Redis 数据结构与内存管理策略(上)

    Redis 数据结构与内存管理策略(上) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.Li ...

  6. Redis进阶之内存模型

    转载自   Redis进阶之内存模型 前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时, ...

  7. Redis占用大量内存并且报错 Can‘t save in background: fork: Cannot allocate memory

    Redis Can't save in background: fork: Cannot allocate memory 解决 先说如何解决: echo 'vm.overcommit_memory=1 ...

  8. 全网最硬核 Java 新内存模型解析与实验 - 3. 硬核理解内存屏障(CPU+编译器)

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...

  9. 深入理解内存(3):内存交换技术,虚拟内存

    深入理解内存(3):内存交换技术,虚拟内存 2013-01-15 21:14 1560人阅读 评论(0) 收藏 举报 分类: 3) C++(59) 1)IT Related(21) 版权声明:本文为博 ...

最新文章

  1. xy坐标转换为极坐标_CAD制图软件新手攻略:坐标系及标注坐标
  2. java break递归_【Java】递归总结
  3. python修改pdf文件大小,python读pdf文件字体大小_用Python读取pdf文件
  4. 各省简称 拼音 缩写_求全国各城市的拼音和简写拼音。
  5. Thinkphp企业级知宇自动发卡系统源码bug漏洞分析
  6. 【8】黑塞矩阵提取图片关键点
  7. java reader 组合_Java IText 拼接合并PDF的三种方法
  8. 真值表-Python实现
  9. 计算机装配方案之游戏发烧型,5000元Intel八代i5-8500配RX580电脑配置 畅玩各类中大型游戏...
  10. 使用AD13设计PCB的技巧总结
  11. MIMO 从入门到精通 -科普篇2 - MIMO and Beamforming
  12. 计算机与控制工程学院用英语怎么说,计算机与控制工程学院副院长童向荣老师2017年开学典礼致辞...
  13. eureka 缺点
  14. 学习小甲鱼Python入门(二)习题笔记-列表
  15. 迅雷【任务配置文件错误,无法继续下载】解决方法
  16. springboot中使用druid查询sqlite报错getFetchDirection error ResultSet closed
  17. cocos creator设置网络头像
  18. 伐木工和森林的故事(一)
  19. UE4初学笔记:孙悟空场景人物搭建
  20. mysql中cube是什么意思中文,什么是EC-CUBE

热门文章

  1. IIC 驱动OLED
  2. Windows下的Mysql安装
  3. 计算机维修中拆机工具有哪些,秒变专业拆机维修达人,这款工具套装你值得拥有...
  4. 超强AI绘画Midjourney使用教程
  5. Mandelbrot Set Julia Set -- 美丽分形 (C++, MFC + BCG + CxImage 实现)
  6. linux系统使用df -h 命令卡住
  7. 方法的调用,构造方法,方法的重载
  8. java核心技术卷代码下载
  9. 用opencv做一个头像
  10. word转html java pect,THE PROPECT OF COMPUTERISATION IN THE BANKING 在银行计算机化的前景.doc...