「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当中的某一个知识点在不需要分析内存分配过程的情况下可以掌握,那就大可不必去研究内存.如果你对知识点已经掌握,那么你应该把 ...
随机推荐
- [Email] 收发邮件的协议 : IMAP and SMTP , POP3 and SMTP
支持 IMAP 和 SMTP 的应用 与仅同步收件箱的 POP 不同,IMAP 同步所有电子邮件文件夹. 在电子邮件应用中使用以下设置. 接收 (IMAP) 服务器 服务器地址:imap-mail.o ...
- cmake3.2.2 在Ubuntu14.04下的安装
参考:http://askubuntu.com/questions/610291/how-to-install-cmake-3-2-on-ubuntu-14-04 1.判断相关软件是否安装 sudo ...
- linux centOS下怎么配置web服务器
| 浏览:4503 | 更新:2011-12-07 17:45 1 2 3 分步阅读 下是我在配置web服务时作的一些记录,高手飘开或者看了指点一下,不胜感激,第一次配置,很多细节需要自己优化.适合环 ...
- tomcat端口作用
<Server port="8005" shutdown="SHUTDOWN"> <Connector port="8080&q ...
- 启动Hadoop HDFS时的“Incompatible clusterIDs”错误原因分析
"Incompatible clusterIDs"的错误原因是在执行"hdfs namenode -format"之前,没有清空DataNode节点的data目 ...
- Postgresql导出指定的数据表
两对双引号"\"\""是用于解决:pg_dump: no matching tables were found 问题. pg_dump -h localhost ...
- OpenCV4Android安装
转:http://blog.csdn.net/gao_chun/article/details/49359535 1.下载及目录介绍 2.将 OpenCV引入 Android Studio 3.更新 ...
- [LeetCode 题解]: Search a 2D Matrix
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- ios系统架构及常用框架
1.iOS基于UNIX系统,因此从系统的稳定性上来说它要比其他操作系统的产品好很多 2.iOS的系统架构分为四层,由上到下一次为:可触摸层(Cocoa Touch layer).媒体层(Media l ...
- Go语言最佳实践—— 字符串
1.串联字符串 Go语言虽然支持+=操作符来追加字符串,但更好的方式是使用bytes.Buffer,这种方式在节省内存和效率方面有更好的表现. 如: var buffer bytes.Buffer b ...