Redis 4 添加了主动内存碎片整理(来源:发行说明):
主动内存碎片整理。如果使用 Jemalloc 分配器(Linux 上的默认设置),Redis 能够在联机时对内存进行碎片整理。对于分配器无法将碎片保持足够低的工作负载很有用,因此唯一的可能性是 Redis 和分配器协作以对内存进行碎片整理。
在 Redis 5 中,该功能(现在称为版本 2)得到了改进:
来源 1:来自 Redis 主要开发者 Salvatore Sanfilippo 的推文
主动碎片整理版本 2。对正在运行的服务器的内存进行碎片整理是黑魔法,但 Oran Agra 改进了他过去的努力,现在它比以前效果更好。对于倾向于分散 Jemalloc 的长时间运行的工作负载非常有用。
资料来源 2:AWS 发布 Redis 5
上一版本的亮点之一是 Redis 获得了在线时对内存进行碎片整理的能力。它的工作方式非常巧妙:Redis 扫描键空间,并且对于每个指针,询问分配器是否将其移动到新地址有助于减少碎片。此版本附带所谓的主动碎片整理 2:它更快、更智能且延迟更低。此功能对于分配器无法将碎片保持足够低的工作负载特别有用,因此该策略是 Redis 和分配器共同协作。为此,必须使用 Jemalloc 分配器。幸运的是,它是 Linux 上的默认分配器。
问题:假设您已经在使用 Jemalloc,是否有任何理由不总是设置activedefrag yes
?
鉴于替代方法是重新启动实例以处理碎片(这是非常有问题的),并且鉴于我目前看到的 activedefrag 的开销似乎相当低,该选项似乎太有用了,默认情况下禁用。
或者在任何情况下它会损害性能?
当然,主动碎片整理有性能成本,但几乎总是可以忽略不计。虽然它在 OSS 发行版中默认禁用,但我们(Redis 实验室)已经在生产中使用了很长时间;)