内存分配机制Slab Allocation
本文参考博客:https://my.oschina.net/bieber/blog/505458
Memcached的内存分配是以slabs为单位的,会根据初始chunk大小、增长因子、存储数据的大小实际划分出多个不同的slabs class,slab class中包含若干个等大小的trunk和一个固定48byte的item信息。trunk是按页存储的,每一页成为一个page(默认1M)。
1.slabs、slab class、page三者关系:
slabs = slab Class1 + slab Class2 + ... + Slab Classn
sbal Class = trunkSize * trunkCount * pageCount
trunkCount = pageSize / trunkSize
trunkSize = 实际数据大小 + 48byte(items数据结构)
例:假定每个slab Class的page都是1,则Slab Class1 = 88byte * trunkCount * 1
启动memcached时用-vv参数key输出slabs信息,我们可以看到slabs的数据正是基于增长因子递增的,但是数据会略有误差~
2.实际数据的存储会选择合适的空间,比如我要存储一个52byte的数据,实际需要100byte空间
52+ 48 = 100byte,会将数据存储到112bytes所对应的slabls里,占用一个trunk
3.机制内存浪费问题:
优点:以前是内存分配机制是malloc~free,有内存碎片问题。此种机制解决了内存碎片问题
缺点:如果增长因子设置的不合适,可能造成空间的浪费问题。因为trunk的大小是固定的,只能是数据去适应trunk的大小(data <=trunk)
内存使用机制LRU
当memcached中的数据过期时,并非直接释放掉相关内存,因为没有响应的监听来处理这件事。flush_all也一样不会释放内存,只是这些失效数据对用户透明,用户无法检索到这些数据。Memcached已分配的内存不会进行回收操作,但是可以进行重利用操作。Memcached会优先使用已经过期的内存。当内存不足时,通过LRU机制将长期不使用的内存分配给新的记录。
注意:启动参数带-M的不支持LRU操作
常用监控
telnet命令行,直接操作stats、stats slabs等命令进行分析
Memcached.php =》 php系统使用apache服务,图形化界面
daemontools =》 不知道是啥,先记下来
Nagios =》 checktcp =》 不知道是个啥,先记下来
优化思路
1.合理的增长因子 => 控制内存的合理消耗
2.缓存更新机制 => 在快要失效的时候更新缓存