徐州网站简介,h5响应式网站,阿里云做网站流程,免费稳定的网站空间2019独角兽企业重金招聘Python工程师标准 Memcached是一个高效的分布式内存cache#xff0c;了解memcached的内存管理机制#xff0c;便于我们理解memcached#xff0c;让我们可以针对我们数据特点进行调优#xff0c;让其更好的为我所用。这里简单谈一下我对… 2019独角兽企业重金招聘Python工程师标准 Memcached是一个高效的分布式内存cache了解memcached的内存管理机制便于我们理解memcached让我们可以针对我们数据特点进行调优让其更好的为我所用。这里简单谈一下我对memcached的内存管理的一些认识在没有特别注明的情况下这里谈到的memcached是1.2版本1.1和1.2版本有一些差异。 基本概念Slab和chunk 在Memcached内存结构中有两个非常重要的概念slab 和 chunk我们先从下图中对这两个概念有一个感性的认识 图 1 memcached内存结构 Slab是一个内存块它是memcached一次申请内存的最小单位。在启动memcached的时候一般会使用参数-m指定其可用内存但是并不是在启动的那一刻所有的内存就全部分配出去了只有在需要的时候才会去申请而且每次申请一定是一个slab。Slab的大小固定为1M1048576 Byte一个slab由若干个大小相等的chunk组成。每个chunk中都保存了一个item结构体、一对key和value。 虽然在同一个slab中chunk的大小相等的但是在不同的slab中chunk的大小并不一定相等在memcached中按照chunk的大小不同可以把slab分为很多种类class。在启动memcached的时候可以通过-vv来查看slab的种类 图2 slab分组信息 从上图可以看到默认情况下memcached把slab分为40类class1class40在class 1中chunk的大小为80字节由于一个slab的大小是固定的1048576字节1M因此在class1中最多可以有13107个chunk 13107×80 16 1048576 在class1中剩余的16字节因为不够一个chunk的大小80byte因此会被浪费掉。每类chunk的大小有一定的计算公式的假定i代表分类class i的计算公式如下 chunk size(class i) : (default_sizeitem_size)*f^(i-1) CHUNK_ALIGN_BYTES default_size: 默认大小为48字节,也就是memcached默认的keyvalue的大小为48字节可以通过-n参数来调节其大小item_size: item结构体的长度固定为32字节。default_size大小为48字节,item_size为32因此class1的chunk大小为483280字节f为factor是chunk变化大小的因素默认值为1.25调节f可以影响chunk的步进大小在启动时可以使用-f来指定;CHUNK_ALIGN_BYTES是一个修正值用来保证chunk的大小是某个值的整数倍在32位机器上要求chunk的大小是4的整数倍。从上面的分析可以看到我们实际可以调节的参数有-f、-n在memcached的实际运行中我们还需要观察我们的数据特征合理的调节fn的值使我们的内存得到充分的利用减少浪费。 内存申请分配 Memcached内存管理采取预分配、分组管理的方式分组管理就是我们上面提到的slab class按照chunk的大小slab被分为很多种类。下面解释一下memcached的内存预分配过程。 向memcached添加一个item时候memcached首先会根据item的大小来选择最合适的slab class例如item的大小为190字节默认情况下class 4的chunk大小为160字节显然不合适class 5的chunk大小为200字节大于190字节因此该item将放在class 5中显然这里会有10字节的浪费是不可避免的计算好所要放入的chunk之后memcached会去检查该类大小的chunk还有没有空闲的如果没有将会申请1M1个slab的空间并划分为该种类chunk。例如我们第一次向memcached中放入一个190字节的item时memcached会产生一个slab class 2也叫一个page并会用去一个chunk剩余5241个chunk供下次有适合大小item时使用当我们用完这所有的5242个chunk之后下次再有一个在160200字节之间的item添加进来时memcached会再次产生一个class 5的slab这样就存在了2个pages。查看slab的使用情况我们可以telnet ip port然后输入命令 stats slabs即可 例如telnet 10.0.4.210 11211 stats slabs STAT 5:chunk_size 200 STAT 5:chunks_per_page 5242 STAT 5:total_pages 1 STAT 5:total_chunks 5242 STAT 5:used_chunks 5242 STAT 5:free_chunks 0 STAT 5:free_chunks_end 5241 STAT active_slabs 1 STAT total_malloced 1048400图3 stats slab 图3显示的是第一次放入一个190字节的item之后的统计结果。 转载于:https://my.oschina.net/wuxianAbs/blog/220936