`

MemCached的内存管理机制

阅读更多

MemCached使用了有优化的内存管理方式,使得对象的内存分配效率有很大程度上的提高。

 

1.传统的内存管理方式的缺点


传统的内存分配使用mallocate方法向OS申请内存,内存不再使用时,使用free方法,释放内存给OS。这种方式简单,但是有以下缺点:

1.频繁的跟OS打交道,增加了OS的工作

2.容易产生内存碎片。

当内存不再使用free内存给操作系统,当分配的对象很多时候如1byte,或者几个byte大小的内存块,这些内存块在多数情况下,是不能被使用的,因为大部分对象是大于这个碎片内存大小的,这些不规整的内存块,导致内存分配效率变差,当有新的内存需要分配时,OS必须采用遍历的方式,找到可以分配的内存的地方,碎片越多,找到的速度越慢,分配的速度也越慢。


2.MemCached的内存管理方式

 

MemCached采用预先分配和分组的方式进行内存管理,最小的内存申请大小为一个slab,默认大小为1M。

 

Slab是一个内存块,它是memcached一次申请内存的最小单位。在启动memcached的时候一般会使用参数-m指定其可用内存,但是并不是在启动的那一刻所有的内存就全部分配出去了,只有在需要的时候才会去申请,而且每次申请一定是一个slab。Slab的大小固定为1M(1048576 Byte),一个slab由若干个大小相等的chunk组成。每个chunk中都保存了一个item结构体和一对key和value。

 

假定i代表分类,class i的计算公式如下:
chunk size(class i)=(default_size+item_size)*f^(i-1)+ CHUNK_ALIGN_BYTES

*  default_size: 默认大小为48字节,也就是memcached默认的key+value的大小为48字节,可以通过-n参数来调节其大小;
*  item_size: item结构体的长度,固定为32字节。default_size大小为48字节,item_size为32,因此class1的chunk大小为48+32=80字节;
*  f为factor,是chunk变化大小的因素,默认值为1.25,调节f可以影响chunk的步进大小,在启动时可以使用-f来指定;
*  CHUNK_ALIGN_BYTES是一个修正值,用来保证chunk的大小是某个值的整数倍(在32位机器上要求chunk的大小是4的整数倍)。

从上面的分析可以看到,我们实际可以调节的参数有-f、-n,在memcached的实际运行中,我们还需要观察我们的数据特征,合理的调节f,n的值,使我们的内存得到充分的利用减少浪费。

 

Memcached内存管理采取预分配、分组管理的方式,分组管理就是我们上面提到的slab class,按照chunk的大小slab被分为很多种类。下面解释一下memcached的内存预分配过程。
向memcached添加一个item时候,memcached首先会根据item的大小,来选择最合适的slab class:例如item的大小为190字节,默认情况下class 4的chunk大小为160字节显然不合适,class 5的chunk大小为200字节,大于190字节,因此该item将放在class 5中(显然这里会有10字节的浪费是不可避免的),计算好所要放入的chunk之后,memcached会去检查该类大小的chunk还有没有空闲的,如果没有,将会申请1M(1个slab)的空间并划分为该种类chunk。例如我们第一次向memcached中放入一个190字节的item 时,memcached会产生一个slab class 2(也叫一个page),并会用去一个chunk,剩余5241个chunk供下次有适合大小item时使用,当我们用完这所有的5242个chunk之后,下次再有一个在160~200字节之间的item添加进来时,memcached会再次产生一个class 5的slab(这样就存在了2个pages)。查看slab的使用情况,我们可以telnet ip port,然后输入命令 stats slabs即可:
例如:telnet 10.0.4.210 11211

stats slabs
STAT 5:chunk_size 200
STAT 5:chunks_per_page 5242
STAT 5:total_pages 1
STAT 5:total_chunks 5242
STAT 5:used_chunks 5242
STAT 5:free_chunks 0
STAT 5:free_chunks_end 5241
STAT active_slabs 1
STAT total_malloced 1048400

上面显示的是第一次放入一个190字节的item之后的统计结果。

 

 

  • 大小: 38.4 KB
分享到:
评论
1 楼 harbey 2011-09-27  
分析得很好!多谢!

相关推荐

    计算机后端-PHP视频教程. Memcached12 memcached内存管理机制.wmv

    计算机后端-PHP视频教程. Memcached12 memcached内存管理机制.wmv

    Memcached内存分配与SLAB机制

    SLAB机制是Memcached内存管理的关键组成部分,它通过一种特殊的缓存机制来存储item数据。这种机制能够有效地提高内存利用率并减少内存碎片,从而提高系统的整体性能。 **SLAB机制概述:** - **SLAB(Class)定义**...

    29道memcached面试题含答案(很全)

    6. Memcached内存管理机制原理: - Slab Allocation:内存被划分为多个大小固定的块(slabs),每个slab包含多个chunk(数据存储单元)。同一slab的chunk大小相同,避免了内存碎片,简化了内存分配与释放。 ...

    Memcached 内存分析、调优、集群

    - **内置内存管理机制**:包括slab和LRU算法。 许多知名的互联网公司都在使用Memcached,如LiveJournal、Facebook、mixi、Digg、Wikipedia等。例如,Facebook使用了超过200台Memcached服务器,每台配置有16GB的四核...

    Memcached内存分析、调优、集群

    ### Memcached内存分析、调优、集群:深入理解与实践 #### 1. Memcached背景与概述 Memcached是一款高性能的分布式内存缓存服务器,它最初由LiveJournal的运营人员开发,现已成为开源社区中不可或缺的一部分。其...

    Memcached、Redis、MySQL存储层面试问题

    4. 简述Memcached内存管理机制原理? Memcached使用slab allocation机制来管理内存,每个slab分配一个固定的内存大小,用于存储对象。 5. Memcached是怎么工作的? Memcached服务器可以接受客户端的请求,检查缓存...

    Memcache 面试题 23道.pdf

    Memcached 内存管理机制原理: 早期的 Memcached 内存管理方式是通过 malloc 的分配的内存,使用完后通过 free 来回收内存,这种方式容易产生内存碎片,并降低操作系统对内存的管理效率。为了解决这个问题,Slab ...

    memcached面试26题和答案

    #### Memcached内存管理机制 - **早期机制**: 基于malloc/free的内存管理,可能导致内存碎片问题。 - **改进方案**: 引入Slab Allocation机制。 - **Slab Allocation**: 将内存分割成多个固定大小的“slab class”...

    寻找我们丢失的数据

    ### 寻找我们丢失的数据——深入理解Memcached内存管理机制 #### 一、故事的开始 在日常工作中,经常会遇到由于各种原因导致的数据丢失问题。本文将以一个具体案例出发,探讨如何有效地解决这类问题,特别是在使用...

    Memcached内存分配与SLAB机制[借鉴].pdf

    总的来说,Memcached的SLAB机制是其高效运行的关键,它通过精细的内存管理,确保了在高并发场景下的快速响应和低延迟。理解和掌握这一机制对于优化Memcached的性能以及在实际应用中合理配置参数至关重要。

    Memcached内存分析、调优、集群.ppt

    在内存管理方面,Memcached采用了slab分配器机制。Slab是一种预分配内存的策略,将内存分为多个大小固定的块,称为slabs。每个slab由多个page组成,每个page又包含若干个item。这种设计减少了内存碎片,提高了内存...

    memcached的内存分配代码

    在Memcached中,内存管理是至关重要的,因为它直接影响到服务的性能和效率。memcached采用了一种特殊的内存分配策略,名为Slab Allocation,以避免频繁的内存碎片和提高内存利用率。 1. Slab Allocation原理: ...

    Memcached内存分析、调优、集群.pdf

    ### Memcached内存分析、调优、集群 #### 一、Memcached背景介绍 Memcached是一款高性能的分布式内存对象缓存系统,它通过减轻数据库负担来加速动态Web应用程序的速度。最初由LiveJournal的开发者Brad Fitzpatrick...

    PHP内存缓存技术memcached 的安装和工作原理介绍

    4. **内存管理**:memcached管理内存空间,当内存不足时,会使用LRU(Least Recently Used)策略自动删除最近最少使用的数据。 5. **非持久化存储**:由于数据存储在内存中,一旦服务器重启,所有数据将丢失。因此,...

    Java面试题之面试被问到Java组件实现原理时,该可以从哪些角度回答

    通过对Memcached内存管理机制Slab Allocator的理解,可以分析出是因为内存分配策略导致的高剔除率。这表明,了解组件的实现原理能够帮助定位和解决实际问题,避免盲目优化。 总结起来,面试官询问组件实现原理并非...

    ydx_slab_util:实现一个内存池,内存管理机制借鉴memcached,使用一系列链表管理不同大小的内存区块

    ydx_slab_util实现一个内存池,内存管理机制借鉴memcached,使用一系列链表管理不同大小的内存区块。memcached一次分配(默认64M)固定大小的内存区域,使用完毕后使用LRU淘汰最早不使用的内存段。作为一个通用内存池...

    Memcached存储机制 测试

    总结,Memcached以其高效的内存管理和快速的键值操作,成为许多高并发场景下的首选缓存解决方案。通过理解其存储机制,我们可以更好地利用它来优化我们的应用程序,提高服务性能。在实际应用中,根据业务需求,还...

    Memcached缓存机制 用好Cache,优化应用

    **Memcached缓存机制详解与应用优化** Memcached是一款高性能、分布式的内存对象缓存系统,主要用于加速Web应用程序,通过将数据存储在内存中,减少对数据库的直接访问,从而提高系统的响应速度和效率。Memcached的...

Global site tag (gtag.js) - Google Analytics