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就好。

  • 相关阅读:
    使用kindeditor获取不到富文本框中的值
    ASP.NET中的文件操作(文件信息,新建,移动,复制,重命名,上传,遍历)
    2018 遇到selenium.common.exceptions.WebDriverException问题
    DataTable与实体类互相转换
    反射load,loadfile,LoadFrom区别
    DbSet.Attach(实体)与DbContext.Entry(实体).State = EntityState.Modified 区别
    .net 面试总结
    C# Linq 常用查询操作符
    windows下nginx的安装及使用
    熊猫热土-环汶川50公里越野赛赛记
  • 原文地址:https://www.cnblogs.com/94cool/p/5619168.html
Copyright © 2011-2022 走看看