略微加速

略速 - 互联网笔记

memcached的限制

2020-12-22 leiting (4015阅读)

标签 PHP Linux MemCache

0、memcached不做内存数据持久化。

1、memcached能接受的key的最大长度是多少? (250字符)
  key的最大长度是250个字符。需要注意的是,250是memcached服务器端内部的限制,如果您使用的客户端支持"key的前缀"或类似特性,那么key(前缀+原始key)的最大长度是可以超过250个字符的。我们推荐使用使用较短的key,因为可以节省内存和带宽。 (我们对key+value的总长度控制在64kb,没有对key单独做限制)

2、memcached对item的过期时间有什么限制? (最大过期时间30天)
  过期时间最大可以达到30天。memcached把传入的过期时间(时间段)解释成时间点后,一旦到了这个时间点,memcached就把item置为失效状态。这是一个简单但obscure的机制。(我们不限制,到2038年)

3、memcached最大能存储多大的单个item?  (1MB)
  1MB。如果你的数据大于1MB,可以考虑在客户端压缩或拆分到多个key中。

      (我们对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能够更有效地使用内存吗? 
  Memcache客户端仅根据哈希算法来决定将某个key存储在哪个节点上,而不考虑节点的内存大小。因此,您可以在不同的节点上使用大小不等的缓存。但是一般都是这样做的:拥有较多内存的节点上可以运行多个memcached实例,每个实例使用的内存跟其他节点上的实例相同。


6、memcached的内存分配器是如何工作的?为什么不适用malloc/free!?为何要使用slabs? 
  实际上,这是一个编译时选项。默认会使用内部的slab分配器。您确实确实应该使用内建的slab分配器。最早的时候,memcached只使用malloc/free来管理内存。然而,这种方式不能与OS的内存管理以前很好地工作。反复地malloc/free造成了内存碎片,OS最终花费大量的时间去查找连续的内存块来满足malloc的请求,而不是运行memcached进程。如果您不同意,当然可以使用malloc!只是不要在邮件列表中抱怨啊:)

       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做的集群,有几千台机器。


北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3