from: http://hi.baidu.com/zhuguoneng/blog/item/aa5fbb3949e766f83b87cee4.html
原始文章 Memcached Internals 是在 2008年MySQL Conf 上的一篇http://www.igvita.com/2008/04/22/mysql-conf-memcached-internals/
本文对memcached的使用提出了一些建议,并讲述了一些memcached内部的一些实现机制。是我们可以更好的理解应用memcached。
MEMCACHED的最佳实践
Memcached是一个高性能的分布式缓存系统,它是独立应用的,当前被许多大型的网站使用,比如Facebook(在2008年第一季度有2TB的缓存), Livejournal, Mixi, Hi5等,然而他也是一个极端简单的软件:所有的逻辑在客户端,没有安全模型,容灾处理,备份机制或持久化。然而这些并不影响他被开发这发布到各种情况的环境中,如下有Brian做的一些关于memcached的最佳时间的建议:
1.不要想行级别(数据库)的缓存,考虑复杂对象。
2.不要在数据库服务器上运行memcached,给你的数据库提供一切可能使用的内存。
3.不要担心TCP的延迟-本机的TCP/IP已经被优化为内存拷贝。
4.考虑 multi-get-在任何可能的情况下用并发来处理事情。
5.不是所有的memcached客户端都是等同的,做你自己的调研。-提示使用 Brians 的。
片分配器-MEMCACHED的心脏
memcached的心脏是他的内存片分配器,第一感觉令人有点畏惧,但是当你明白他架构中所采用的平衡机制等,你会从内心中体会出他确实是一个高雅的解决方案。
1.memcached所能分配的内存最大值仅由系统的架构决定(32/64位)
2.key值大小限制到250字节,data值大小限制到1mb
3.在启动时,memcached获取需要的内存-在性能前浪费内存
4.分配的内存由片分配器切分为不同大小的桶。
5.默认情况下片分配器将创建32-39个桶用来存放最大到1mb大小的对象。
6.你可以在编译时设置页大小,并在启动时设置片大小。
7.每一个被存储的对象存在最相近大小的桶中-是的,内存是被浪费的。
8.碎片是个问题-无论是定义片大小或时常回收/冲刷你的缓存。
9.如果在一个不同的片类中没有未被使用的内存,该内存将在需要的时候被重分配。
10.保证 no-paging,禁用你系统的交换空间(swap) -实用的是将他变小来避免出问题。
内存管理
内存管理使用的是LRU 算法
1.每一个片类有他自己的LRU-回收目标依赖于对象的大小
2.没秒钟检查一次截止时间戳-最小寿命是1秒
3.异步处理被标志为删除的对象-每5秒检查回收一次
4.上面两个时间的不一致会导致次最佳回收规则
5.可以完全禁用LRU-这样做自己担当风险
关于失效和截止期的最佳实践
Memcached不提供任何关于删除一个相关联key集合(对象,名称等等)的机制.不管是好是坏,你需要在prepend和append命令的帮助下自己实现该功能,然而,需要小心这个1mb 大小的限制。一个非常简单的处理该情况的方式是完全放弃一起失效过程。
1.在任何可能的时候通过设置截止时间来使你的数据失效-memcached会做所有的工作。
2.生成有提示性的key-比如,在更新,添加一个版本号 ,将成为key的一部分
3.作为奖励点,在memcached中存储版本号-称作一代
4.后面的将会很快添加到memcached中-只要 Brian 考虑做他。
ROADMAP和未来展望
1.二进制协议在处理中
2.支持代处理-前面章节提到
3.多引擎支持:基于字符的,持久的,队列的
4.Facebook已经修改过的核心,有望被贡献出来。
感谢Brian和Alan的伟大工作,不要忘记做书签并常回来看看(指原文)。