Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory management Redis内存碎片小于1的原因_Memory Management_Redis_Glibc - Fatal编程技术网

Memory management Redis内存碎片小于1的原因

Memory 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支持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比率将<1


但当我做测试时,我会调整互换性,甚至关闭互换。结果是一样的。我的redis实例实际上不需要太多内存

通常,与libc-malloc相比,使用jemalloc或tcmalloc的碎片更少。这是由4个因素造成的:

  • 针对jemalloc和tcmalloc的更细粒度的分配类。它减少了内部碎片,特别是当Redis必须分配大量非常小的对象时

  • 更好的算法和数据结构,以防止外部碎片(尤其是jemalloc)。显然,收益取决于你的长期记忆分配模式

  • 支持“malloc大小”。一些分配器提供API来返回分配内存的大小。对于glibc(Linux),malloc没有这种功能,因此可以通过向每个分配的内存块显式添加额外的前缀来模拟它。它增加了内部碎片。对于jemalloc和tcmalloc(或者对于BSD-libc-malloc),不存在这样的问题 头顶

  • jemalloc(和tcmalloc,有一些设置更改)可以比glibc更积极地向操作系统释放内存,但这又取决于分配模式

现在,怎么可能得到mem_fragmentation_ratio的不一致值呢

如中所述,mem_fragmentation_ratio值计算为进程的内存驻留集大小(RSS,由OS测量)与Redis使用分配器分配的总字节数之间的比率

现在,如果libc分配了更多内存(与jemalloc、tcmalloc相比),或者在基准测试期间系统上的其他进程使用了更多内存,那么操作系统可能会调出Redis内存。它将减少RSS(因为Redis内存的一部分将不再位于主内存中)。由此产生的碎片比率将小于1


换句话说,只有当您确定Redis内存没有被操作系统调出时,此比率才相关(如果不是这样,您无论如何都会有性能问题)。

除了调出,我知道两种方法可以使“内存碎片比率”小于1:

  • 有一个redis实例,它几乎没有数据,但有数千个空闲的客户端连接。从我的测试来看,redis似乎必须为每个客户端连接分配大约20KB的内存,但大部分内存直到稍后才会被实际使用(即不会出现在RSS中)


  • 有一个主从设置,比如8GB的
    repl backlog大小
    。8 GB的内存将在复制开始时分配(仅在master上用于版本my Error。我检查此项时忘了提到确实没有交换操作。请将RSS的值与已用内存进行比较。如果RSS<已用内存,则表示某些内存已被交换。除此之外,该比率不能低于1。