文章系转载,方便整理和归纳
作者:WindWant
出处:https://www.cnblogs.com/niejunlei/p/12898225.html

对于redis来说,什么是最重要的?

毋庸置疑,是内存。

一、reids 内存分析

redis内存使用情况:info memory

示例:

可以看到,当前节点内存碎片率为226893824/209522728≈1.08,使用的内存分配器是jemalloc。

used_memory_rss 通常情况下是大于 used_memory 的,因为内存碎片的存在。

但是当操作系统把redis内存swap到硬盘时,memory_fragmentation_ratio 会小于1。redis使用硬盘作为内存,因为硬盘的速度,redis性能会受到极大的影响。

二、redis 内存使用

之前的文章 关于redis,你需要了解的几点!中我们简单介绍过redis的内存使用分布:自身内存,键值对象占用、缓冲区内存占用及内存碎片占用。

redis 空进程自身消耗非常的少,可以忽略不计,优化内存可以不考虑此处的因素。

1、对象内存

对象内存,也即真实存储的数据所占用的内存。

redis k-v结构存储,对象占用可以简单的理解为 k-size + v-size。

redis的键统一都为字符串类型,值包含多种类型:string、list、hash、set、zset五种基本类型及基于string的Bitmaps和HyperLogLog类型等。

在实际的应用中,一定要做好kv的构建形式及内存使用预期,可以参考 关于redis,你需要了解的几点! 中关于不同值类型不同形式下的内部存储实现介绍。

2、缓冲内存

缓冲内存包括三部分:客户端缓存、复制积压缓存及AOF缓冲区。

**1)客户端缓存:**接入redis服务器的TCP连接输入输出缓冲内存占用,TCP输入缓冲占用是不受控制的,最大允许空间为1G。输出缓冲占用可以通过client-output-buffer-limit参数配置。

redis 客户端主要分为从客户端、订阅客户端和普通客户端。

**从客户端连接占用:**也就是我们所说的slave,主节点会为每一个从节点建立一条连接用于命令复制,缓冲配置为:client-output-buffer-limit slave 256mb 64mb 60。

主从之间的间络延迟及挂载的从节点数量是影响内存占用的主要因素。因此在涉及需要异地部署主从时要特别注意,另外,也要避免主节点上挂载过多的从节点(<=2);

订阅客户端内存占用:发布订阅功能连接客户端使用单独的缓冲区,默认配置:client-output-buffer-limit pubsub 32mb 8mb 60。

当消费慢于生产时会造成缓冲区积压,因此需要特别注意消费者角色配比及生产、消费速度的监控。

**普通客户端内存占用:**除了上述之外的其它客户端,如我们通常的应用连接,默认配置:client-output-buffer-limit normal 1000。

可以看到,普通客户端没有配置缓冲区限制,通常一般的客户端内存消耗也可以忽略不计。

但是当redis服务器响应较慢时,容易造成大量的慢连接,主要表现为连接数的突增,如果不能及时处理,此时会严重影响redis服务节点的服务及恢复。

关于此,在实际应用中需要注意几点:

-> maxclients最大连接数配置必不可少。

-> 合理预估单次操作数据量(写或读)及网络时延ttl。

-> 禁止线上大吞吐量命令操作,如keys等。

高并发应用情景下,redis内存使用需要有实时的监控预警机制,

2)复制积压缓冲区

v2.8之后提供的一个可重用的固定大小缓冲区,用以实现向从节点的部分复制功能,避免全量复制。配置单数:repl-backlog-size,默认1M。单个主节点配置一个复制积压缓冲区。

3)AOF缓冲区

AOF重写期间增量的写入命令保存,此部分缓存占用大小取决于AOF重写时间及增量。

3、内存碎片内存占用

关于redis,你需要了解的几点!简单介绍过redis的内存分配方式。

三、redis 子进程内存消耗

子进程即redis执行持久化(RDB/AOF)时fork的子任务进程。

1、关于linux系统的写时复制机制:

父子进程会共享相同的物理内存页,父进程处理写请求时会对需要修改的页复制一份副本进行修改,子进程读取的内存则为fork时的父进程内存快照,因此**,**子进程的内存消耗由期间的写操作增量决定。

2、关于linux的透明大页机制THP(Transparent Huge Page):

THP机制会降低fork子进程的速度;写时复制内存页由4KB增大至2M。高并发情境下,写时复制内存占用消耗影响会很大,因此需要选择性关闭。

3、关于linux配置:

一般需要配置linux系统 vm.overcommit_memory=1,以允许系统可以分配所有的物理内存。防止fork任务因内存而失败。

四、redis 内存管理

redis的内存管理主要分为两方面:内存上限控制及内存回收管理。

1、内存上限:maxmemory

目的:缓存应用内存回收机制触发 + 防止物理内存用尽(redis 默认无限使用服务器内存) + 服务节点内存隔离(单服务器上部署多个redis服务节点)

在进行内存分配及限制时要充分考虑内存碎片占用影响。

动态调整,扩展redis服务节点可用内存:config set maxmemory {}。

2、内存回收

回收时机:键过期、内存占用达到上限

1)过期键删除:

redis 键过期时间保存在内部的过期字典中,redis采用惰性删除机制+定时任务删除机制。

**惰性删除:**即读时删除,读取带有超时属性的键时,如果键已过期,则删除然后返回空值。这种方式存在问题是,触发时机,加入过期键长时间未被读取,那么它将会一直存在内存中,造成内存泄漏。

**定时任务删除:**redis内部维护了一个定时任务(默认每秒10次,可配置),通过自适应法进行删除。

删除逻辑如下:

需要说明的一点是,快慢模式执行的删除逻辑相同,这是超时时间不同。

