论坛首页 Java企业应用论坛

memcached server LRU 深入分析

浏览 32558 次
该帖已经被评为精华帖
作者 正文
   发表时间:2008-09-10  
贴一个感觉不错的memchached的系列文档

也可以通过下面的链接下载
http://bigweb.group.iteye.com/group/topic/6838
0 请登录后投票
   发表时间:2008-09-10  
sizhefang 写道
贴一个感觉不错的memchached的系列文档

也可以通过下面的链接下载
http://bigweb.group.iteye.com/group/topic/6838

谢大家对memcached的补充,不过这份资料在第一页quake wang大已经推荐过了


----------------------------------------------------------

这份文档说是全面,其实还是不全面,因为这两个japanese并没有告诉我们LRU是针对slab的,而这一点是本文的主题,其他描述都是铺垫,因为其他描述网上到处都是,恰恰针对slab的LRU网上到处都没有,本文也可以算是对这份文档的一个补充吧

0 请登录后投票
   发表时间:2008-09-12  
谢大家对memcached的补充,不过这份资料在第一页quake wang大已经推荐过了
⇒哈哈,不好意思。没有仔细看所有人的回复,只是感觉这篇文档是目前见过的
  关于memcached的比较不错的文档。如果哪位家里人手里还有不错的文档希望
  也能共享一下,因为最近我也在搞memcached这个东东~~
0 请登录后投票
   发表时间:2008-12-04   最后修改:2008-12-04
认为对楼主两点说的不清楚的地方:
1.
引用
每个slab下又有若干个page

2.
引用
这就解释了为什么我的内存还有40%的时候LRU就执行了,因为我的其他slab中的chunk_size都远大于我的value,所以我的value根本不会放到那几个slab中,而只会放到和我的value最接近的chunk所在的slab中(而这些slab早就满了,郁闷了)。这就导致了我的数据被不停的覆盖,后者覆盖前者。



下面是从其他帖子里的摘录:
引用

Slab Allocation的主要术语

Page

分配给Slab的内存空间,默认是1MB。分配给Slab之后根据slab的大小切分成chunk。

Chunk

用于缓存记录的内存空间。

Slab Class

特定大小的chunk的组。



引用

开启memcached:
memcached -d -m 10 -l 192.168.1.21 -p 11222 -u userA
这行命令会开启memcached服务,memcached在192.168.1.21:112222上面进行监听, 同时设置memcached使用的最大内存为10MB, memcached一开始并不会一下子申请10MB的内存, 而是在需要的时候才会使用malloc申请内存,当申请内存达到10MB时就不会再申请.

为了减少管理内存碎片的麻烦,当你需要通过memcached往缓存里面保存一个数据时, memcached给这个数据提供一个固定大小的内存块(chunk),比如数据的长度是100bytes,那么memcached提供一个大小为128b的chunk来存储该数据,chunk块的大小可以为64B,128B,256B...1024KB.使用何种大小的chunk块是由memcache根据数据的长度来决定的.

当你第一次往memcached存储数据时, memcached会去申请1MB的内存, 把该块内存称为一个slab, 也称为一个page, 如果可以存储这个数据的最佳的chunk大小为128B,那么memcached会把刚申请的slab以128B为单位进行分割成8192块. 当这页slab的所有chunk都被用完时,并且继续有数据需要存储在128B的chunk里面时,如果已经申请的内存小于最大可申请内存10MB时,memcached继续去申请1M内存,继续以128B为单位进行分割再进行存储;如果已经无法继续申请内存,那么mamcached会先根据LRU算法把队列里面最久没有被使用到的chunk进行释放后,再将该chunk用于存储.

chunk属于某个slab,slabs由memcached进行分组管理,以同样chunk大小进行分割的slab属于同一组.



