• Kaito
    2020-09-23
    如果 mem_fragmentation_ratio 小于 1 了,Redis 的内存使用是什么情况呢?会对 Redis 的性能和内存空间利用率造成什么影响? mem_fragmentation_ratio小于1,说明used_memory_rss小于了used_memory,这意味着操作系统分配给Redis进程的物理内存,要小于Redis实际存储数据的内存,也就是说Redis没有足够的物理内存可以使用了,这会导致Redis一部分内存数据会被换到Swap中,之后当Redis访问Swap中的数据时,延迟会变大,性能下降。 通过这篇文章了解到,Redis在进行内存碎片整理时,由于是主线程操作的,所以这块也是一个影响Redis性能的风险点。 其中active-defrag-ignore-bytes和active-defrag-threshold-lower参数主要用于控制达到什么阈值后开始碎片整理,如果配置的碎片大小和碎片率在可接受的范围内,那么Redis不会进行碎片整理,也就不会对Redis产生性能影响。 而达到设定阈值开始碎片整理后,active-defrag-cycle-min和active-defrag-cycle-max参数则用来控制在这期间,Redis主线程资源使用的上下限,这个需要根据碎片整理的时间、Redis的响应延迟进行权衡,合理配置。 我个人认为,应该优先保证Redis性能尽量不受影响,让碎片整理期间的资源消耗控制在稳定的范围内,并尽量缩短碎片整理的时间。
    展开
    共 16 条评论
    285
  • test
    2020-09-23
    mem_fragmentation_ratio小于1,说明redis内存不够用了,换了一部分到swap中,会严重影响性能。
    
    34
  • Geek_b8d5c9
    2020-12-11
    有点想Java中的垃圾回收算法的标记整理
    
    21
  • escray
    2021-03-27
    数据删除后,Redis 释放的内存空间由内存分配器管理,不会立刻返回给操作系统。 再加上内存碎片的问题,感觉是因为 Redis 是使用 C 语言实现的,如果是在 JVM 上,内存管理就不会成为棘手的问题了,当然性能上 JVM 比起 C 语言来还是有不少劣势。 其实 Redis 清理内存碎片的方式和 JVM 的内存管理也很类似。 active-defrag-ignore-bytes、active-defrag-threshold-lower、active-defrag-cycle-min、active-defrag-cycle-max 是 4 个和 Redis 内存碎片清理机制有关的参数,而 100mb、10、25、75 应该是老师给出的参考值或者是最佳实践吧。 如果 mem_fragmentation_ratio 小于 1,那么我来猜测一下,如果小于 0.5 感觉内存的利用率比较低,内存的 ROI 太低,可以考虑减少给 Redis 分配的内存;而在 0.5 ~ 1 之间的话,感觉应该是比较合适的,但是也有可能会有太多的碎片需要整理。 看了课代表的回答,惭愧的发现,我完全搞反了 used_memory_rss 和 used_memory 的含义,其中 rss 表示 resident set size used_memory: Total number of bytes allocated by Redis using its allocator (either standard libc, jemalloc, or an alternative allocator such as tcmalloc) used_memory_rss: Number of bytes that Redis allocated as seen by the operation system (a.k.a resident set size). Ideally, the used_memory_rss value should be only slightly higher than used_momory. When rss >> used, a large difference means there is memory fragmentation... When used >> rss, it means part of Redis memory has been swapped off by the operating system: expect some significant latencies. 在留言里没有看到老师的身影(“作者回复”),爱总结的非凡哥也不见了,只有课代表还在。
    展开
    共 1 条评论
    15
  • IT小僧
    2020-12-15
    小于1不一定是发生了swap 也有可能是因为内存空白页导致的,前者会影响性能,后者不会。
    共 4 条评论
    13
  • 树斌
    2020-09-24
    实际案例,redis-cluster三主三从,检查所有节点的内存碎片率均小于1,在0.7-0.9之间,used_memory基本每个节点都只有12m左右,但是检查swap确认是没有虚拟内存交换的,不知道这种情况作何解释?一直没闹明白
    共 4 条评论
    13
  • 悟空聊架构
    2021-05-29
    课后问题: 如果 mem_fragmentation_ratio 小于 1 了,Redis 的内存使用是什么情况呢?会对 Redis 的性能和内存空间利用率造成什么影响呢? mem_fragmentation_ratio = used_memory_rss / used_memory < 1 , 说明操作系统分配给Redis进程的物理内存 < Redis实际存储数据的内存。 原因和影响: 1.Redis 没有申请到足够的物理内存 2.Redis 的一部分内存数据会被换到 Swap 中 3.Redis访问 swap 中的数据时,相当于与磁盘进行交互,访问慢,性能下降。 swap 是什么? 内存 swap 是操作系统里将内存数据在内存和磁盘间来回换入和换出的机制,涉及到磁盘的读写。一旦出发 swap,性能会收到慢速磁盘读写的影响。 Redis 实例自身使用了大量的内存,导致物理机器的可用内存不足。 和 Redis 实例在同一台机器上运行的其他进程,在进行大量的文件读写操作,文件读写本身会占用系统,导致分配给 Redis 实例的内存量变少,进而出发 Redis 发生 swap。 如何识别和处理 Redis 内存碎片 info memory 命令是一个好工具,可以帮助你查看碎片率的情况; INFO memory 碎片率阈值是一个好经验,可以帮忙你有效地判断是否要进行碎片清理了; mem_fragmentation_ratio = used_memory_rss/ used_memory used_memory_rss 是操作系统实际分配给 Redis 的物理内存空间,里面就包含了碎片; used_memory 是 Redis 为了保存数据实际申请使用的空间 内存碎片自动清理是一个好方法,可以避免因为碎片导致 Redis 的内存实际利用率降低,提升成本收益率。 config set activedefrag yes active-defrag-ignore-bytes 100mb:表示内存碎片的字节数达到 100MB 时,开始清理; ​active-defrag-threshold-lower 10:表示内存碎片空间占操作系统分配给 Redis 的总空间比例达到 10% 时,开始清理。(第一个和第二个需要同时满足才会开始清理) active-defrag-cycle-min 25: 表示自动清理过程所用 CPU 时间的比例不低于 25%,保证清理能正常开展; active-defrag-cycle-max 75:表示自动清理过程所用 CPU 时间的比例不高于 75%,一旦超过,就停止清理,从而避免在清理时,大量的内存拷贝阻塞 Redis,导致响应延迟升高。
    展开
    共 1 条评论
    11
  • 数学汤家凤
    2020-11-11
    内存分配向上取整导致的内部碎片 内存反复分配回收导致的外部碎片 解决方法移动,什么时候移动?碎片太多且CPU不忙时移动
    共 1 条评论
    6
  • 小西几
    2020-09-27
    启用碎片整理的时候报错 127.0.0.1:6379> CONFIG SET activedefrag yes (error) DISABLED Active defragmentation cannot be enabled: it requires a Redis server compiled with a modified Jemalloc like the one shipped by default with the Redis source distribution 此时碎片率已经达到4.28,并且redis 还没有启用持久化, 其他数据: used_memory:3304902272 used_memory_human:3.08G used_memory_rss:14155644928 used_memory_rss_human:13.18G used_memory_peak:5176474576 used_memory_peak_human:4.82G 请问老师,我该怎么执行碎片整理。这是生产环境,比较重要。因为内存马上不够用了。
    共 12 条评论
    6
  • dfuru
    2020-10-08
    分配的物理空间小于申请的空间,发生swap,严重降低读写性能
    
    4