`
无尘道长
  • 浏览: 160751 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

redis采用tcmalloc导致无法释放内存的问题

阅读更多

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

分享到:
评论

相关推荐

    浅谈redis采用不同内存分配器tcmalloc和jemalloc

    碎片是由于内存分配和释放不连续导致的空间浪费,可能导致Redis性能下降。tcmalloc和jemalloc都采用了不同的策略来降低碎片,比如tcmalloc的线程本地分配器和jemalloc的arena机制。然而,碎片管理并非万无一失,定期...

    通过Key前缀分析Redis的内存占用按内存大小排序导出结果到csv文件

    然而,随着数据的增长,如何有效管理和优化Redis的内存使用成为了关键问题。本篇文章将围绕“通过Key前缀分析Redis的内存占用并按内存大小排序导出结果到csv文件”这一主题,详细介绍相关的技术知识点。 首先,我们...

    如何监控mysql,redis运行状况(CPU,内存)

    监控MySQL和Redis的运行状况是系统运维的重要环节,它可以帮助我们及时发现和解决问题,防止性能瓶颈和故障的发生。结合使用Prometheus和Grafana这样的现代监控工具,可以提供全面、可视化的监控体验,提高系统的...

    redis内存模型介绍

    **Redis** 是一款高性能的键值对存储系统,它采用内存作为主要存储介质,并提供了丰富的数据结构支持,包括字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)以及有序集合(Sorted Sets)等。这些数据类型不仅...

    redis内存数据库2.4.1

    然而,内存数据库也意味着数据易失性,为了解决这个问题,Redis提供了持久化机制,包括RDB(快照)和AOF(Append Only File)。在2.4.1版本中,RDB会在特定时间点或接收到特定命令时生成数据快照,而AOF则是记录每次...

    redis_3.2.9_内存分布分析

    在Redis内存分布分析中,涉及到的核心知识点包括Redis的数据结构存储、数据类型操作、内存管理机制以及命令执行过程解析。 首先,我们来了解Redis的数据结构存储。Redis作为一个高性能的键值存储系统,其内部通过...

    redis之相关理解分析以及面试问题总结

    - Redis的内存溢出问题:可以通过限制Redis的最大内存、配置内存淘汰策略或优化数据结构来防止内存溢出。 4. 高级特性: - Redis Cluster:Redis的分布式解决方案,通过分片提供高可用性和水平扩展能力。 - ...

    Redis内存过期策略

    - 如果过期键长时间未被访问,可能会占用内存较长时间,导致内存泄漏问题。 ##### 3.2 定时任务删除 Redis还通过**定时任务**的方式来检查和删除过期键,以弥补惰性删除可能存在的问题。这一机制基于自适应算法,...

    Redis数据模型深度剖析:内存中的数据艺术

    2. **持久化**:尽管 Redis 是一个内存数据库,但它提供了持久化机制,可以将内存中的数据保存到磁盘,防止数据丢失。 3. **支持事务**:Redis 支持简单的事务功能,可以保证操作的原子性。 4. **丰富的数据类型**:...

    内存碎片的产生

    5. **智能内存管理库**:利用如jemalloc、tcmalloc等高效的内存管理库,它们在设计时就考虑了碎片问题,能够优化内存分配过程。 总的来说,内存碎片是一个复杂的问题,需要从系统设计、内存管理策略和编程实践中...

    美团在Redis上踩过的一些坑-3.redis内存占用飙升

    在使用Redis的过程中,他们遇到了一些问题,特别是关于Redis内存占用飙升的问题。下面我们将深入探讨这个问题以及可能的解决方案。 Redis内存占用飙升的原因多种多样,可能是由于以下几点: 1. **数据结构不当**:...

    Redis 服务等过期策略和内存淘汰策略解析

    Redis 服务等过期策略和内存淘汰策略解析

    redis container 问题梳理

    总之,面对Redis容器问题,我们需要从多个维度进行排查和优化,包括但不限于内存管理、命令优化、网络调整、并发控制以及源码分析。同时,利用各种工具进行监控和诊断,有助于我们更好地维护和提升Redis的服务质量。

    内存数据库redis

    Redis,全称Remote Dictionary Server,是一款高性能的键值数据库,主要以内存为数据存储介质,同时支持持久化,确保在系统重启后数据的恢复。它以其高速读写能力、丰富的数据结构以及灵活的数据操作特性,在分布式...

    redis校验工具redis-full-check

    2. **键过期检查**:检查已过期但仍在内存中的键,这可能是由于 Redis 的过期策略未正确执行导致的。 3. **内存分析**:分析 Redis 内存使用情况,包括内存碎片率,帮助优化内存配置。 4. **持久化检查**:验证 ...

    查看Redis内存信息的命令

    这些指标有助于理解Redis在运行过程中的内存消耗趋势,以及是否存在内存泄漏等问题。 除了`info memory`,还有其他命令可以帮助获取更具体的内存信息: 1. `dbsize`: 通过`redis-cli dbsize`可以查看当前数据库中...

    解决Redis连接无法正常释放的问题

    错误信息: IllegalStateException: Invalidated object not currently part of this...在网上查了很多同类错误,都说是进行了两次returnResource释放连接资源造成的,因为第一次return成功以后,第二次return就会报上

    RedisStudio Redis监控工具

    1. **图形化界面**: RedisStudio采用直观的图形界面,使得Redis的命令操作变得简单,适合初学者快速上手。 2. **连接管理**: 支持添加、编辑和删除多个Redis服务器连接,方便管理多个Redis实例。 3. **数据浏览与...

Global site tag (gtag.js) - Google Analytics