Memcached 内存管理(一)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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的大小固定为1M(1048576 Byte),一个slab由若干个大小相等的chunk组成。每个chunk中都保存了一个item结构体、一对key和value。

虽然在同一个slab中chunk的大小相等的,但是在不同的slab中chunk的大小并不一定相等,在memcached中按照chunk的大小不同,可以把slab分为很多种类(class)。在启动memcached的时候可以通过-vv来查看slab的种类:

图2 slab分组信息

从上图可以看到,默认情况下memcached把slab分为40类(class1~class40),在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_size+item_size)*f^(i-1)+ CHUNK_ALIGN_BYTES

  • default_size: 默认大小为48字节,也就是memcached默认的key+value的大小为48字节,可以通过-n参数来调节其大小;

  • item_size: item结构体的长度,固定为32字节。default_size大小为48字节,item_size为32,因此class1的chunk大小为48+32=80字节;

  • f为factor,是chunk变化大小的因素,默认值为1.25,调节f可以影响chunk的步进大小,在启动时可以使用-f来指定;

  • CHUNK_ALIGN_BYTES是一个修正值,用来保证chunk的大小是某个值的整数倍(在32位机器上要求chunk的大小是4的整数倍)。

从上面的分析可以看到,我们实际可以调节的参数有-f、-n,在memcached的实际运行中,我们还需要观察我们的数据特征,合理的调节f,n的值,使我们的内存得到充分的利用减少浪费。

 

内存申请分配

 

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还有没有空闲的,如果没有,将会申请1M(1个slab)的空间并划分为该种类chunk。例如我们第一次向memcached中放入一个190字节的item时,memcached会产生一个slab class 2(也叫一个page),并会用去一个chunk,剩余5241个chunk供下次有适合大小item时使用,当我们用完这所有的5242个chunk之后,下次再有一个在160~200字节之间的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

相同字符串的string对象不等

今天遇到一个问题,用复制构造函数构造出来的String和同一个字符串的string对象居然不相等,即A和B是相同字符串的string,调用Cstring(A)之后,C和B不相等。 后来改成C string(A.c_str())后,C和B才相等转载于:https://www.cnblogs.c…

jitter 如何优化网络_网络推广如何做好网站SEO优化

网络推广做好网站整站SEO优化的方式有很多,如何才能做好SEO优化?网络推广如何做好网站SEO优化一、定位网站关键词SEO给一个网站刚开始做优化的时候,不是立马就设置关键词,而是先分析该网站主要是做什么产品/服务。知道网站的目的是…

PHP+Mysql查询上一篇和下一篇文章实例

PHPMysql查询上一篇和下一篇文章实例 简单的PHPMysql查询上一篇和下一篇文章实例,并输出上一篇和下一篇文章的标题和链接,适合新手学习获取当前浏览文章id: 1 $id isset($_GET[id]) > 0 ? intval($_GET[id]) : ""; 下一篇文章…

openssh-在win7上的搭建

2019独角兽企业重金招聘Python工程师标准>>> 参考 http://www.cnblogs.com/ericsun/archive/2012/06/10/2544413.html 1.下载OpenSSH:http://sourceforge.net/projects/sshwindows/files/OpenSSH%20for%20Windows%20-%20Release/3.8p1-1%2020040709%20B…

LeetCode8——String to Integer (atoi)(自己编写atoi函数)

