您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > Memcached那些事
技术部Memcached那些事中文站技术部赵一涵2008-08-08技术部分享内容Memcachedserver的实现(内存管理)Memcached协议Memcachedclient简介我们的使用现状技术部Cache简介Cache定义:由于某些数据的获取或计算成本较大,往往彩将其预先算好或复制到更快的存储设备中,称为Cache(来自wikipedia)Cache最早出现于CPU设计领域WebCache(WebBrowser,CDN)Server内部Cache技术部我们应用用到的CacheDatabasecacheIbatiscacheOscacheTBStoreMemcached自己实现的Cache技术部Memcached简介high-performance,distributedmemoryobjectcachingsystemintendedforuseinspeedingupdynamicwebapplicationsbyalleviatingdatabaseloadDanga:LiveJournal.com20MPV,1Muser通过协议规定了server的职责技术部MemcachedServer网络通信+内存管理基于libevent的事件处理内置内存存储方式简单的协议分布式?集中式?技术部Item的结构技术部Item的结构除了保存必要的key-value对之外,item结构还定义了其他一些属性(上图是1.2.5版本中的item结构)三个指针字段的作用是构造链表,具体的使用情况在下面两节会提到time表示这个item最后一次被访问的时间,exptime为过期时间(相对时间,参考点是服务器启动时间)几个长度字段slab_clsid会在下面做详细介绍整个结构体(不含key,suffix,data部分)占40个字节内存空间技术部Item的查找-hash技术部item的查找-hash采用普通的hashtable的实现,将key作hash,相同hash的item将以链表方式存放,如上图item构造中的h_next指针就是用来构成这个链表的hash函数的具体实现可以参考,这同时也是一篇非常不错的分析hash函数的文章注意:为了达到良好的一次命中率,hashtable是会自动扩展的。hashtable所占的内存约为item_num*4byte*4/3。如果一个cache实例中的item数量极多(100M或更多),这张hashtable本身的内存占用就不可忽视。在以小对象为主的缓存中,这一点是要引起重视的。技术部Item的存放技术部Item的存放-术语表slab,page:内存中的一个分块,一般以1Mbyte为单位或略小于这个值chunk:一个slab内部又会被分割为相等大小的若干块,以存放适合大小的itemslabclass:按chunk的大小,slab会分成不同的类别,前述的slab_clsid就是这个类别的idslot,freechunk:item被移除后空的chunk,不会归还内存,留着给下一个适合大小的item使用技术部内存组织方式带来的问题内存浪费•item基本总是小于chunk的,chunksize-itemsize这段空间被浪费。平均而言,浪费的内存和总内存的比将会达到(factor-1)/2,factor为1.25时,这个比值为12.5%。减少这种内存浪费的一个办法是减小factor的值,让chunk大小增长更缓慢。当然,过小的factor值也会带来一个问题,因为最多只能有200个slabclass,所以需要计算好。•有很多slabclass中可能会没有item或只有很少的,这取决于你的item大小是分散分布的还是集中分布的。极端情况下,你的item是定长的,那它只会分布在一个slabclass中,其他class初始化时分配的一个slab大小的空间都是浪费的。技术部内存组织方式带来的问题(续)slab回收和复用问题•上述实现中,slab只会被分配而不会被回收,如果这个slabclass中不断地有item进来,那这是一个优点。但如果一个slabclass一开始存放了很多item。然后新进来的item大小发生变化,又都存放到其他slabclass中去了呢?这个slabclass无疑多占了很多空间,而且当item开始过期,有很多slab应该被收回。•memcached本身有slab回收机制,如果开启,将把slab大小统一设置成1Mb。技术部Item的逐出-LRU队列技术部Item的逐出当没有可用的空间给新来的item时,会按最近最少使用原则逐出cache中的item,memcached为每一个slabclass维护了一个LRU队列,实现为一个双向链表(如上图)。新来的item会从heads端加入,访问一个item,该item也会被取出,被重新放入heads端。所以越靠近tails端的item越老。如果一个slabclass没有空间了,会从它的tail开,沿着链表往上,查找第一个不在被使用的item,并将之逐出,腾出一个槽来给新人用(实际实现只搜最后50个)。技术部对象在cache中的生命周期新来乍到,分到了一个差不多适合自己的房子(按单元区分户型大小)注册一下自己的名字,避免黑户口不断有人来访,也可能没人理你有时候,你会被人故意赶走如果你这个单元的房子都満了,还有人要入住,而你是最不受欢的人,对不起,请你走人如果你老死在房子里了,没人管你,只有你的下一个访客会发现你的尸体技术部-pnum监听的TCP端口号-mnum内存限制,默认64M-M没有逐出,内存用完就不能再往里加-cnum最大链接数,默认1024-k锁定内存使之不会被swap到虚存,保证性能-vv调试时很有用-ffactorchunk大小增长系数,默认1.25-nbytes第一个chunk的大小(不含item结构),默认48技术部协议要点(文本协议)协议中有两种类型的数据:文本和非结构化数据,前者用来表示命令或服务端客户端交互,后者用来表示被缓存的数据。上述两种数据类型都会以‘\r\n’结束key用来标识存进memcached的对象,key是一个长度小于250的字串,且不能含有控制字符或空格一些命令中可以有过期时间,这个时间是一个整数值,如果大于60*60*24*30(30天),它将被作为一个Unix时间技术部存储命令set|add|replace|append|prependkeyflagsexptimebytes[noreply]\r\n•或caskeyflagsexptimebytescasunqiue[noreply]\r\n•后跟datablock\r\n技术部取操作getkey*\r\n取得一个或多个对象bykeysgetskey*\r\n取得一个或多个对象(包括其cas_id)bykeys一个key或空格分隔的多个key技术部删除操作deletekey[time][noreply]\r\ntime以秒计的间隔或系统时间,在这个时间之前,对象会被扔到删除对列中。对该对象的get,add,replace操作将会被失败,但set会成功。这是个可选参数,默认为0,表示不放到队列中而直接删除(freechunk)技术部递增递减操作incrkeyvalue[noreply]\r\ndecrkeyvalue[noreply]\r\n这两个命令是原子操作这两个操作的前提是这个key存在且其值是一个有效的64-bit无符号整数的十进制表示(在内部存储时,其实是用的字符串)decr至0后,再decr不会有效果。但incr到最大值后会溢出技术部统计命令stats\r\n:全局统计statsslabs\r\n:统计slabs的使用情况statsitems\r\n:统计各slabclass中的item的情况statssizes\r\n:统计每个大小档次中item数量(需要遍历所有item,慎用)技术部其他命令flush_all[delay]\r\n:将所有对象置为不可获取状态,即全清,慎用。delay以秒计,没有表示马上执行version\r\n:返回server版本verbositylevel\r\n:调整server的日志输出level:0|1|2,2最详细quit\r\n:告诉server关闭此链接技术部典型用例存储数据库的一些复杂且耗时查询的结果存储查询量非常大的sql返回值以减轻数据库压力存储生成的页面片段用户异常频繁行为控制(锁的一种)技术部客户端实现协议内容(或一个子集)维持一个连接池(SocketPool)支持cluster,即客户端的分布式•使用hash函数将对象平均或按权重存储到cluster中的每台server上•冗余、方便server增减的考虑扩展一些功能,如压缩,序列/反序列化技术部Java客户端Whalin’sSpymemcached我们的封装:•接口窄化,使用我们的通用Cache接口•配置的规范化•Key生成的规范化,使用region作前缀,用SHA1hash生成定长40bytes长度的key•写死了一些客户端的配置,保证最优化使用技术部我们应用现状11台cacheserver,4个cluster近20个region,还在不断增加中Cacheserver的存储和带宽容量还很大哪些应用适合使用cache,哪些数据适合放入cache中?如何使用•简单配置直接使用•有时需要写Cache类•可以考虑封装在DAO中技术部Cache维护组目前成员:郎中锋,曹文炯,郑勇斌,赵一涵,校长(顾问)远景:近期目标:欢迎大家加入,欢迎大家多提需求!技术部Q&A技术部Thankyou!
本文标题:Memcached那些事
链接地址:https://www.777doc.com/doc-3969110 .html