[转载]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 测试用例
设置 Value为:第 i个我
4 测试结果
1) 几个截图及说明如下
1》放入第 1986718 个对象后,内存消耗 77.8M(占 memcache 指定最大内存 60.8%)
2》放入2880657 个对象后,内存消耗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 就是数据存放的最终地方。