写点什么

Redis 内存碎片清理

用户头像
escray
关注
发布于: 2021 年 03 月 27 日
Redis 内存碎片清理

Redis 内存碎片清理,《Redis 核心技术与实战》学习笔记 12,部分已经作为留言发布,但是留言太多,排在后面的一般很难被大家看到,所以集中发布在这里,欢迎讨论。


题图来自极客时间《Redis 核心技术与实战》专栏

20 | 删除数据后,为什么内存占用率还是很高?


数据删除后,Redis 释放的内存空间由内存分配器管理,不会立刻返回给操作系统。


再加上内存碎片的问题,感觉是因为 Redis 是使用 C 语言实现的,如果是在 JVM 上,内存管理就不会成为棘手的问题了,当然性能上 JVM 比起 C 语言来还是有不少劣势。


其实 Redis 清理内存碎片的方式和 JVM 的内存管理也很类似,如果只看题图,会不会误以为是 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.


在留言里没有看到老师的身影(“作者回复”),爱总结的非凡哥也不见了,只有课代表还在。

21 | 缓冲区:一个可能引发“惨案”的地方


Redis 原本就是当做缓存在用,然后它又有自己的缓冲区,果然是应了那句话,在计算机领域,没有什么问题是加一层缓存解决不了的。


直接跳到课后问题,应用程序和 Redis 实例交互时,应用程序客户端应该也会使用缓冲区,对于 Redis 的性能和内存同样会有影响。如果不想造成缓冲区溢出那么也需要设置合理的缓冲区参数,以及设置合理的读写速率。

22 | 第 11~21 讲课后思考题答案及常见问题答疑


看了一下课后题的解答,可能我错的最离谱就是 Redis 的写操作是否在关键路径上,老师的答案是在关键路径上。


对比自己的想法、课代表的答案和老师的解释,我觉的老师说的更合理一些。


和上次答疑同样,我比较喜欢这种回顾的方式,对于专栏第二个部分 Redis 的数据结构和性能诊断算是有了初步的了解。


看到有同学说在数据量小的时候可以考虑在 Sorted Set 上做聚合计算,作为小白,有点怀疑,如果数据量小,那么在哪里做聚合计算应该都可以,毛毛雨……


发布于: 2021 年 03 月 27 日阅读数: 12
用户头像

escray

关注

Let's Go 2017.11.19 加入

在学 Elasticsearch 的项目经理

评论

发布
暂无评论
Redis 内存碎片清理