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的内存碎片相关推荐

  1. redis之内存碎片问题如何解决

    写在前面 本文一起看下如何处理Redis的内存碎片问题. 1:什么是内存碎片 当操作系统内存充足,但是却无法申请连续N字节内存空间时,这些剩余的内存空间就叫内存碎片. 2:内存碎片是如何形成的 内存碎 ...

  2. redis调优 -- 内存碎片

    最近查看了一下redis运行状况,发现公司测试服务器的redis内存不太够用,但是实际占用内存的数据量其实不大,以前也没有这种情况,之前在cache层新增了一个防刷积分任务的逻辑才会这样,搜索一下原因 ...

  3. Redis 性能优化 —— 内存碎片

    文章目录 一.内存碎片场景描述 二.内存碎片概念解析 三.内存碎片产生原因 四.内存碎片如何判断 五.内存碎片解决方案 六.内存碎片扩展技能 一.内存碎片场景描述 作为内存数据库,内存空间的大小对于 ...

  4. Redis 内存碎片详解

    什么是内存碎片? 你可以将内存碎片简单地理解为那些不可用的空闲内存. 举个例子:操作系统为你分配了 32 字节的连续内存空间,而你存储数据实际只需要使用 24 字节内存空间,那这多余出来的 8 字节内 ...

  5. 首长,Redis性能优化十三条军规立好了,请过目~

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 前言 Redis作为高性能的内存数据库,在大数据量的情况下 ...

  6. Redis为什么变慢了?一文讲透如何排查Redis性能问题 | 万字长文

    阅读本文大约需要 30 分钟. Redis 作为优秀的内存数据库,其拥有非常高的性能,单个实例的 OPS 能够达到 10W 左右.但也正因此如此,当我们在使用 Redis 时,如果发现操作延迟变大的情 ...

  7. 面试不怂之redis与缓存大全

    基础篇 问题:什么是redis? Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源.包含多种数据结构.支持网络.基于内存.可选持久性的键值对存储数据库,其具备 ...

  8. nginx reload内存碎片问题-(一)

    nginx reload内存碎片问题 相关资料 jemalloc.pmap.redis.systemtap.内存紧缩 问题现象 cache nginx 开启ip 库功能 占用700M 内存,reloa ...

  9. 优酷蓝鲸近千节点的Redis集群运维经验总结

    http://www.infoq.com/cn/news/2016/08/youku-Redis-nosql Redis是时下比较流行的Nosql技术.在优酷我们使用Redis Cluster构建了一 ...

最新文章

  1. python gui漂亮_python 漂亮的gui
  2. ivew 限制输入 0 到 1 的数字 包括小数, 0 ,1
  3. redis 哨兵_docker里创建redis哨兵
  4. 哈希表-map(对于python来说是字典)
  5. TCP协议-如何保证传输可靠性
  6. xss漏洞php注射实战,利用XSS渗透DISCUZ 6.1.0实战
  7. 那天空飘过的梅花月饼,是今年中秋最好的礼物
  8. python解题软件哪个好用_几个好用的Python数据分析工具
  9. python中如何导入数据包_如何在python中发送数据包?
  10. UltraEdit键盘快捷键
  11. 只要学会它,再多 Bug 也不怕
  12. VMware+WinDBG_配置_资料
  13. angular应用coreui框架
  14. 计算机怎样更新目录,怎么在word中设置自动更新目录功能
  15. java中的source_Linux中source命令的用法
  16. LeetCode算法之蓄水池算法
  17. EasyClick 蓝奏云+石墨文档实现热更新
  18. 要想增加流量需要做的几点,淘宝运营新手必看的免费流量小知识
  19. ProcessOn第一次使用教程
  20. Win11预览体验计划显示Your PC does not meet the minimum hardware requirements...的解决方案

热门文章

  1. signal函数的简单用法
  2. 电缆的差分特性阻抗(120欧姆)及插入损耗的测量方法
  3. 《重说中国近代史》—张鸣——(2)战争的开始
  4. 文件上传漏洞揭密剖析(一)-文件上传漏洞原理
  5. 校园网拨号上网一直掉线但实际网络通路是连接着的
  6. 使用MATLAB连接USRP实现收发OFDM功能代码说明
  7. 深入理解计算机系统CSAPP复习
  8. CentOS如何修改时区
  9. python|解决Cannot open D:\python\Anaconda\envs\tensorflow\Scripts\pip-script.py(重装pip)
  10. throttle/debounce应用及原理