题目: 参考解法: I think we only need to handle four cases: discards all leading whitespaces sign of the number overflow invalid input int myAtoi(char* str) {int sign 1, base 0, i 0;while (str[i] ) { i; }//去掉空格if (str[i…

5类6类7类网线对比_孩子们长高的黄金时期是从3月到5月,这阶段多吃6类食物长得快...

原标题:孩子们长高的黄金时期是从3月到5月,这阶段多吃6类食物长得快每个家长都希望孩子长大。当他们看到自己的孩子比同龄的孩子矮时,他们会非常担心。他们特别担心孩子的成长。事实上,儿童的生长发育有明显的季节性,一…

javascript之Partial Application

这一次来学习一下Partial Application。我们先看一下函数的介绍,在维基上有简单的介绍: 在数学中,一个函数是描述每个输入值对应唯一输出值的这种对应关系,符号为 f(x)。例如,表达式 f(x)x2表示了一个函数 f&#xff0…

根据对象的属性去重,获取新数组

() let cateArr arr.reduce(function (arr, current) { hash[current.category_id] ? : hash[current.category_id] true && arr.push(current); return arr }, []); () 转载于:https://www.cnblogs.com/gkxNB/p/11428433.html

快速地创建快顶尖的医学图像处理控件ImageGear Medical

ImageGear Medical控件使开发人员能够快速地创建快顶尖的医学图像处理控件,可以对DICOM文件进行浏览、创建、编辑,可以控制图像所有切面显示和打印,对图像进行注释,以及支持ISIS和TWAIN扫描和100多种图像文件格式,可用…

jj为什么会变大变小_为什么上过太空的种子果实会变大?射线会让生物向大变异吗?...

在科幻电影中,变异是不正常力量的重要来源之一,所谓“富人靠科技,穷人靠变异!”。但其实科幻在某种意义上一起在误导着我们,多数科幻作品其实是以科学为外衣的魔法故事,比如“爱你三千遍”的钢铁侠&#xf…

公司人才招聘管理系统

课程设计名称 公司人才招聘管理系统 完成时间(起、止) 所属小组 课程设计的目的 1、学习和巩固C语言程序设计的方法,充分体会C语言在程序设计方面的强大功能和独特之处; 2、了解用C语言开发项目的一般过程,…

RabbitMQ 示例-生产者-消费者-direct-topic-fanout

这是生产者和消费者2个项目, 包含 direct,topic,fanout模式下的消费,springboot rabbitmq 代码地址:https://github.com/duende99/RabbitMQ.git转载于:https://www.cnblogs.com/duende99/p/11440435.html

CutJS – 用于 HTML5 游戏开发的 2D 渲染引擎

CutJS 是轻量级的,快速的,基于 Canvas 开发的 HTML5 2D 渲染引擎,可以用于游戏开发。它是开源的,跨平台的,与现代的浏览器和移动设备兼容。CutJS 提供了一个类似 DOM 树的数据模型来编写应用程序,并在内部…

LeetCode65——Valid Number(使用DFA)来判断字符串是否为数字

题目: 参考解法:(DFA) class Solution { public:bool isNumber(string str) {int state0, flag0; // flag to judge the special case "."while(str[0] ) str.erase(0,1);//delete the prefix whitespace while(str[s…

win10商店下载位置_Win10删应用商店下载记录|Win10删Microsoft Store下载记录

Win10中的Microsoft Store,也称微软应用商店,提供给Windows用户下载安装使用各种应用,因此有些用户,会在这里下载软件,不过,在使用时间长了,也是会产生下载记录的。这篇文章是PE吧给大家带来的W…

HDU 1000 A + B Problem

Problem DescriptionCalculate A B.InputEach line will contain two integers A and B. Process to end of file.OutputFor each case, output A B in one line.Sample Input1 1Sample Output2题意:求输入的两个数之和。分析:注意题目暗含循环输入输出…

背景框代码

新建一个html文件,放入即可github: https://github.com/duende99/background_XXX.git 转载于:https://www.cnblogs.com/duende99/p/11442302.html

【原创】什么是 wire protocol

2019独角兽企业重金招聘Python工程师标准>>> 究竟 wire protocol 是指什么?下面这段话可以比较清楚的解释(原本来自 这里 )。 In a network, a wire protocol is the mechanism for transmitting data from point a to point b. T…

负数除以整数的余数怎么算?

由带余除法&#xff0c;任何一个整数n&#xff0c;都可以表示成nk*qr&#xff0c;其中0<r<q 这里的r就是n除以q的余数&#xff0c;通常记为n≡r(mod q) 例如-9(-2)*51&#xff0c;则-9除以5的余数为1。

上机环境是什么意思_Python能不能自学,可以找到什么工作?

1、学习Python能够找到什么样的工作&#xff1f;Python 编程有很多方向&#xff0c;有网络爬虫、数据分析、Web开发、测试开发、运维开发、机器学习、人工智能、量化交易等等&#xff0c;各个方向都有特定的技能要求&#xff0c;比如学数据分析就要重点掌握统计学、SQL 等知识&…