对于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. redis性能优化、内存分析及优化

    redis性能优化.内存分析及优化 1.优化网络延时 2.警惕执行时间长的操作 3.优化数据结构.使用正确的算法 4.考虑操作系统和硬件是否影响性能 5.考虑持久化带来的开销 5.1 RDB 全量持久 ...

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

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

  3. [转载]JavaScript内存分析

    https://github.com/CN-Chrome-DevTools/CN-Chrome-DevTools/blob/master/md/Performance-Profiling/javasc ...

  4. iOS的内存分析和内存管理

    iOS的内存分析和内存管理 [内存管理]一直是iOS开发中的一个重点. 本文就带你从内存分析开始一步步了解内存的占用情况,从真实的情况中领悟真正项目开发过程中的内存的使用情况. 注:本文默认你熟悉 M ...

  5. Java面向对象内存分析

    title: Java面向对象内存分析 date: 2018-07-28 11:12:50 tags: JavaSE categories: - Java - JavaSE 一.Java虚拟机的内存区 ...

  6. Java数组(基本+内存分析)

    一.数组概念   数组即为多个相同数据类型数据的数据按一定顺序排列的集合. 二.数组的特点   1.数组有数组名.索引.元素.素组长度:   2.数组的元素可以是基本数据类型也可以是引用数据类型:   ...

  7. redis 源代码分析(一) 内存管理

    一,redis内存管理介绍 redis是一个基于内存的key-value的数据库,其内存管理是很重要的,为了屏蔽不同平台之间的差异,以及统计内存占用量等,redis对内存分配函数进行了一层封装,程序中 ...

  8. redis redis常用命令及内存分析总结(附RedisClient工具简介

    redis常用命令及内存分析总结(附RedisClient工具简介 by:授客 QQ:1033553122 redis-cli工具 查看帮助 连接redis数据库 常用命令 exists key se ...

  9. Android内存优化(三)详解内存分析工具MAT

    前言 在这个系列的前四篇文章中,我分别介绍了DVM.ART.内存泄漏和内存检测工具的相关知识点,这一篇我们通过一个小例子,来学习如何使用内存分析工具MAT. 1.概述 在进行内存分析时,我们可以使用M ...

随机推荐

  1. jmeter事务控制器

    jmeter事务控制器常用于压力测试时如果一个功能包括多个请求时,需要测试这个功能的压力情况,则需要把多个请求放到一个事务控制器里面

  2. Springboot:员工管理之首页(十(2))

    访问首页可以通过两种方式: 1:编写controller 2:自定义扩展视图解析器(推荐使用) 1:编写Controller com\springboot\controller\IndexContro ...

  3. python数据分析工具——Pandas、StatsModels、Scikit-Learn

    Pandas Pandas是 Python下最强大的数据分析和探索工具.它包含高级的数据结构和精巧的工具,使得在 Python中处理数据非常快速和简单. Pandas构建在 Numpy之上,它使得以 ...

  4. SpringBoot项目集成Redis

    一.在pom文件中添加依赖 <!-- 集成redis --> <dependency> <groupId>org.springframework.boot</ ...

  5. php utf-8

    header(”Content-Type: text/html; charset=UTF-8″) 控制器控释模板输出: 值: array (size=8) 1 => array (size=4) ...

  6. Fabric的6大特性

    文章目录 什么是Hyperledger Fabric 1. 成员准入 2. 性能,可伸缩性和信任级别 3 需要了解的数据 4 通过不可变的分布式账本进行复杂查询 5 支持插件组件的模块化架构 6 保护 ...

  7. javescrip内嵌样式与外联样式怎么做?

    对于前端初学者,个人JS样式常用的有两种:内嵌样式 ,外联样式:下面通过一个简单的鼠标点击出现设定的验证数字为例进行演示: 先看下效果: 鼠标点击前效果: 鼠标点击后效果: 图中的这个ojbk是我js ...

  8. 【JAVA基础】05 Java语言基础:数组

    1. 数组概述和定义格式说明 为什么要有数组(容器) 为了存储同种数据类型的多个值 数组概念 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数据类型,也可以存储引用 ...

  9. Next.js 7发布,构建速度提升40%

    Next.js团队发布了其开源React框架的7版本.该版本的Next.js主要是改善整体的开发体验,包括启动速度提升57%.开发时的构建速度提升40%.改进错误报告和WebAssembly支持. \ ...

  10. inotifywait实现文件监控

    应用场景文件监控可以配合rsync实现文件自动同步,例如监听某个目录,当文件变化时,使用rsync命令将变化的文件同步.(可用于代码自动发布) 安装noitify下载地址:http://github. ...