参考文章:

http://blog.csdn.net/tonyxf121/article/details/7906428

http://zhihuzeye.com/archives/2361

memcache内存分配三个重要的概念:

1.page

系统分配给slab的内存空间(对应实际的物理空间),1个page默认为1M,可以使用-I参数进行调解(default: 1mb, min: 1k, max: 128m),分配给Slab之后根据chunk的大小切分成大小相同的chunk空间,chunk用于缓存记录。

2.Chunk

为固定大小的内存空间,默认为96Byte,可以使用-n参数进行调节,默认的-f大小为1.25,即每个slab的chunk大小会以1.25倍的大小增长

3. slab class

同样大小的chunk又称为slab class。

三个重要的参数 -m -f -n

-m 分配的最大内存

-f slab class(chunk组)的增长因子

-n ( slab class 1中)chunk的初始大小

memcached -f 2 -vv命令看以看到,当增长因子为2(默认为1.25)的时候可以分配的slab class

  1. test:~$ memcached -f 2 -vv
  2. slab class 1: chunk size 96 perslab 10922
  3. slab class 2: chunk size 192 perslab 5461
  4. slab class 3: chunk size 384 perslab 2730
  5. slab class 4: chunk size 768 perslab 1365
  6. slab class 5: chunk size 1536 perslab 682
  7. slab class 6: chunk size 3072 perslab 341
  8. slab class 7: chunk size 6144 perslab 170
  9. slab class 8: chunk size 12288 perslab 85
  10. slab class 9: chunk size 24576 perslab 42
  11. slab class 10: chunk size 49152 perslab 21
  12. slab class 11: chunk size 98304 perslab 10
  13. slab class 12: chunk size 196608 perslab 5
  14. slab class 13: chunk size 393216 perslab 2
  15. slab class 14: chunk size 1048576 perslab 1

chunk size(slab class i)=(default_size+item_size)*f^(i-1)+ CHUNK_ALIGN_BYTES

default_size: 默认大小为48字节,也就是memcached默认的key+value的大小为48字节;

item_size: item结构体的长度,默认为48字节,可以通过-n参数调节;

CHUNK_ALIGN_BYTES是一个修正值,用来保证chunk的大小是某个值的整数倍。

假设要存储100bytes的item

1、首先会找到包含其大小的chunk组,即slab class 2

2、如果slab class 2已经存在同时也还有chunk空闲,即将item存储在此

3、如果没有分配slab class 2的page或分配的chunk已满,则由系统重新分配一个page,设置其为slab class 2大小,并将item存储在此。

当使用stats slabs命令查看时,可以看到memcache所分配的slab class

memcached -p 50013 -l 0.0.0.0 -d -m 32 -f 1.001 -n 256

如果-f的值是1.001即每个slab的大小都一样时,使用命令就只有STAT 1,class 1的大小为 256+48

  1. stats slabs
  2. STAT 1:chunk_size 304 //slab class 1的chunk大小,256+48=304 byte
  3. STAT 1:chunks_per_page 3449 //每个page能存储的chunk数,1M/304byte = 1024*1024/304 = 3449,多余的空间会被浪费
  4. STAT 1:total_pages 3 //分配给slab class 1的page数,即3M
  5. STAT 1:total_chunks 10347 //总共分配的chunk数,3449 * 3
  6. STAT 1:used_chunks 8194
  7. STAT 1:free_chunks 1 //过期数据空出的chunk里还没有被使用的chunk数
  8. STAT 1:free_chunks_end 2152 //分配了但是还没有被使用的chunk数
  9. STAT 1:mem_requested 1001154
  10. STAT 1:get_hits 5681468
  11. STAT 1:cmd_set 571263
  12. STAT 1:delete_hits 0
  13. STAT 1:incr_hits 0
  14. STAT 1:decr_hits 0
  15. STAT 1:cas_hits 0
  16. STAT 1:cas_badval 0
  17. STAT 1:touch_hits 0
  18. STAT active_slabs 1
  19. STAT total_malloced 3145488 //总共分配的内存大小 ,10347*34
  20. END

如果free_chunks_end的数过大,表明这部分slab内存不能有效的利用;如果过小表明很快就不够用了;两种情况都需要做调整来使内存达到合理的利用。

memcached -p 50013 -l 0.0.0.0 -d -m 32 (-f 1.25 -n 48)

当有一定的增长因子时,如按默认的1.25,查看slab时就会出现不同的slab class信息,-f -n使用默认值

  1. stats slabs
  2. STAT 1:chunk_size 96
  3. STAT 1:chunks_per_page 10922
  4. STAT 1:total_pages 1
  5. STAT 1:total_chunks 10922
  6. STAT 1:used_chunks 9
  7. STAT 1:free_chunks 1
  8. STAT 1:free_chunks_end 10912
  9. STAT 1:mem_requested 818
  10. STAT 1:get_hits 5
  11. STAT 1:cmd_set 139
  12. STAT 1:delete_hits 1
  13. STAT 1:incr_hits 0
  14. STAT 1:decr_hits 0
  15. STAT 1:cas_hits 0
  16. STAT 1:cas_badval 0
  17. STAT 2:chunk_size 120
  18. STAT 2:chunks_per_page 8738
  19. STAT 2:total_pages 1
  20. STAT 2:total_chunks 8738
  21. STAT 2:used_chunks 24
  22. STAT 2:free_chunks 0
  23. STAT 2:free_chunks_end 8714
  24. STAT 2:mem_requested 2794
  25. STAT 2:get_hits 1
  26. STAT 2:cmd_set 60
  27. STAT 2:delete_hits 0
  28. STAT 2:incr_hits 0
  29. STAT 2:decr_hits 0
  30. STAT 2:cas_hits 0
  31. STAT 2:cas_badval 0

