Memory management Redis内存碎片小于1的原因
Redis支持3个内存分配器:libc、jemalloc、tcmalloc。当我进行内存使用测试时,我发现使用libc分配器,INFO memory中的mem\u碎片率可能小于1。对于jemalloc或tcmalloc,此值应大于或等于1 有人能解释为什么libc的内存碎片化率小于1吗 Redis版本:2.6.12。CentOS 6 更新: 我忘了提到一个可能的原因是交换发生了,mem\u-fragmentation\u比率将<1Memory management Redis内存碎片小于1的原因,memory-management,redis,glibc,Memory Management,Redis,Glibc,Redis支持3个内存分配器:libc、jemalloc、tcmalloc。当我进行内存使用测试时,我发现使用libc分配器,INFO memory中的mem\u碎片率可能小于1。对于jemalloc或tcmalloc,此值应大于或等于1 有人能解释为什么libc的内存碎片化率小于1吗 Redis版本:2.6.12。CentOS 6 更新: 我忘了提到一个可能的原因是交换发生了,mem\u-fragmentation\u比率将
但当我做测试时,我会调整互换性,甚至关闭互换。结果是一样的。我的redis实例实际上不需要太多内存 通常,与libc-malloc相比,使用jemalloc或tcmalloc的碎片更少。这是由4个因素造成的:
- 针对jemalloc和tcmalloc的更细粒度的分配类。它减少了内部碎片,特别是当Redis必须分配大量非常小的对象时
- 更好的算法和数据结构,以防止外部碎片(尤其是jemalloc)。显然,收益取决于你的长期记忆分配模式
- 支持“malloc大小”。一些分配器提供API来返回分配内存的大小。对于glibc(Linux),malloc没有这种功能,因此可以通过向每个分配的内存块显式添加额外的前缀来模拟它。它增加了内部碎片。对于jemalloc和tcmalloc(或者对于BSD-libc-malloc),不存在这样的问题 头顶
- jemalloc(和tcmalloc,有一些设置更改)可以比glibc更积极地向操作系统释放内存,但这又取决于分配模式
换句话说,只有当您确定Redis内存没有被操作系统调出时,此比率才相关(如果不是这样,您无论如何都会有性能问题)。除了调出,我知道两种方法可以使“内存碎片比率”小于1:
repl backlog大小
。8 GB的内存将在复制开始时分配(仅在master上用于版本my Error。我检查此项时忘了提到确实没有交换操作。请将RSS的值与已用内存进行比较。如果RSS<已用内存,则表示某些内存已被交换。除此之外,该比率不能低于1。