「Nosql」Redis小记-内存解析&内存消耗篇
*博客搬家:初版发布于 2017/08/12 18:32 原博客地址:https://my.oschina.net/sunqinwen/blog/1507171
Redis内存消耗分析
注:本文默认读者已初步学会使用redis了。
首先我们通过info命令查看相关指标,其中几个memory的重要指标整理出来如下:
| 属性 | 解释 |
| used_memory | redis内部存储的所有数据的内存总占用量(自身内存+对象内存+缓冲内存) |
| used_memory_ress | redis进程占用的总物理内存 |
| mem_fragmentation_ratio | used_memory_ress与used_memory的比值,即为内存碎片率 |
| mem_allocator | 内存分配器,默认为jemalloc |
(1)碎片率的解释
① 当内存碎片率>1时,说明redis进程占用物理内存的总量大于Redis实际存储数据(表1-1第一行)的内存占用量,溢出来的部分内存被内存碎片消耗,如果溢出部分过大,则说明内存碎片率严重。
② 相反的,如果碎片率<1时,则说明Redis存储的数据总量已经超出了redis进程占用内存的总量,造成这种情况是因为操作系统把Redis内存交换至硬盘导致(swap),由于硬盘读取速度远远慢与内存,因此这种情况下redis性能极差,可能出现僵死。
(2)redis内存消耗的几个来源
① 自身内存:redis启动后自身运行所需内存;
② 对象内存:内存占用最大的一部分,这里面存储的就是用户自身的数据(业务数据),数据以key-value类型存储,内存消耗可表示为:key内存+value内存。
③ 缓冲内存:主要由客户端缓冲区+复制积压缓冲区+AOF缓冲区组成,具体解释如下:
- 客户端缓冲区指的是所有接入redis服务器的TCP连接的输入和输出缓冲,输入缓冲无法被控制,最大空间为1G,超过立即断开连接,输出缓冲通过client-output-buffer-limit控制。
- 复制积压缓冲区指的是redis在2.8版本以后提供了一块可以重复利用的固定大小的缓冲区,用来实现部分复制功能,使用repl-backlog-size参数控制,默认1MB(主从结构下,主节点只存在一个该缓冲区,从节点共用,那时可以设置较大的缓冲区空间),该缓冲区可以避免全量复制。
- AOF缓冲区用于存储在redis重写期间保存最近的写入命令,无法控制,通常取决于AOF重写时间以及写入命令量,一般情况下很小。
④ 内存碎片:redis默认的内存分配器是jemalloc,可选的还有glibc和tcmalloc;内存分配器为了更好的管理以及重复利用内存,分配策略一般采用固定范围的内存块进行分配;因此,我们在存储一块5kb的内容时,内存分配器可能会为我们分配8kb的块存储,剩下的3kb不能再次分配给其他对象存储,因而沦为了内存碎片;jemalloc对碎片化问题做了优化,一般来讲碎片化率保持在1.03左右。
可能造成内存碎片率过高的场景:
- 频繁的更新操作,例如频繁对已存在的键做append、setrange等操作;
- 大量过期键删除,键对象过期删除后释放的空间无法得到充分的利用,导致碎片率上升。
解决办法:
- 数据对齐,尽量采用数字类型或固定长度的字符串(大部分业务场景不满足这种方式);
- 重启,重启节点可以使内存重整理,利用高可用的结构(节点集群+主从结构),将碎片率过高的节点主节点转换为从节点,然后进行安全重启。
⑤子进程内存消耗:子进程内存消耗指的是执行AOF/RDB重写时redis创建的子进程内存消耗;redis执行fork操作产生的子进程内存占用量对外表现为与父进程相同,理论上需要一倍的物理内存来完成重写的操作。但是linux具备写时复制技术(copy-on-write),父子进程会共享相同的物理内存页,当父进程处理写请求时会对需要修改的页复制出一份副本来完成写操作,而子进程依然读取fork时整个父进程的内存快照,总结:
- 子进程并不需要消耗一倍的父进程内存,实际消耗根据期间写入命令量决定,但依然要预留出一些内存防止溢出;
- 需要设置sysctl vm.overcommit_memory=1允许内核可以分配所有的物理内存,防止redis进程执行fork时因剩余内存不足导致失败;
- 排查当前系统是否支持开启THP,如果开启建议关闭,防止copy-on-write期间内存过度消耗。
「Nosql」Redis小记-内存解析&内存消耗篇的更多相关文章
- 「Django」rest_framework学习系列-解析器
满足两个要求,request.Post中才有值 1.请求头要求:请求头中的Content-Type为application/x-www-form-urlencoded 2.数据格式要求 name=x& ...
- LoibreOJ 2042. 「CQOI2016」不同的最小割 最小割树 Gomory-Hu tree
2042. 「CQOI2016」不同的最小割 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配
#2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- —Libre#2009. 「SCOI2015」小凸玩密室
#2009. 「SCOI2015」小凸玩密室 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- LibreOJ #2036. 「SHOI2015」自动刷题机
#2036. 「SHOI2015」自动刷题机 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 曾经发明了信号增幅仪的发明家 SHTSC 又公开 ...
- JavaScript 引擎「V8」发布 8.0 版本,内存占用量大幅下降
上周,JavaScript 引擎「V8」的开发团队在该项目官方网站上正式宣布推出最新的 8.0 版本.这次更新的重点主要集中在错误修复及性能改善上,正式的版本将在数周后随着谷歌 Chrome 80 稳 ...
- redis源码解析之内存管理
zmalloc.h的内容如下: void *zmalloc(size_t size); void *zcalloc(size_t size); void *zrealloc(void *ptr, si ...
- redis性能优化、内存分析及优化
redis性能优化.内存分析及优化 1.优化网络延时 2.警惕执行时间长的操作 3.优化数据结构.使用正确的算法 4.考虑操作系统和硬件是否影响性能 5.考虑持久化带来的开销 5.1 RDB 全量持久 ...
- Java当中的内存分配以及值传递问题内存解析
首先必须说明作为Java程序员对于内存只要有大致的了解就可以了,如果你对Java当中的某一个知识点在不需要分析内存分配过程的情况下可以掌握,那就大可不必去研究内存.如果你对知识点已经掌握,那么你应该把 ...
随机推荐
- mosquitto ---配置SSL/TLS linux
mosquitto ---配置SSL/TLS 摘自: https://www.cnblogs.com/saryli/p/9821343.html 在服务器电脑上面创建myCA文件夹, 如在/home/ ...
- js失效的原因及解决方式
1.在head中先引用了js文件再引用jquery,应先引用jquery 2.js文件中所有代码应包含在$(function(){ });中
- Spring框架总结(二)
开发一个简单的Spring项目: 一.开发环境搭建: 1.引入源码jar :3.0以前的版本含有依赖jar包,3.0以后只有spring的核心jar 包 core的jar包 commons-loggi ...
- CodeForces 681D Gifts by the List (树上DFS)
题意:一个家庭聚会,每个人都想送出礼物,送礼规则是, 一个人,先看名单列表,发现第一个祖先 就会送给他礼物,然后就不送了,如果他没找到礼物 他会伤心的离开聚会!告诉你m个祖先关系, 和每个人想给谁送! ...
- PrintWriter类
PrintWriter是一种过滤流,也是一种处理流,即能对字节流和字符流进行处理. 1.查询API后,我们发现,会有八种构造方法.即: PrintWriter(File file) Creates a ...
- css3系列之animation
在上次博文中已经讲了transition,其实animation与transition功能相同,都是通过改变元素 的属性来实现动画效果的.但是它们也有区别:transition是只能通过改变指定属性的 ...
- APUE(5)---标准I/O库 (2)
六.读和写流 一旦打开了流,则可在3种不同类型的非格式化I/O中进行选择,对其进行读.写操作:1)每次一个字符的I/O,一次读或写一个字符,如果刘时代缓冲的,则标准I/O函数处理所有缓冲:2)每次一行 ...
- VCS简介
VCS -Version Control System 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统. 特征 1.记录文件的所有历史变化 2.随时可恢复到任何一个历史状 ...
- pycharm注册
1.官方下载专业版,并安装 http://www.jetbrains.com/pycharm/download/#section=windows 2.下载crack激活包 http://idea.la ...
- 菜鸟的Xamarin.Forms前行之路——windows下VS运行ios模拟器调试
在Xamarin.Forms项目中,运行安卓模拟器是很方便的,但是想要运行IOS模拟器,相对而言是困难一点. 在参考一些资料后,发现很多是与Xamarin.studio有关的方法,尝试了许久没有成功. ...