码迷,mamicode.com
首页 > 系统相关 > 详细

memcached存储解析

时间:2015-09-16 12:54:21      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:

Memcached如何存储我们的数据?

要很好的使用Memcached,那么必须知道我们的数据交给Memcached,它是怎么处理它们的。为了说明这个,需要先了解几个名词:slab class,page,chunk。它们三者之间的关系如下: 技术分享

  1. slab class :memcached会自动根据设置的chunk size以及当前分配给memcached创建一系列slab class,单个slab class中的chunk大小是一样的,而每个slab class中的chunk大小根据设置设置的chunk_size*growth_factor^(i-1),其中i表示第几个slab class(这里需要注意这里的chunk_size不只是item的数据大小,还包含memcached内部的一个item结构体大小,这个值一般是48byte,默认的growth_factor是1.25)。
  2. chunk:可以理解为memcached中存储数据的最小单元,每个存储在memcached中的item都会分配一个符合它大小的chunk,chunk的数量决定了memcached存储item的数量,默认的chunk为48byte。
  3. page:memcached中的内存是已page为单位分配给每个slab class,然后每个slab class根据它的chunk大小,计算出各自能够存储的item的数量,默认page大小为1M。而每一页能够存放多少个item,这取决于chunk_size的大小。

 

    通过上面可以看到slab class 1中一个page能够存储的item数量是最多的,而最后一个slab class一个page只能存储一个item。这是由于第一个slab class 1的chunk大小是所有slab class中最小的,那么对于就导致了slab class 1的能够存储的item最多了。

    memcached这样做的好处什么呢?memcached这样做将数据存储根据能够存储的大小归为几类,并且内存按照固定的大小来划分。相比于随机分配内存大小,导致内存碎片难于回收来说,这种内存方案对内存的利用率更高,而且便于管理。这就是memcached的slab allocation。

    对于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合理的使用内存呢?下面将介绍设置哪些参数来达到根据具体的业务合理的使用内存。

  1. 通过上面可以知道,slab class 1中能够存储的item数量是所有slab class中最多的,那么如果能够调整slab class 1的chunk大小,就能够提高memcached存储的数据量,并且对内存的利用率也有很大的提高。可以通过在memcached的启动参数-n来设置的slab class 1的chunk大小。由于后面的slab class都是在这个基础上递增,那么其实的slab class的chunk大小比较重要。比如你发现你们的业务存入memcached都是100byte的大小数据,那么可以将起始slab class的chunk设置为148byte(还要加上48byte的item结构体大小),例如memcached -n 148。这样就可以将数据基本上都会分布在slab class 1上面,而且在每一页上面能够创建的chunk数量也是最大的。
  2. 上面说通过调整slab class 1的chunk大小来提供能够存储的item数量,那么只是对于item大小比较固定的情况。如果对于item大小存在差异的时候呢?那么可以通过设置growth_factor来控制后面的slab class中chunk递增的速度,可以控制slab class中chunk大小变化幅度,来提高memcached的利用率。比如你现在的数据基本上在100-200byte之间,如果让这些数据全部存储在slab class 1那么有些item会只是占用chunk中的一半,这样对内存浪费比较大。所以可以条件growth_factor大小,来控制整个chunk大小在slab class递增的速度。可以通过启动参数-f来指定growth_factor大小,比如memcached -f 1.01 -n 100 (growth_factor值必须大于1)这样可以让memcached在chunk为100的基础上增长速度比较缓慢,能够有多个slab class的chunk大小分布在100-200byte之间。具体设置什么,可以根据你的业务或者一定的公式来获得这个值。
  3. 除了上面几个参数之外,可以调节页面的大小,以及分配给memcached的总内存大小来控制memcached分配内存的策略。通过启动参数-m调节memcached总内存大小,以及-I调节页面的大小。

 

memcached存储解析

标签:

原文地址:http://my.oschina.net/u/2368584/blog/506767

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!