[转载]Memcache内存临界测试

作者:马江涛

时间:2010-08-19

前言

此文档帮助您了解 memcache 在保存数据时,假如要保存的数据量接近 memcache 指定的最大内存时,memcache 是怎样进行数据存储的,以及怎样尽可能的提高 memcache 的命中率。

关键词:memcache 、临界、内存、memcache.php、LRU、监控

 

1 测试目的

探究 memcache 保存数据时,在保存的数据量接近 memcache 指定内存临界时,保存规律是怎样的?

 

2 测试环境

 

软件

版本号

说明

php

php-5.3.3

 

memcache

memcached Server 1.2.1

最大内存设置为 128M

apache

2.2.16

 

memcache.php

 

一个开源的 php脚本

 

3 测试用例

定义变量 i 0 3853628增加(一个 key value占据的空间约 50 bytes

设置 Key为:hello+i

设置 Value为:第 i个我

循环插入键值数

4 测试结果

1) 几个截图及说明如下

1》放入第 1986718 个对象后,内存消耗 77.8M(占 memcache 指定最大内存 60.8%)

 

 

2》放入2880657 个对象后,内存消耗78.1m(占memcache 指定最大内存61.0%)

 

3》放入3853630 个对象后,内存消耗78.1m(占memcache 指定最大内存61.0%)

以上三个图示说明,插入的数据如果大小变化不是很大时,memcache 中的数据存储到一定的时候(占总内存60%左右时),不再消耗内存

 

3) 此时获取缓存中的数据


获取hello1 得到 null


获取hello1926814 得到 null 4/8 位置的数据


获取hello2408518 得到 null 5/8 位置的数据


获取hello2890221 得到 第2890221 个我 6/8 位置的数据


获取hello3853628 得到 第3853628 个我

 

以上数据说明,在上述情况下,内存消耗到60%左右时,memcache 就开始执行LRU 机制了。

 

原因分析:


1 memcached 中新的value 过来存放的地址是该value 的大小决定的,value 总是会被选择存放到chunk 与其最接近的一个slab 中,假如已经没有合适的chunk 了,那就开始LRU 了。所以,可见memcached 的LRU 不是全局
的,而是针对slab 的,是区域性的。


2 memcached 的内存分配采用的是预分配方式,为了获得更快的速度,不得不以空间换时间。所以在如上情况下(插入的数据大小变化不是很大时),在内存消耗耗到60%左右时开始启用LRU 机制。其余的40%在这种场合,基本等于是浪费掉的。

 

3 要提高memcached 的命中率,可以通过预估我们的value 大小,然后适当的调整增长因子来实现。(通过调整增长因子 –f 1.1 表示chunk 按照1.1 倍的速度增长,可以尽可能多的拥有某种大小的chunk)


注:
memcache 的数据存储时有3 个概念:1》 slab, 2》 page, 3》 chunk


一个memcahced 进程会预先将自己划分为若干个slab,每个slab 下又有若干个page,每个page 下又有多个chunk。Slab 的数量是有限的,几个,十几个,或者几十个,这个跟进程配置的内存有关。而每个slab 下得page 默认情况是1m,也就是说如果一个slab 占用100m 得内存得话,那么默认情况下这个slab 所拥有得page 的个数就是100,而chunk 就是数据存放的最终地方。

 

 

posted on 2012-04-01 18:01  娜些事儿  阅读(1458)  评论(0编辑  收藏  举报

导航

分享到: QQ空间 新浪微博