Slab Allocation机制:整理内存以便重复使用
最近的memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。
在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。
但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下,
会导致操作系统比memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。
也就是说,Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,
以完全解决内存碎片问题。
Slab Allocation的原理相当简单。 将分配的内存分割成各种尺寸的块(chunk),
并把尺寸相同的块分成组(chunk的集合)(图1)。

图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,
然后将数据缓存于其中。

图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”,这进一步确认了这是一个特定版本的缓存解决方案。尽管描述内容简洁,但我们可以推测它可能涉及到一个用于存储和检索PHP应用程序中常用数据的内存对象缓存系统。 标签...
默认情况下,Memcached运行在127.0.0.1的11211端口上,如果服务器配置不同,需要相应调整。 接下来,我们可以使用`set`方法将数据上传到Memcached。这个方法接受四个参数:键(key),值(value),过期时间(time...
membercached要用到的dll和基础使用范例。
在Linux环境下,使用Memcached实现Tomcat集群的session复制是一个常见的解决方案,以提高应用的可扩展性和高可用性。Memcached是一种分布式内存对象缓存系统,它可以存储包括session在内的临时数据,使得多个服务器...
此工具可自动在网站目录下生成底层数据库操作类,功能包括 M_表名 1,GetModel($id) $id可以是主键值也可以是where查询条件 1, 插入数据 Add() 2, 更新数据 Edit() 3, SetDefault(),设置默认值 4, Bind...
标题中的“Nginx+Tomcat6+Memcached 实现负载均衡”涉及到的是一个常见的Web服务器和应用服务器的架构组合,用于提高系统性能和可扩展性。在这个架构中,Nginx作为反向代理和负载均衡器,Tomcat6是Java应用服务器,...
下载分设置的比较高,不过绝对的...为了在接下来的项目中能够方便的控制和使用 redis,所以也粗略的模仿了下membercache的aop代码,写了一份spring-redis-aop。当然方法有很多种,也许你有更好的 使用方法当然更好哈。
通过这些jar包的集成,我们可以构建出一个高效的、基于Memcached的session管理解决方案,使得在nginx负载均衡下运行的Tomcat 7应用能充分利用Memcached进行session数据的存储和共享,从而提高系统的整体性能和可靠性...
分布式缓存是现代大型互联网应用中的重要组成部分,它能够有效地解决数据访问的性能瓶颈问题,尤其是在高并发场景下。本文将深入探讨“分布式缓存1.0”版本,特别是其集成的哈希分布算法,以及后续规划的读写分离和...