memcached学习——memcached的内存分配机制Slab Allocation、内存使用机制LRU、常用监控记录(四)

内存分配机制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.缓存更新机制 => 在快要失效的时候更新缓存

posted @ 2017-01-10 02:58  鱼我所欲也  阅读(1141)  评论(0编辑  收藏  举报