memcached 原理 内存分配 slab

2009-09-16 6:39 pm

很早以前就听说memcache了,以前也是用memcache,可是却没有对里面的原理有深入一点的研究。

其实网上有一篇很好的文章,是一个哥们翻译过来一篇日本人对memcache原理的介绍,这篇文章实在写的

很好,图文并茂,所以实在没有必要我来这里班门弄斧了,只是在后头补充一些我的想法而已。

先上地址: http://tech.idv2.com/2008/08/17/memcached-pdf/

补充一些,首先,有个很好用的图形工具可以帮助我们监控和分析memcache,以前我的文章中提到过:

http://www.codytan.com/?p=479

我认为对memcache进行Flush操作后,会让所有的数据过期,除标志为过期外,但是key依然存在,这个用上面的图形工具查看slab和item就能看到,对于过期的数据,memcache

并不会去理会,也会保存value所在,只有当get来触发的时候,会delete这个对应的key.

这里在说一些内存分配的东西,这些其实才是重点:

memcached在启动的时候可以用-f 指定chunk的增量倍数,我们这里叫他因子吧,默认的是1.25,

你会发现启动memcache会分配40个slab class,这个并不是固定的,而是因为chunk × 个数 就要超过

1M了,memcached对一个slab固定为1M,所以里面的元素chunk自然也是小于1M的,同样,超过1M的数据是无法

保存到memcache里面的(使用压缩参数除外),当slab里面的空闲chunk用完了,memcached会有两种方式来处理新来的item,这个取决于是否已经到了memcached的limit memory了,如果还有空闲的内存,会分配新的slab,再被成chunk,
如果已经满了,则会对相同size的数据优先进行LRU(针对slab class)。
所以如果一开始服务器都保存小的数据,会把空余的内存先分配掉了,到后来留给大的文件就更少,当然大的文件进行的LRU就更多了。

还有很多同学可能喜欢用memcache来做统计,注意不要类似的代码:

$count = $memcache->get(key);
$count++;
$memcache->set(key);

这样会因为并非的问题而造成统计的不准确,可以使用memcache->increment,
到达数量后保存到数据库,代码略了。

如果有什么错误请email我。

推荐(0)
收藏