memcached之理解memcached的内存存储

memcached之理解memcached的内存存储 
---------
下面介绍memcached的内部构造的实现方式,以及内存的管理方式,以及memcached的内部构造导致的弱点也将加以说明。

Slab Allocation机制:整理内存以便重复使用
最近的memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是,这种方式 会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。
Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片的问题。Slab Allocation的原理相当简单。 将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合).而且,slab allocator还有重复使用已分配的内存的目的。也就是说,分配到的内存不会释放,而是重复利用
Slab Allocation的主要术语:
Page: 分配给Slab的内存空间,默认是1MB。分配给Slab之后根据slab的大小切分成chunk。
Chunk: 用于缓存记录的内存空间。
Slab Class: 特定大小的chunk的组。

在Slab中缓存记录的原理
下面说明memcached如何针对客户端发送的数据选择slab并缓存到chunk中。
memcached根据收到的数据的大小,选择最适合数据大小的slab。memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。

Slab Allocator的缺点
Slab Allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。这个问题就是, 由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了。
对于该问题目前还没有完美的解决方案,但在文档中记载了比较有效的解决方案。就是说,如果预先知道客户端发送的数据的公用大小,或者仅缓存大小相同的数据的情况下,只要使用适合数据大小的组的列表,就可以减少浪费。但是很遗憾,现在还不能进行任何调优,只能期待以后的版本了。但是,我们可以调节slab class的大小的差别。

使用Growth Factor进行调优
memcached在启动时指定Growth Factor因子(通过-f选项),就可以在某种程序上控制slab之间的差异。 默认值为1.25。但是,在该选项出现之前,这个因子曾经固定2,称为"powers of 2"策略。

让我们用以前的设置,以verbose模式启动memcached试试看:

$ memcached -f 2 -vv
下面是启动后的verbose输出:

slab class	1: chunk size	128	perslab 8192
slab class	2: chunk size 	256 perslab	4096
slab class	3: chunk size	512	perslab 2048
slab class	4: chunk size	1024 perslab 1024
...
可见,从128字节的组开始,组的大小依次增大为原来的2倍。这样设置的问题是,slab之间的差别比较大,有些情况下就相当浪费内存。因此,为尽量减少内存浪费,两年前追加了growth factor这个选项。
来看看现在的默认设置(f=1.25)时的输出:
slab class	1: 	chunk size		88 perslab	11915
slab class	2:	chunk size		112 perslab 9362
slab class	3:	chunk size		144 perslab 7281
slab class	4:	chunk size		184 perslab	5698
...
可见,组间差距比因子为2时小得多,更适合缓存几百字节的记录。
将memcached引入产品,或是直接使用默认值进行部署时,最好是重新计算一下数据的预期平均长度,调整growth factor,以获得最愉当的设置。内存是珍贵的资源,浪费就太可惜了。

查看memcached的内部状态
memcached有一个名为 stats的命令,使用它可以获得各种各样的信息。执行命令的方法很多,用telnet最为简单:
$ telnet    主机名    端口号

连接到memcached之后,输入stats再按回车,即可获得包括资源利用率在内的各种信息。此外,输入"stats slabs"或"stats items"还可以获得关于缓存记录的信息。结束程序请输入quit

$ telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
stats
STAT pid 481
STAT uptime 16574
STAT time 1213687612
STAT version 1.2.5
STAT pointer_size 32
STAT rusage_user 0.102297
STAT rusage_system 0.214317
STAT curr_items 0
STAT bytes 0
STAT curr_connections 6
STAT total_connections 8
STAT connection_structures 7
STAT cmd_get 0
STAT cmd_set 0
STAT get_hits 0
STAT get_messes 0
STAT evictions 0
STAT bytes_read 20
STAT bytes_written 465
STAT limit_maxbytes 67108864
STAT threads 4
END
quit


查看slabs的使用状况
$ memcached-tool    主机名:端口    选项
查看slabs使用状况时无需指定选项,因此用下面的命令即可:
$ memcached-tool    主机名:端口
获得的信息如下:
#	Item_Size	Max_age		IMB_pages	Count 		Full?
1	104B		1394292 s	1215		12249628	yes
....
各列的含义为:

含义
#
slab class编号
Item_Size
Chunk大小
Max_age
LRU内最旧的记录的生存时间
IMB_pages
分配给Slab的页数
Count
Slab内的记录数
Full?
Slab内是否含有空闲chunk
  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值