slab class的分配并不是按照顺序来分配的,所有当有不同的slab class时,使用stats slabs查看可能会出现

STAT 1

……

STAT 2

……

STAT 5

…….

STAT 9

…….

版权声明:本文为博主原创文章,未经博主允许不得转载。

memcache内存估算整理的更多相关文章

  1. Memcache 内存分配策略和性能(使用)状态检查

    前言: 一直在使用Memcache,但是对其内部的问题,如它内存是怎么样被使用的,使用一段时间后想看看一些状态怎么样?一直都不清楚,查了又忘记,现在整理出该篇文章,方便自己查阅.本文不涉及安装.操作. ...

  2. Memcache 内存分配策略和性能(使用)状态检查【转】

    前言: 一直在使用Memcache,但是对其内部的问题,如它内存是怎么样被使用的,使用一段时间后想看看一些状态怎么样?一直都不清楚,查了又忘记,现在整理出该篇文章,方便自己查阅.本文不涉及安装.操作. ...

  3. (转)Memcache内存分配策略

    转自:http://hi.baidu.com/software_one/item/0a0a6712dc7a319899ce33e0 一.Memcache内存分配机制 关于这个机制网上有很多解释的,我个 ...

  4. 微擎开启性能优化里面的性能优化memcache内存优化及数据库读写分离

    http://www.mitusky.com/forum.php?mod=viewthread&tid=3135 [微擎 安装使用] 微擎开启性能优化里面的性能优化memcache内存优化及数 ...

  5. Memcache内存分配策略

    一.Memcache内存分配机制 关于这个机制网上有很多解释的,我个人的总结如下. Page为内存分配的最小单位. Memcached的内存分配以page为单位,默认情况下一个page是1M,可以通过 ...

  6. HDFS的NameNode堆内存估算

    NameNode堆内存估算 在HDFS中,数据和元数据是分开存储的,数据文件被分割成若干个数据块,每一个数据块默认备份3份,然后分布式的存储在所有的DataNode上,元数据会常驻在NameNode的 ...

  7. PHP实现查询Memcache内存中的所有键与值

    使用Memcache时,我们可以用memcache提供的get方法,通过键查询到当前的数据,但是有时候需要查询内存中所有的键和值,这个时候可以使用下面的代码实现: <?php /** * Cre ...

  8. memcache内存分配机制

    memcached的内存分配没有用到c语言中自带的malloc函数,因为这个函数分配内存的时候效率很低,对于这种要求快速响应,对效率要求非常高的缓存软件来说非常不合适. memcached用的是自己的 ...

  9. MemCache内存缓存系统

    memcached是一种缓存技术, 他可以把你的数据放入内存,从而通过内存访问提速,因为内存最快的, memcached技术的主要目的提速, 默认情况下占用的端口号为:11211. 在memachec ...

随机推荐

  1. hgrjhgkjh

    #include<stdio.h> int step[5]={13,5,1,4,11}; int sum; int min=999; void ji() {  int i;  int j; ...

  2. IAR EW8051-8.10.4安装及破解方法

    第一步:获取破解license 1: 点击桌面左下角“开始”按钮,找到cmd.exe,右键创建cmd.exe 快捷方式到桌面: ————如果是windows7 ,请右键点击cmd.exe 快捷图标,点 ...

  3. php://input,php://filter,data URI schema的那些事

    一.php://input一句话木马 在调研dedecms的历史漏洞时,发现了dedecms安装文件曾经出过被植入后门的漏洞(SSV-ID站点include目录下shopcar.class.php文件 ...

  4. k8s入门系列之集群安装篇

    关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 •Kubernetes集群组件: - etcd 一个高可用的K/V键值 ...

  5. 函数类型+WINAPI+函数名(例如inline DWORD static WINAPI RecordToKeys(const DRWT& theDRWT,WTSBH* pKey,DWORD dwMaxNum)

    winapi标识符在WINDEF.H定义,语句如下: #define winapi __stdcall 让我们说说这个__stdcall stdcall调用约定 stdcall很多时候被称为pasca ...

  6. emoji探寻之路

    emoji是什么? http://www.baike.com/wiki/emoji emoji表情符号,是20世纪90年代由NTT Docomo栗田穣崇(Shigetaka Kurit)创建的,词义来 ...

  7. Scrum 项目7.0

    一.内容 1.回顾组织 主题:“我们怎样才能在下个sprint中做的更好?” 时间:设定为1至2个小时. 参与者:整个团队. 场所:能够在不受干扰的情况下讨论. 秘书:指定某人当秘书,筹备.记录.整理 ...

  8. jquery-mobile之loading加载自定义

    用jquery-mobile的时候,我们发现文档中loading是直接通过标签属性进行渲染,封装的函数必须通过点击按钮才能执行.而实际运用中,我们的加载开始和结束可能不需要点击,而是通过某个函数调用直 ...

  9. Unity随机随学

    1.什么是渲染管道? 是指在显示器上为了显示出图像而经过的一系列必要操作.渲染管道中的步骤很多,都要将几何物体从一个坐标系中变换到另一个坐标系中去. 主要步骤有: 本地坐标->视图坐标-> ...

  10. window route 命令

    使用 Route 命令行工具查看并编辑计算机的 IP 路由表.Route 命令和语法如下所示: route [-f] [-p] [Command][Destination] [mask Netmask ...