• 1. 1Memcached使用及原理研发管理部 陈海涛 2011-06-10
  • 2. 什么是Memcached© 2004 - 2010 UC Mobile2Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统。常用于减少数据库负载,提升性能。 社区网站主页:http://www.livejournal.com/ 开发团队主页:http://danga.com/ 项目主页:http://memcached.org/
  • 3. 部署架构© 2004 - 2010 UC Mobile3
  • 4. © 2004 - 2010 UC Mobile4
  • 5. 启动© 2004 - 2010 UC Mobile5
  • 6. 常用功能参数© 2004 - 2010 UC Mobile6-p 指定服务TCP端口,默认为11211,默认会监听tcp和udp端口。 -l 指定监听IP地址(默认0.0.0.0,即对所有网卡IP都生效) -d run as a daemon,以后台精灵程序的方式运行 -m 分配给memcached用作缓存的内存大小,用来缓存key+value+管理信息item结构体的内存空间,不包括hash表和双向链表等的内存,单位为MB。默认64MB。 -P 保存进程ID到指定文件,与-d配合才生效,可用来:kill `cat memcached.pid` -vv 输出详细的信息(包括输出客户端的命令及回应信息) -vvv 输出最详细的信息(包括输出内部的状态信息,含函数调用关系) -h 打印版本和帮助信息,然后退出
  • 7. 常用优化参数© 2004 - 2010 UC Mobile7-f chunk size的增长因子(合理范围1.05~2,默认:1.25) -t memcached启动的工作线程数,默认为4,建议不要超过系统CPU的个数。 -I [k|K|m|M] 改变slab page的容量大小,以调整ITEM容量的最大值,默认为1MB。 不能少于1024bytes(即1K),不能大于128MB。memcached不推荐大于1MB。
  • 8. 分布式-客户端实现© 2004 - 2010 UC Mobile8
  • 9. 分布式-一致性hash© 2004 - 2010 UC Mobile9
  • 10. 内存管理-术语© 2004 - 2010 UC Mobile10
  • 11. 内存管理-分配© 2004 - 2010 UC Mobile11
  • 12. 物理组织-SlabSlass结构© 2004 - 2010 UC Mobile12slabclass_t的字段含义unsigned int size本slabclass切分每个chunk的尺寸unsigned int perslab本slabclass的每个slab能存放chunk的个数void **slots用来回收空闲chunk的插槽数组,成倍扩张unsigned int sl_total当前插槽数组的容量unsigned int sl_curr当前可用的插槽数或0,等于sl_total时扩张slots,取用时减1,回收时加1。void *end_page_ptr最后分配的slab空闲内存起始地址,或NULL,每征用一个chunk时加一个chunk的sizeunsigned int end_page_free最后分配的slab尚空闲的chunk数,每征用一个chunk时减1unsigned int slabs当前实际为这个slabclass分配的slab数void **slab_list存放本slabclass的所有slab内存地址的数组unsigned int list_size当前slab_list数组能容纳的slab数,成倍扩张unsigned int killingindex+1 of dying slab, or zero if nonesize_t requested请求本slab class缓存的数据总字节数
  • 13. 逻辑组织-Item数据结构© 2004 - 2010 UC Mobile13_stritem的字段含义struct _stritem *next指向双向链表下一个item的指针(内存地址)struct _stritem *prev指向双向链表上一个item的指针(内存地址)struct _stritem *h_next指向hash table的相同hash值下一个item的指针(内存地址),用单向链表解决hash碰撞。rel_time_t time最近读或写访问时间rel_time_t exptime本数据过期时间int nbytesvalue的长度unsigned short refcount引用计数uint8_t nsuffixflags(原子操作CAS)和value长度信息的长度uint8_t it_flags标志位:1:在使用;2:cas;4:已回收uint8_t slabs_clsid我所属的slab class id表,释放时置0uint8_t nkeykey的长度,会有对齐void * end[]数据(key、1空格、flags和value长度、value)
  • 14. 查找-通过hash table© 2004 - 2010 UC Mobile14
  • 15. LRU-通过双向链表© 2004 - 2010 UC Mobile15
  • 16. Get时LRU© 2004 - 2010 UC Mobile16get数据后,判断该key的最近访问时间如果已是60秒之前--则更新该key的最近访问时间,移动该key到本slab class的双向链表head位置。 set时放到head位置。 结果:老数据留在尾部(tail)。
  • 17. Set时LRU© 2004 - 2010 UC Mobile17
  • 18. 实践-浅出Memcached© 2004 - 2010 UC Mobile18-vv (不带-d) tcpdump抓包 telnet后stats/stats slabs/stats items 示例和作业 提问
  • 19. 记录需要内存数© 2004 - 2010 UC Mobile19每记录需要内存数 = key长度 + value长度 + 管理信息(64 字节 + 1~9字节的value size的字符数).key长度value长度固定管理信息长度value长度的字符数每记录需要内存数1012864320510200064420781810000645100871010000006471000081
  • 20. 记录占用内存数© 2004 - 2010 UC Mobile20通过内存分配因子-f参数优化内存利用率. key:10字节,value:分别128、1000、10,000、100,000、1000,000字节对比。记录需要内存数-f 1.25时实际占用内存数-f 1.02时实际占用内存数-f 1.1时实际占用内存数20524020822410781184109611281007911104101201027210008010349610485761014481000081104857610485761048576
  • 21. 21Thank You!uc.cn