Redis的内存碎片
Redis默认使用jemalloc分配内存,根据fast'14的最佳论文的说法,当遇到变长key-value负载时,会出现碎片问题:内存利用率低,实际分配的内存比所需要的内存多。因此我用YCSB对Redis的内存进行了测试。
- 实验的第1阶段:向Redis插入100万条记录,key为20字节,value为100字节,皆为定长,理论上的有效数据大约是120MB。
- 阶段2:产生90万个update请求,请求为均匀随机分布(每个key被选中的概率相等),key值不变,但value变为130字节。一次update相当于删除原来的100字节,再插入一个130字节。
- 阶段3:产生90万个update请求,value变为170字节。
- 阶段4:产生90万个update请求,value变为210字节。
- 接着12个阶段,每次都是90万个update请求,value长度渐增。
- 最后一个阶段不产生任何请求,重启redis。
然后每一阶段结束后,都使用info命令查看redis的内存情况,结果如下图所示。
used代表redis使用jemalloc分配的内存,rss代表了进程当前占用的内存(可以看做jemalloc实际分配了多少内存)。rss/used可以作为衡量碎片的指标,越大说明碎片越严重。
可以看到随着value不断增大,redis需要分配的内存线性增长。rss的增长比used更快,因此内存碎片的问题的确存在,rss/used甚至一度超过了2.0(440字节时达到最高值为2.06),这意味着redis每用1GB内存都需要额外多付出1GB。顶峰过后,rss/used下降到了1.6左右。如果我们重启redis,碎片将不再存在。
一个值得注意的问题是,redis使用的内存比实际的数据量多很多。比如第一阶段后,有效数据应为120MB,但redis却分配了525.4MB的内存。其它阶段也有类似现象。具体原因还不清楚,但我感觉有点多。因此除了jemalloc存在的碎片问题,redis本身是否在使用内存时过于土豪?
我还尝试测试了千万条记录的实验,测试方法和百万记录完全一致。但在我的16GB内存的服务器上,实验几乎无法进行,在第2、3个阶段时,redis就会报无法分配内存的错误,导致实验失败。我的猜测是redis的rdb机制使用了copy-on-write,在我们这么高的update负载下,redis需要两倍内存才能完成rdb。
因此我关闭了rdb再进行实验。这次实验可以跑到第8个阶段(370字节),但在第9个阶段时,出现无法分配内存的错误,因为redis使用的内存超过了物理内存。我们来看看第9个阶段的有效数据量,最坏的情况是900万个410+20的key value,100万个370+20的key value,差不多4GB的数据量。但redis在关闭rdb的情况下却无法完成任务!(考虑到这时rss/used接近2了,就算没有任何开销,也需要8GB的内存)
实际的情况是:上述的实验有一些极端,实际的负载可能没有这么变态。因此我测试了facebook公布的负载(即key的长度服从极值分布,value的长度服从帕累托分布),结果发现jemalloc没有出现任何内存碎片问题,rss/used一直是1.03左右。因此内存碎片问题可能存在,但有多严重,得看负载。
Redis的内存碎片相关推荐
- redis之内存碎片问题如何解决
写在前面 本文一起看下如何处理Redis的内存碎片问题. 1:什么是内存碎片 当操作系统内存充足,但是却无法申请连续N字节内存空间时,这些剩余的内存空间就叫内存碎片. 2:内存碎片是如何形成的 内存碎 ...
- redis调优 -- 内存碎片
最近查看了一下redis运行状况,发现公司测试服务器的redis内存不太够用,但是实际占用内存的数据量其实不大,以前也没有这种情况,之前在cache层新增了一个防刷积分任务的逻辑才会这样,搜索一下原因 ...
- Redis 性能优化 —— 内存碎片
文章目录 一.内存碎片场景描述 二.内存碎片概念解析 三.内存碎片产生原因 四.内存碎片如何判断 五.内存碎片解决方案 六.内存碎片扩展技能 一.内存碎片场景描述 作为内存数据库,内存空间的大小对于 ...
- Redis 内存碎片详解
什么是内存碎片? 你可以将内存碎片简单地理解为那些不可用的空闲内存. 举个例子:操作系统为你分配了 32 字节的连续内存空间,而你存储数据实际只需要使用 24 字节内存空间,那这多余出来的 8 字节内 ...
- 首长,Redis性能优化十三条军规立好了,请过目~
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 前言 Redis作为高性能的内存数据库,在大数据量的情况下 ...
- Redis为什么变慢了?一文讲透如何排查Redis性能问题 | 万字长文
阅读本文大约需要 30 分钟. Redis 作为优秀的内存数据库,其拥有非常高的性能,单个实例的 OPS 能够达到 10W 左右.但也正因此如此,当我们在使用 Redis 时,如果发现操作延迟变大的情 ...
- 面试不怂之redis与缓存大全
基础篇 问题:什么是redis? Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源.包含多种数据结构.支持网络.基于内存.可选持久性的键值对存储数据库,其具备 ...
- nginx reload内存碎片问题-(一)
nginx reload内存碎片问题 相关资料 jemalloc.pmap.redis.systemtap.内存紧缩 问题现象 cache nginx 开启ip 库功能 占用700M 内存,reloa ...
- 优酷蓝鲸近千节点的Redis集群运维经验总结
http://www.infoq.com/cn/news/2016/08/youku-Redis-nosql Redis是时下比较流行的Nosql技术.在优酷我们使用Redis Cluster构建了一 ...
最新文章
- python gui漂亮_python 漂亮的gui
- ivew 限制输入 0 到 1 的数字 包括小数, 0 ,1
- redis 哨兵_docker里创建redis哨兵
- 哈希表-map(对于python来说是字典)
- TCP协议-如何保证传输可靠性
- xss漏洞php注射实战,利用XSS渗透DISCUZ 6.1.0实战
- 那天空飘过的梅花月饼,是今年中秋最好的礼物
- python解题软件哪个好用_几个好用的Python数据分析工具
- python中如何导入数据包_如何在python中发送数据包?
- UltraEdit键盘快捷键
- 只要学会它,再多 Bug 也不怕
- VMware+WinDBG_配置_资料
- angular应用coreui框架
- 计算机怎样更新目录,怎么在word中设置自动更新目录功能
- java中的source_Linux中source命令的用法
- LeetCode算法之蓄水池算法
- EasyClick 蓝奏云+石墨文档实现热更新
- 要想增加流量需要做的几点,淘宝运营新手必看的免费流量小知识
- ProcessOn第一次使用教程
- Win11预览体验计划显示Your PC does not meet the minimum hardware requirements...的解决方案
热门文章
- signal函数的简单用法
- 电缆的差分特性阻抗(120欧姆)及插入损耗的测量方法
- 《重说中国近代史》—张鸣——(2)战争的开始
- 文件上传漏洞揭密剖析(一)-文件上传漏洞原理
- 校园网拨号上网一直掉线但实际网络通路是连接着的
- 使用MATLAB连接USRP实现收发OFDM功能代码说明
- 深入理解计算机系统CSAPP复习
- CentOS如何修改时区
- python|解决Cannot open D:\python\Anaconda\envs\tensorflow\Scripts\pip-script.py(重装pip)
- throttle/debounce应用及原理