`
zy116494718
  • 浏览: 477788 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MemberCache学习(下)

 
阅读更多

Slab Allocation机制:整理内存以便重复使用

最近的memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。 在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。 但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下, 会导致操作系统比memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。

 

也就是说,Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块, 以完全解决内存碎片问题。

Slab Allocation的原理相当简单。 将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合)(图1)。

memcached-0002-01.png

图1 Slab Allocation的构造图

 

而且,slab allocator还有重复使用已分配的内存的目的。 也就是说,分配到的内存不会释放,而是重复利用。

Slab Allocation的主要术语

Page

分配给Slab的内存空间,默认是1MB。分配给Slab之后根据slab的大小切分成chunk。

Chunk

用于缓存记录的内存空间。

Slab Class

特定大小的chunk的组。

 

在Slab中缓存记录的原理

下面说明memcached如何针对客户端发送的数据选择slab并缓存到chunk中。

memcached根据收到的数据的大小,选择最适合数据大小的slab(图2)。 memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk, 然后将数据缓存于其中。

memcached-0002-02.png

图2 选择存储记录的组的方法

实际上,Slab Allocator也是有利也有弊。下面介绍一下它的缺点。

 

Slab Allocator的缺点

Slab Allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。

这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。 例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了。

 

 

Lazy Expiration

memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。 这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。

 

LRU:从缓存中有效删除数据的原理

memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况, 此时就要使用名为 Least Recently Used(LRU)机制来分配空间。 顾名思义,这是删除“最近最少使用”的记录的机制。 因此,当memcached的内存空间不足时(无法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。 从缓存的实用角度来看,该模型十分理想。

 

 

分享到:
评论

相关推荐

    membercache-5.2

    在描述中同样提到了“membercache-5.2”,这进一步确认了这是一个特定版本的缓存解决方案。尽管描述内容简洁,但我们可以推测它可能涉及到一个用于存储和检索PHP应用程序中常用数据的内存对象缓存系统。 标签...

    Python memcache 上传数据

    默认情况下,Memcached运行在127.0.0.1的11211端口上,如果服务器配置不同,需要相应调整。 接下来,我们可以使用`set`方法将数据上传到Memcached。这个方法接受四个参数:键(key),值(value),过期时间(time...

    memcached的使用

    membercached要用到的dll和基础使用范例。

    linux下用memcache做tomcat集群session复制

    在Linux环境下,使用Memcached实现Tomcat集群的session复制是一个常见的解决方案,以提高应用的可扩展性和高可用性。Memcached是一种分布式内存对象缓存系统,它可以存储包括session在内的临时数据,使得多个服务器...

    PHP代码生成器2.0(memcache)修正版

    此工具可自动在网站目录下生成底层数据库操作类,功能包括 M_表名 1,GetModel($id) $id可以是主键值也可以是where查询条件 1, 插入数据 Add() 2, 更新数据 Edit() 3, SetDefault(),设置默认值 4, Bind...

    Nginx+Tomcat6+Membercached 实现负载均衡

    标题中的“Nginx+Tomcat6+Memcached 实现负载均衡”涉及到的是一个常见的Web服务器和应用服务器的架构组合,用于提高系统性能和可扩展性。在这个架构中,Nginx作为反向代理和负载均衡器,Tomcat6是Java应用服务器,...

    redis集成spring实现aop

    下载分设置的比较高,不过绝对的...为了在接下来的项目中能够方便的控制和使用 redis,所以也粗略的模仿了下membercache的aop代码,写了一份spring-redis-aop。当然方法有很多种,也许你有更好的 使用方法当然更好哈。

    nginx+tomcat7+memcached所需jar

    通过这些jar包的集成,我们可以构建出一个高效的、基于Memcached的session管理解决方案,使得在nginx负载均衡下运行的Tomcat 7应用能充分利用Memcached进行session数据的存储和共享,从而提高系统的整体性能和可靠性...

    分布式缓存1.0

    分布式缓存是现代大型互联网应用中的重要组成部分,它能够有效地解决数据访问的性能瓶颈问题,尤其是在高并发场景下。本文将深入探讨“分布式缓存1.0”版本,特别是其集成的哈希分布算法,以及后续规划的读写分离和...

Global site tag (gtag.js) - Google Analytics