#Memcached那些事 本文不是为了介绍Memcached是什么,而是讨论在使用Memcached的时候你必须知道的一些事情。以便于方便排查和更好的使用Memcached。本文主要围绕两个方面来讨论这个话题:Memcached的使用和监控。 ##如何更好的使用Memcached 这部分讨论的是如何可以合理有效的让Memcached为咱们服务,经过什么方式来调控Memcached,让它工做的更好。下面进入这部分的内容: ###Memcached如何存储咱们的数据? 要很好的使用Memcached,那么必须知道咱们的数据交给Memcached,它是怎么处理它们的。为了说明这个,须要先了解几个名词:slab class,page,chunk。它们三者之间的关系以下: shell
经过上面能够看到slab class 1中一个page可以存储的item数量是最多的,而最后一个slab class一个page只能存储一个item。这是因为第一个slab class 1的chunk大小是全部slab class中最小的,那么对于就致使了slab class 1的可以存储的item最多了。memcached
memcached这样作的好处什么呢?memcached这样作将数据存储根据可以存储的大小归为几类,而且内存按照固定的大小来划分。相比于随机分配内存大小,致使内存碎片难于回收来讲,这种内存方案对内存的利用率更高,并且便于管理。这就是memcached的slab allocation。fetch
对于memcached来讲,若是一个item申请写入数据,会计算当前item的大小而后加上memcached的item结构体大小,判断具体是存储在哪一个slab class上面。判断的条件是item_size+item_structure_size<=某个slab class上的chunk大小。以上面的图来讲,好比我须要写入一个54byte的数据(key+value),因为memcached的item结构体大小是48,那么memcached对于这个item须要写入的总数据大小是100byte,因而就会写入slab class2的某个chunk里面。因而就会存在下面的状况:优化
因为slab class2的chunk大小是112byte,那么写入100byte数据,就会有12byte空间浪费。这就是下一个话题,如何可以让memcached充分使用内存。 ###让Memcached充分使用内存。 上面列举的例子能够看出如何chunk大小设置不合适会致使内存空间的浪费,如何让memcached合理的使用内存呢?下面将介绍设置哪些参数来达到根据具体的业务合理的使用内存。线程
##监控Memcached 如何监控memcached内存使用状况,以及每一个slab classs当前状态这个对优化memcached也是一种重要的手段。memcached自身提供了对它监控的手段,也很简单。能够经过telnet连接到memcached便可查看当前的memcached。下面是在我本机上经过telnet观察memcached的一个实例,下面主要是对返回的几个参数进行说明。code
<!--lang:shell--> dev@codinglife:~$ telnet localhost 11211 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. stats items STAT items:1:number 64708 STAT items:1:age 32067 STAT items:1:evicted 0 STAT items:1:evicted_nonzero 0 STAT items:1:evicted_time 0 STAT items:1:outofmemory 0 STAT items:1:tailrepairs 0 STAT items:1:reclaimed 32828 STAT items:1:expired_unfetched 29979 STAT items:1:evicted_unfetched 0 END stats slabs STAT 1:chunk_size 688 STAT 1:chunks_per_page 1524 STAT 1:total_pages 43 STAT 1:total_chunks 65532 STAT 1:used_chunks 64708 STAT 1:free_chunks 824 STAT 1:free_chunks_end 0 STAT 1:mem_requested 5888428 STAT 1:get_hits 0 STAT 1:cmd_set 101909 STAT 1:delete_hits 0 STAT 1:incr_hits 0 STAT 1:decr_hits 0 STAT 1:cas_hits 0 STAT 1:cas_badval 0 STAT 1:touch_hits 0 STAT active_slabs 1 STAT total_malloced 45086016 END
上面主要执行了两个命令,一个是stats items和stats slabs。stats items是对当前memcached当前存储的item进行一个统计,能够看到item的数量,一些item的一些状态,好比是否有item被移除,是否有超时等,注意上面更在STAT items后面的数字表示是在第几个slab class上,上面表示数据都是在slab class 1上面。而stats slabs是观察各个slab class的状况,好比某个slab class使用了多少page,当前slab class的chunk_size,以及使用了多少个chunk,剩余多少chunk,以及内存的使用状况,同时能够看到整个memcached但钱有多少个slab class处于使用激活状态,以及总共使用了多少内存,重要的是能够看到某个slab class对数据的操做历史累计统计(好比get_hits,cmd_set,delete_hits等等),从而能够看到哪一个slab class存储的数据是热点数据,从而能够更具上面的方法调整memcached参数,来提升memcached对内存的使用状况。内存
上面主要是对memcached使用内存方面调优的参数以及对memcached运行状态的监控进行了讨论,这二者实际上是一个相互反馈的过程。经过调整好了memcached相关参数,监控一下memcached运行状况,是否达到预期的效果,从而再对memcached进行调整,再进行监控。只有反复进行调整才能将memcached对内存方面的使用达到最佳的效果。固然能够经过其余参数对memcached进行其余方面的调整,否则可以支持的最大链接数量,处理请求的线程数量等,来提升memcached的总体处理能力。因为不是本文讨论的主题,因此这里就不作过多的描述,具体有哪些参数能够经过memcached -h来获取全部参数列表。get