2)内存溢出控制

当内存达到maxmemory,会触发内存回收策略,具体策略依据maxmemory-policy来执行。

noevication:默认不回收,达到内存上限,则不再接受写操作,并返回错误。

volatile-lru:根据LRU算法删除设置了过期时间的键,如果没有则不执行回收。

allkeys-lru:根据LRU算法删除键,针对所有键。

allkeys-random:随机删除键。

volatitle-random:随机删除设置了过期时间的键。

volatilte-ttl:根据键ttl,删除最近过期的键,同样如果没有设置过期的键,则不执行删除。

动态配置:config set maxmemory-policy {}

在设置了maxmemory情况下,每次的redis操作都会检查执行内存回收,因此对于线上环境,要确保所这只的maxmemory>used_memory。

另外,可以通过动态配置maxmemory来主动触发内存回收。

关于redis内存分析,内存优化相关推荐

  1. 实践App内存优化:如何有序地做内存分析与优化

    由于项目里之前线上版本出现过一定比例的OOM,虽然比例并不大,但是还是暴露了一定的问题,所以打算对我们App分为几个步骤进行内存分析和优化,当然内存的优化是个长期的过程,不是一两个版本的事,每个版本都 ...

  2. 有了这篇你还说你不会redis性能优化、内存分析及优化

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 来源: https://bl ...

  3. redis提高oracle性能,redis性能分析与优化建议

    首先,并不是说redis是内存应用就完全没性能问题,用的不好,还是会出现各种状况,例如RDB频繁,碎片太多等. 性能分析 info信息: 在redis-cli进入登录界面后,输入info all,或者 ...

  4. Redis源代码分析-内存数据结构intset

    这次研究了一下intset.研究的过程中,一度看不下过去,可是还是咬牙挺过来了.看懂了也就是那么回事.静下心来,切莫浮躁 Redis为了追求高效,在存储下做了非常多的优化,像intset就是作者为了节 ...

  5. Python性能分析入门——cProfile、可视化、逐行分析、内存分析

    文章目录 简介 cProfile PyCharm 可视化 安装 gprof2dot SnakeViz PyCallGraph 逐行分析 内存分析 内存堆分析 其他 遇到的坑 参考文献 简介 通过性能分 ...

  6. 【Unity】Unity内存管理与优化(三)

    文章目录 Unity内存管理 大对象堆LOH(Large Object Heap) 方法调用 内存细分 分析内存 - 分析内存消耗 - 分析内存效率 内存管理性能增强 垃圾回收策略 手动JIT编译 值 ...

  7. Android 内存分析总结

    一直没有写博客的习惯,最近觉得年纪貌似有点大了,不像以前记忆这么好,想找个方式梳理一下知识,刚好最近在ITeye上看之前一起工作过的一个大哥写的一些关于状态机的一些东西,就萌生了也写一写,记录一下的想 ...

  8. Android内存分析

    最近简单学些了android内存分析,下面为一些学习笔记和整理. 一.内存数据的获取 1. 查看手机系统内存信息 adb pull /system/build.prop 打开build.prop可以查 ...

  9. UE3 性能、分析及优化

    性能.分析及优化 概述 通用维护 基础工具和技术 内存分析 内容分析和优化 CPU 性能 游戏线程性能 渲染线程性能 GPU 性能 网络分析 移动设备分析 概述 使游戏可以正常运行的同时符合内存约束条 ...

  10. Redis内存分析工具

    2019独角兽企业重金招聘Python工程师标准>>> RdbTools是一个由于分析Redis dump.rdb文件的工具,有以下功能: 生成所有数据库和key的内存分析报告 把d ...

最新文章

  1. Sentinel集群流控
  2. 单元测试线程代码的5个技巧
  3. ora-01092: oracle 实例终止.强制断开连接,undo表空间故障特殊恢复(二)------ORA-01092: ORACLE 实例终止。强制断开连接...
  4. 微软推行 Windows 10 更新政策 往后不会太强硬要求升级!
  5. 判断端口是否能用_MSP430单片机的端口解析
  6. 从零学会SQL:入门(实操演示)
  7. Unity实时全局光照和烘焙全局光照 Unity2019
  8. 在 MQL5 中创建多色彩指标
  9. 古典乐器网页设计成品 大学生音乐网站制作模板 大学生静态音乐HTML网页源码 dreamweaver网页作业 简单网页课程成品
  10. Kickstart自动化安装平台
  11. Android 主线程子线程执行关系
  12. mysql flush pri_mysql命令flush privileges
  13. JAVA星期健身计划:If语句和Switch语句
  14. keil设置c语言字体大小,Keil uVision4怎么放大字体?放大字体和关键字标注颜色方法介绍...
  15. 5.1声道转化为左右声道
  16. Apple iPad:过渡设备还是平板电脑?
  17. Today今天便利店的梦想:准独角兽的雄心与挑战 1
  18. java:求鸡兔同笼类型题目的小程序
  19. 走进常熟东南相互电子,看AI如何深入产业让工厂更智能
  20. P2709 小B的询问 莫队入门

热门文章

  1. python打包,上传包知识点学习
  2. 指定某个git的版本代码拉取新的分支
  3. environment variable is too large 2047
  4. Java Servlet(十一):一个servlet被10个浏览器客户端访问时会创建几个servlet实例?...
  5. 本地VM安装虚拟机,使用xshell连接
  6. 2014.12.03 页面控件
  7. 从P1到P7——我在淘宝这7年 - 子柳撰写
  8. MarioTCP, take it..
  9. 范型编程系列二(非原创)
  10. 怎么用javascript进行拖拽[zt]