0、memcached不做内存数据持久化。 1、memcached能接受的key的最大长度是多少? (250字符) 2、memcached对item的过期时间有什么限制? (最大过期时间30天) 3、memcached最大能存储多大的单个item? (1MB) (我们对key+value的总长度控制在64kb,没有对key单独做限制)
4、为什么单个item的大小被限制在1M byte之内? 详细的原因:Memcached的内存存储引擎(引擎将来可插拔...),使用slabs来管理内存。内存被分成大小不等的slabs chunks(先分成大小相等的slabs,然后每个slab被分成大小相等chunks,不同slab的chunk大小是不相等的)。chunk的大小依次从一个最小数开始,按某个因子增长,直到达到最大的可能值。 如果最小值为400B,最大值是1MB,因子是1.20,各个slab的chunk的大小依次是:slab1 - 400B slab2 - 480B slab3 - 576B ... slab中chunk越大,它和前面的slab之间的间隙就越大。因此,最大值越大,内存利用率越低。Memcached必须为每个slab预先分配内存,因此如果设置了较小的因子和较大的最大值,会需要更多的内存。 还有其他原因使得您不要这样向memcached中存取很大的数据...不要尝试把巨大的网页放到mencached中。把这样大的数据结构load和unpack到内存中需要花费很长的时间,从而导致您的网站性能反而不好。 如果您确实需要存储大于1MB的数据,你可以修改slabs.c:POWER_BLOCK的值,然后重新编译memcached;或者使用低效的malloc/free。其他的建议包括数据库、MogileFS等。 5、我可以在不同的memcached节点上使用大小不等的缓存空间吗?这么做之后,memcached能够更有效地使用内存吗? 6、memcached的内存分配器是如何工作的?为什么不适用malloc/free!?为何要使用slabs? slab分配器就是为了解决这个问题而生的。内存被分配并划分成chunks,一直被重复使用。因为内存被划分成大小不等的slabs,如果item的大小与被选择存放它的slab不是很合适的话,就会浪费一些内存。Steven Grimm正在这方面已经做出了有效的改进。(类似的内存分配器有:tcmalloc是google研发的thread-caching malloc,tcmalloc号称是目前最快的malloc,使用系统钩子的方法,屏蔽了glibc的malloc,从而用户可以不用修改代码,只用在编译时使用-l tcmalloc,glibc中的malloc在多线程时,因为加锁,性能比较低,tcmalloc为每个线程分配一段私有空间使用。) 邮件列表中有一些关于slab的改进(power of n 还是 power of 2)和权衡方案:http://lists.danga.com/pipermail/memcached/2006-May/002163.html http://lists.danga.com/pipermail/memcached/2007-March/003753.html 。 如果您想使用malloc/free,看看它们工作地怎么样,您可以在构建过程中定义USE_SYSTEM_MALLOC。这个特性没有经过很好的测试,所以太不可能得到开发者的支持。 更多信息:http://code.sixapart.com/svn/memcached/trunk/server/doc/memory_management.txt。 参考: http://kb.cnblogs.com/page/69074/#is%20memcached%20atomic 貌似facebook使用的就是memcached做的集群,有几千台机器。 |
最新评论: