taoCMS是基于php+sqlite/mysql的国内最小(100Kb左右)的功能完善的CMS管理系统

Memcache内部slab与item的内存分配

2014-02-27

1.Item数据格式

    Item是保存在chunk中的实际数据

    

2.新建Item分配内存过程

快速定位slab classid
计算key+value+suffix+32结构体,如90byte
如果>1MB,无法存储丢弃
取最小冗余的slab class
如:有48,96,120,存90会选择96


按顺序寻找可用chunk
slot:检查slab回收空间slot里是否有剩余chunk
delete:delete时标记到slot
exptime:get时检查的过期对象标记到slot
end_page_ptr:检查page中是否有剩余chunk
memory:内存还有剩余则开辟新的slab
LRU:Slab内部扫描Item双向链表50次

1.slab内存结构图:二维数组链表

slab是一次申请内存的最小单位



2.slab内存分配实例


3.实例数据

             

4.计算slab占用内存



5.slab参数

进程内存区
slabclass元信息:1.1中是21byte,1.2中是200byte
Hashtable:1.1中位41MB,1.2中位65MB


数据内存区
slab默认大小为1048576byte(1MB),大于1MB数据忽略
chunk初始大小,1.1中是1byte,1.2中是48byte


增长因子factor
1.1中,chunk大小为初始大小*2^n,n为classid,即:
id为0的slab大小1byte,id为1的slab大小2byte,id为2的slab大小4byte...
id为20的slab,每chunk大小为1MB,只有一个chunk
1.2中有一个factor值,默认为1.25
96,120,152...



Memcache
使用了Slab Allocator的内存分配机制:按照预先规定的大小,将分配的内存分割成特定长度的块,以

完全解决内存碎片问题

Memcache的存储涉及到slabpagechunk三个概念

1Chunk为固定大小的内存空间,默认为96Byte

2page对应实际的物理空间,1page1M

3.同样大小的chunk又称为slab

Memcached再启动的时候根据-n-f参数,产生若干slab。具体应用中Memcache每次申请1page,并将这1M空间分割成若干个chunk,这些chunk有着同样的大小,属于同一个slab

【添加】,通过memcache添加item的时候:

1  Memcache计算item的大小(key+value+flags,选取合适的slab(刚好能放下该itemslab

2  如果这个item对应的slab未出现过,则申请1page(注意,这1M空间不论是否达到memcached使用内存都可以申请成功)并加该item存入slab中的chunk

3  如果item对应的slab出现过,则在该slab中优先选择expiredfree_chunks)和delete(在1.2.2deletechunk存在着不能被重复利用的问题)的chunk进行存储,其次将选择未使用过的chunkfree_chunks_end)进行存储。

4  如果item对应的slab出现过,但是对应的slab已经存储满了,那么会申请一个新的page,这个page被分为对应大小的chunk,继续存储。

5  如果item对应的slab出现过,但是对应的slab已经存储满了并且memcache也达到了最大内存使用。将使用lru算法,清除item(可能将未过期的item清除)此时会有eviction++

【删除】:

1  Delete操作只是将该chunk置为删除状态,这样在下次使用将优先利用这样的chunk

flush

1  Flush操作相当于将所有的item失效的一个动作。并不会改变memcache内存分配情况。

一些注意

1. memcache已经分配的内存不会再主动清理。

2. memcache分配给某个slab的内存页不能再分配给其他slab

3. flush_all不能重置memcache分配内存页的格局,只是给所有的item置为过期。

4. memcache最大存储的item(key+value)大小限制为1M,这由page大小1M限制

5.由于memcache的分布式是客户端程序通过hash算法得到的key取模来实现,不同的语言可能会采用不同的hash算法,同样的客户端程序也有可能使用相异的方法,因此在多语言、多模块共用同一组memcached服务时,一定要注意在客户端选择相同的hash算法

6.启动memcached时可以通过-M参数禁止LRU替换,在内存用尽时addset会返回失败

7memcached启动时指定的是数据存储量,没有包括本身占用的内存、以及为了保存数据而设置的管理空间。因此它占用的内存量会多于启动时指定的内存分配量,这点需要注意。

8memcache存储的时候对key的长度有限制,phpC的最大长度都是250


类别:技术文章 | 阅读:244465 | 评论:0 | 标签:memcache slab item

想收藏或者和大家分享这篇好文章→

“Memcache内部slab与item的内存分配”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

taoCMS发布taoCMS 3.0.2(最后更新21年03月15日),请大家速速升级,欢迎大家试用和提出您宝贵的意见建议。

捐助与联系

☟请使用新浪微博联系我☟

☟在github上follow我☟

标签云