作者:IDC小林 | 来源:互联网 | 2024-12-22 13:10
本文深入探讨了Memcached的内存管理机制,特别是其采用的SlabAllocator技术。该技术通过预分配不同大小的内存块来有效解决内存碎片问题,并确保高效的数据存储与检索。文中详细描述了SlabAllocator的工作原理、内存分配流程以及相关的优化策略。
1. Memcached采用了一种名为Slab Allocator的内存管理机制,其主要工作方式如下:
①:将整个内存划分为多个Slab类,每个Slab类的大小是预先定义好的,旨在避免内存碎片化。每个Slab由一个或多个Page组成,默认每个Page的大小为1MB。
②:每个Page进一步细分为多个chunk,这些chunk用于存储缓存记录。chunk的初始大小有一个基准值,并根据增长因子逐步增加。
③:Slab Class表示内存区类别(从48字节到1MB),每个类别都有一个唯一的Slab Class ID。
④:Memcached维护着每个Slab内空闲chunk的列表。当接收到保存数据项的请求时,系统会根据item的大小选择最合适的Slab,并找到可用的空闲chunk进行存储。
2. 数据项内存分配过程:
①:首先计算item的总长度,包括键长、标志位、后缀和值的长度。如果item的总大小超过1MB,则无法存储并被丢弃。系统会选择最小冗余的Slab Class,例如48字节、96字节等。
3. 查找可用chunk的过程:
①:检查slab回收空间slot中是否有剩余chunk。删除操作会将item标记为可回收状态。
②:检查page中是否有剩余chunk。
③:如果内存仍有剩余空间,可以开辟新的slab。
④:使用LRU(最近最少使用)算法释放过期或较少使用的对象的空间。
4. Slab Allocator的局限性:
由于chunk的大小是预先固定的,如果数据不能完全填满chunk,那么剩余的空间就会浪费掉。
5. Lazy Expiration(延迟过期):
Memcached不会主动监控数据是否过期,而是在外部获取数据时才检查记录的时间戳,因此称为Lazy Expiration。
6. LRU(最近最少使用)算法:
当内存不足时,Memcached优先使用已过期的数据空间;若仍不够,则释放最近最少使用的对象的空间。
7. 懒惰删除机制:
删除item时不立即释放内存,而是将其标记为已删除,并将指针放入回收插槽,以便下次分配时直接复用。
注意:Memcached的LRU机制不是全局的,而是针对每个Slab的,即所谓的区域LRU。