我的理解:
第一点首先楼主说一个slab下有多个page,我理解page数指的是memcache分配的某一个型号的slab的数量。
第二点我的理解是如果还有可分配的内存,则不会覆盖1号slab的数据,如果内存没有可分配的了,则会覆盖1号slab比较旧的数据。此时你说“ 我的内存还有40%的时候LRU就执行了”,其实此时已经没有内存可分配了,因为这40%内存已经分配给了其他号的slab,所以1号slab的旧数据会被LRU。

如果我理解错了,希望大家拍砖,并把这个问题说清楚,不要迷惑更多的人! --- 不是说楼主迷惑人,是网上各种说法迷惑人 :),至少我是花了一晚上时间看文档 测试才自认为搞清楚了。 楼主不要激动  呵呵 ,绝对支持你的分享精神


0 请登录后投票
   发表时间:2008-12-04  
MEMCACHED不适合要求数据可靠的应用, 要可靠的数据, 内存数据库是不错的选择。 
0 请登录后投票
   发表时间:2008-12-04  
楼主肯定是因为数据的长度大小不相同的紊乱程度造成的, 如果说还有40%的内存, 肯定还会继续分配的。  另外, 建议你对于长度超过一定大小的进行压缩。
0 请登录后投票
   发表时间:2008-12-04   最后修改:2008-12-04
tongjian 写道
认为楼主有两个概念介绍错了

如果我理解错了,希望大家拍砖,并把这个问题说清楚,不要迷惑更多的人!


你确实理解错了,事情正如我所说,不信的话你可以看memcached的源代码,既然认为我介绍错了,我也非常希望你把你的分析或者实验数据拿出来。

还有即使我错了,我想的目的也不是去迷惑其他人。本来是把自己的经验拿出来的,现在被说成了是迷惑其他人,呵呵。

当然说那么多没有用,拿证据出来证明我是错的吧

------------------------
tongjian 写道

1.page是描述slab大小的。


不管你去网上找什么资料,都是和我的描述基本上是保持一直的。
去看看memcached的原代码吧
tongjian 写道

2.第二点需要一些数据证明一下,假如我有1千万+量级的数据,数据大小都是80b, 那按楼主的意思,无论memcahced内存开多大,都最多只会用一个slab大小,即1M。 那memcached也太弱了,我对这个观点表示怀疑,找时间我会测试一下。

这一点完全你是没有理解,我在正文上早就说了,一个slab会有多个page,明白不?怎么可能只用1m(只是预先分配1m,不是说只能使用1m,当这1m的数据满了之后,会重新分配一个page给这个slab,一旦到达使用内存的上限就不会再分配新的page了,新数据进来会有针对该slab的LRU,而且这个LRU只是针对该双向链表的前50个元素),看清楚文章再发言可以吗
0 请登录后投票
   发表时间:2008-12-04   最后修改:2008-12-04
哦,还有一点忘记说了,我们把memcache扩展了之后,完全改变了LRU的行为,而且可以通过key的前缀来控制这个key是需要被LRU,当然做这些事情的前提是充分理解memcached的原理。
0 请登录后投票
   发表时间:2008-12-04   最后修改:2008-12-04
补充:
晕了,本来想编辑帖子,一不小心把上边帖子引用楼主的内容删了。还是再回一个吧
两点误解的补充:
第一点首先楼主说一个slab下有多个page,我理解page数指的是某一个slab的数量。
第二点我的理解是如果还有可分配的内存,则不会覆盖1号slab的数据,如果内存没有可分配的了,则会覆盖1号slab比较旧的数据。此时你说“我的内存还有40%的时候LRU就执行了”,其实此时已经没有内存可分配了,因为这40%内存已经分配给了其他号的slab,所以1号slab的旧数据会被LRU。


还有
“Keep in mind that memcached is a cache not a database. It is fast, but not reliable storage.”
不知大家怎么理解的?
0 请登录后投票
   发表时间:2008-12-04  
sdh5724 写道
MEMCACHED不适合要求数据可靠的应用, 要可靠的数据, 内存数据库是不错的选择。 

非常同意,“Keep in mind that memcached is a cache not a database. It is fast, but not reliable storage.”
所以不要认为memcached是个好东西就是万能的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics