zoukankan      html  css  js  c++  java
  • redis采用tcmalloc导致无法释放内存的问题

    from:http://wangneng-168.iteye.com/blog/2100379

    redis使用tcmalloc管理内存,当删除了rediskey后,通过redisinfo命令查看内存使用情况,发现内存并没有释放,但是采用默认的jemalloc就不会有这个问题

    以下是采用tcmalloc后删除key前和删除key后通过info看到的内存情况:

        删除key前:

        used_memory:13051400

    used_memory_human:12.45M

    used_memory_rss:16326656

    used_memory_peak:13051400

    used_memory_peak_human:12.45M

    used_memory_lua:33792

    mem_fragmentation_ratio:1.25

    mem_allocator:tcmalloc-2.0

     

    删除key

    used_memory:835080

    used_memory_human:815.51K

    used_memory_rss:16392192

    used_memory_peak:13051400

    used_memory_peak_human:12.45M

    used_memory_lua:33792

    mem_fragmentation_ratio:19.63

    mem_allocator:tcmalloc-2.0

     

     

    以下是采用jemalloc后删除key前和删除key后通过info看到的内存情况:

           删除key前:

      used_memory:13047176

    used_memory_human:12.44M

    used_memory_rss:14704640

    used_memory_peak:13047176

    used_memory_peak_human:12.44M

    used_memory_lua:33792

    mem_fragmentation_ratio:1.13

    mem_allocator:jemalloc-3.6.0

     

    删除key

    used_memory:830696

    used_memory_human:811.23K

    used_memory_rss:2318336

    used_memory_peak:13047176

    used_memory_peak_human:12.44M

    used_memory_lua:33792

    mem_fragmentation_ratio:2.79

    mem_allocator:jemalloc-3.6.0

     

    从结果看,删除大量的key后,采用jemallocredis分配的内存缩减为大约2M,而tcmalloc没有变化

    TcMalloc的原理参看:

    http://wenku.baidu.com/link?url=pzXI4OTNuoNGPKQ9MtKOX_60adNREkVe5m94QNuZMj0bsgCaxodpcVOLChWD4bjAgAQBSRNn2aCXzne9Mp4fShzm2a-Oxt02ohmbyrhcblW

    其中提到:目前的tcmalloc版本不会把任何内存返还给操作系统,可见采用tcmalloc时redis实例占用的内存与redis使用内存的峰值有关

    JeMalloc的原理可以参看:

    http://club.alibabatech.org/article_detail.htm?articleId=36

    其中提到:

    回收流程大体和分配流程类似,有tcache机制的会将回收的块进行缓存,没有tcache机制的直接回收(不大于chunk的将对应的page状态进行修改,回收对应的run;大于chunk的直接munmap)。需要关注的是jemalloc何时会将内存还给操作系统,因为ptmalloc中存在因为使用top_chunk机制(详见华庭的文章)而使得内存无法还给操作系统的问题。目前看来,除了大内存直接munmapjemalloc还有两种机制可以释放内存:

           1.   当释放时发现某个chunk的所有内存都已经为脏(即分配后又回收)就把整个chunk释放;

           2.   arena中的page分配情况满足一个阈值时对dirty page进行purge(通过调用madvise来进行)。这个阈值的具体含义是该arena中的dirty page大小已经达到一个chunk的大小且占到了active page1/opt_lg_dirty_mult(默认为1/32)。active page的意思是已经正在使用中的runpage,而dirty page就是其中已经分配后又回收的page

           上述两种机制保证了jemalloc不会出现类似ptmalloc中的内存无法交还给操作系统的问题

     

       结论:慎用tcmalloc,采用jemalloc就好。

  • 相关阅读:
    HDU3336 Count the string —— KMP next数组
    CodeForces
    51Nod 1627 瞬间移动 —— 组合数学
    51Nod 1158 全是1的最大子矩阵 —— 预处理 + 暴力枚举 or 单调栈
    51Nod 1225 余数之和 —— 分区枚举
    51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP
    51Nod 机器人走方格 V3 —— 卡特兰数、Lucas定理
    51Nod XOR key —— 区间最大异或值 可持久化字典树
    HDU4825 Xor Sum —— Trie树
    51Nod 1515 明辨是非 —— 并查集 + 启发式合并
  • 原文地址:https://www.cnblogs.com/94cool/p/5619168.html
Copyright © 2011-2022 走看看