数据删除后,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.
在留言里没有看到老师的身影(“作者回复”),爱总结的非凡哥也不见了,只有课代表还在。
启用碎片整理的时候报错
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
请问老师,我该怎么执行碎片整理。这是生产环境,比较重要。因为内存马上不够用了。