memcached的内存分配没有用到c语言中自带的malloc函数,因为这个函数分配内存的时候效率很低,对于这种要求快速响应,对效率要求非常高的缓存软件来说非常不合适。
memcached用的是自己的一套内存分配方法,叫做slab allocation,如下图:
Slab Allocation的原理相当简单,就是将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合),每个组分别存放于各个slab仓库里。
Slab Allocation缓存原理:
memcached根据收到数据的大小,选择最合适数据大小的slab
memcached中保存着slab内空闲chunk的列表
根据该列表选择chunk,然后将数据缓存与其中
Memcached内存管理:
1.内存的碎片化
如果用C语言直接malloc,free来向操作系统申请和释放内存时,在不断的申请和释放过程中,形成了一些很小的内存片断,无法再使用,这种空闲,但无法利用的内存现象,称为内存的碎片化
2.memcache是如何克服内存的碎片化的?
memcached用slab allcoator机制来管理内存
基本原理:预告把内存划分成数个slab仓库,各仓库切分成不同尺寸的小块(chunk),需要内存时,判断内存的大小,为其选取合理的块
警示:
如果有100byte的内容要存,但是122大小的仓库中的chunk满了,这时memcached不会去找更大的chunk去存储,而是把122仓库的旧数据踢掉
3.对于固定大小的chunk,也会有浪费的,如何缓解
对于特定的网站,可以长期的统计网站内缓存数据,按照网站的特点,设置chunk的大小(-n)
4.一般而言,观察缓存数据大小的变化规律,设置合理的增长因子(-f),Grow factor,默认是1.25倍
总结:
**一个memcahced进程会预先将自己划分为若干个slab,slab得数量是有限的,跟进程配置的内存无关,跟-f(增长因子),-I(page大小:page ressign已经从1.2.8版移除了),-n(初始chunk大小)有关。
**slab的数量最大是200(当指定-f 1.0001)时,增长因子越大,slab越少,-f 不能小于1。
**可以通过-I指定page的大小,单位是byte,page默认是1M,最小需要1024byte, page值设置的越大slab越多。(已作废)
**-n(最小分配空间):默认是48,此时初始chunk的大小是96,(注意并不是2倍的关系,当设置为50时,第一个chunk的大小是104),-n越大slab越少。