memcached的内存存储机制

Memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。

Slab Allocator的基本原理是按照预先规定的大小,将分配的内存以page为单位,默认情况下一个page是1M,可以通过-I参数在启动时指定,分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),如果需要申请内存时,memcached会划分出一个新的page并分配给需要的slab区域。page一旦被分配在重启前不会被回收或者重新分配,以解决内存碎片问题。

Page

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

Chunk

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

Slab Class

特定大小的chunk的组。

Memcached并不是将所有大小的数据都放在一起的,而是预先将数据空间划分为一系列slabs,每个slab只负责一定范围内的数据存储。memcached根据收到的数据的大小,选择最适合数据大小的slab。memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。

如图所示,每个slab只存储大于其上一个slab的size并小于或者等于自己最大size的数据。例如:100字节大小的字符串会被存到slab2(88-112)中,每个slab负责的空间是不等的,memcached默认情况下下一个slab的最大值为前一个的1.25倍,这个可以通过修改-f参数来修改增长比例。

Slab Allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。chunk是memcached实际存放缓存数据的地方,这个大小就是管理它的slab的最大存放大小。每个slab中的chunk大小是一样的,如上图所示slab1的chunk大小是88字节,slab2是112字节。由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了。这里需要注意的是chunk中不仅仅存放缓存对象的value而且保存了缓存对象的key,expire time, flag等详细信息。所以当set 1字节的item,需要远远大于1字节的空间存放。

memcached在启动时指定 Growth Factor因子(通过-f选项), 就可以在某种程度上控制slab之间的差异。默认值为1.25。

slab的内存分配具体过程如下:

Memcached在启动时通过-m参数指定最大使用内存,但是这个不会一启动就占用完,而是逐步分配给各slab的。如果一个新的数据要被存放,首先选择一个合适的slab,然后查看该slab是否还有空闲的chunk,如果有则直接存放进去;如果没有则要进行申请,slab申请内存时以page为单位,无论大小为多少,都会有1M大小的page被分配给该slab(该page不会被回收或者重新分配,永远都属于该slab)。申请到page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk的数组,再从这个chunk数组中选择一个用于存储数据。若没有空闲的page的时候,则会对改slab进行LRU,而不是对整个memcache进行LRU。

1、stats :显示服务器信息、统计数据等

pid:守护进程的id

uptime:进程已经运行的时间,以秒为单位

time:当前的unix时间

version:服务器版本

pointer_size:操作系统默认的指针长度

rusage_user:进程累计的user time(秒:毫秒)

rusage_system:进程累计的system time(秒:毫秒)

curr_items:当前的items数量

total_items:进程启动开始存储过的items数量

bytes:当前用于存储items的byte数量

curr_connections:打开的连接数量

total_connections:进程启动开始打开过的连接数量

connection_structures:服务分配的连接结构数量

cmd_get:提取请求次数

cmd_set:存储请求次数

get_hits:get命中次数

get_misses:get未命中次数

evictions:为了添加新item而回收的合法item数量

bytes_read:服务从network读取的byte数量

bytes_written:服务写入network的byte数量

limit_maxbytes:服务可使用的用于存储数据的最大值

threads:被请求的工作线程数量

2、stats reset  清空统计数据

  1. stats reset
  2. RESET
  3. stats
  4. STAT pid 2305
  5. STAT uptime 40596
  6. STAT time 1294906749
  7. STAT version 1.2.6
  8. STAT pointer_size 64
  9. STAT rusage_user 1.671745
  10. STAT rusage_system 2.803573
  11. STAT curr_items 86642
  12. STAT total_items 0
  13. STAT bytes 29865212
  14. STAT curr_connections 14
  15. STAT total_connections 0
  16. STAT connection_structures 16
  17. STAT cmd_get 0
  18. STAT cmd_set 0
  19. STAT get_hits 0
  20. STAT get_misses 0
  21. STAT evictions 0
  22. STAT bytes_read 9
  23. STAT bytes_written 14
  24. STAT limit_maxbytes 67108864
  25. STAT threads 4
  26. END

3、stats malloc 显示内存分配数据

  1. stats malloc
  2. STAT arena_size 708608
  3. STAT free_chunks 4
  4. STAT fastbin_blocks 0
  5. STAT mmapped_regions 65
  6. STAT mmapped_space 66752512
  7. STAT max_total_alloc 0
  8. STAT fastbin_space 0
  9. STAT total_alloc 614032
  10. STAT total_free 94576
  11. STAT releasable_space 94272
  12. END

4、stats maps  是把/proc/self/maps的数据显示出来。

如果远程攻击者连接到了memcached的TCP端口(默认11211)并发布了stats maps命令,Memcached就会直接将/proc/self/maps的输出管道传输给客户端。这可能导致泄漏所分配内存区域的地址。

  1. stats maps
  2. 00365000-00378000 r-xp 00000000 08:01 149004     /lib/libnsl-2.3.4.so
  3. 00378000-00379000 r--p 00012000 08:01 149004     /lib/libnsl-2.3.4.so
  4. 00379000-0037a000 rw-p 00013000 08:01 149004     /lib/libnsl-2.3.4.so
  5. 0037a000-0037c000 rw-p 0037a000 00:00 0
  6. 0070c000-00722000 r-xp 00000000 08:01 147620     /lib/ld-2.3.4.so
  7. 00722000-00723000 r--p 00015000 08:01 147620     /lib/ld-2.3.4.so
  8. 00723000-00724000 rw-p 00016000 08:01 147620     /lib/ld-2.3.4.so
  9. 00726000-0084c000 r-xp 00000000 08:01 147621     /lib/tls/libc-2.3.4.so
  10. 0084c000-0084e000 r--p 00125000 08:01 147621     /lib/tls/libc-2.3.4.so
  11. 0084e000-00850000 rw-p 00127000 08:01 147621     /lib/tls/libc-2.3.4.so
  12. 00850000-00852000 rw-p 00850000 00:00 0
  13. 00891000-0089f000 r-xp 00000000 08:01 147624     /lib/tls/libpthread-2.3.4.so
  14. 0089f000-008a0000 r--p 0000d000 08:01 147624     /lib/tls/libpthread-2.3.4.so
  15. 008a0000-008a1000 rw-p 0000e000 08:01 147624     /lib/tls/libpthread-2.3.4.so
  16. 008a1000-008a3000 rw-p 008a1000 00:00 0
  17. 008a5000-008b4000 r-xp 00000000 08:01 147628     /lib/libresolv-2.3.4.so
  18. 008b4000-008b5000 r--p 0000f000 08:01 147628     /lib/libresolv-2.3.4.so
  19. 008b5000-008b6000 rw-p 00010000 08:01 147628     /lib/libresolv-2.3.4.so
  20. 008b6000-008b8000 rw-p 008b6000 00:00 0
  21. 009c7000-009cf000 r-xp 00000000 08:01 149005     /lib/tls/librt-2.3.4.so
  22. 009cf000-009d0000 r--p 00007000 08:01 149005     /lib/tls/librt-2.3.4.so
  23. 009d0000-009d1000 rw-p 00008000 08:01 149005     /lib/tls/librt-2.3.4.so
  24. 009d1000-009db000 rw-p 009d1000 00:00 0
  25. 00d28000-00d3b000 r-xp 00000000 08:02 688822     /usr/local/sinawap/lib/libevent-1.4.so.2.0.0
  26. 00d3b000-00d3c000 rw-p 00013000 08:02 688822     /usr/local/sinawap/lib/libevent-1.4.so.2.0.0
  27. 00d3c000-00d3d000 rw-p 00d3c000 00:00 0
  28. 08048000-08052000 r-xp 00000000 08:02 905179     /usr/local/sinawap/bin/memcached
  29. 08052000-08053000 rw-p 0000a000 08:02 905179     /usr/local/sinawap/bin/memcached
  30. 08053000-08056000 rw-p 08053000 00:00 0
  31. 08499000-084ba000 rw-p 08499000 00:00 0
  32. b7f64000-b7fa8000 rw-p b7f64000 00:00 0
  33. bff9f000-c0000000 rw-p bff9f000 00:00 0
  34. ffffe000-fffff000 r-xp 00000000 00:00 0

5、stats size

6、stats slabs

详细介绍stats slabs

  1. STAT 1:chunk_size 88
  2. STAT 1:chunks_per_page 11915
  3. STAT 1:total_pages 1
  4. STAT 1:total_chunks 11915
  5. STAT 1:used_chunks 11915
  6. STAT 1:free_chunks 0
  7. STAT 1:free_chunks_end 11914
  8. STAT active_slabs 1
  9. STAT total_malloced 1048520
  10. END

chunk_size:每个chunk(块)使用的空间数量,一个item存储到一个近似大小的chunk中

chunk_per_page:每page存在的chunk数量,slabs是按页(page)分配的,一页一般为1M,每个slab(也即每页)又划分为若干chunk,这里涉及到memcached的内存管理,这里不多解释,可以参考后面的附文。

total_pages:该slabclass分配到的page数量

total_chunks:该slabclass拥有的chunk数量

used_chunks:已经分配给item的chunk数量(不一定已经装填了item)

free_chunks:尚未分配给item的chunk数量,或者由delete释放的chunk

free_chunks_end:slabclass中最后一页的自由块数量,即该slabclass尚有多少自由块可以用来装填item

active_slabs:已分配的slabclass数量

total_malloced:已分配给slab page的内存数量

7、stats items 显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数)stats detail [on|off|dump]

设置或者显示详细操作记录

参数为on,打开详细操作记录

参数为off,关闭详细操作记录

参数为dump,显示详细操作记录(每一个键值get、set、hit、del的次数)

  1. stats items dump
  2. STAT items:1:number 7
  3. STAT items:1:age 23124
  4. STAT items:1:evicted 0
  5. STAT items:1:outofmemory 0
  6. .........
  7. END

8、stats cachedump slab_id limit_num   显示某个slab中的前limit_num个key列表

显示格式如下:ITEM key_name [ value_length b; expire_time|access_time s]其中,memcached 1.2.2及以前版本显示的是  访问时间(timestamp) 1.2.4以上版本,包括1.2.4显示 过期时间(timestamp)

如果是永不过期的key,expire_time会显示为服务器启动的时间

  1. stats cachedump 7 2
  2. ITEM copy_test1 [250 b; 1207795754 s]
  3. ITEM copy_test [248 b; 1207793649 s]stats slabs

显示各个slab的信息,包括chunk的大小、数目、使用情况等

9、stats detail dump  ( stats detail  [on|off|dump]  )

    1. PREFIX copy_test2 get 1 hit 1 set 0 del 0
    2. PREFIX copy_test1 get 1 hit 1 set 0 del 0
    3. PREFIX cpy get 1 hit 0 set 0 del 0

memcache基础知识的更多相关文章

  1. memcache基础知识-stats参数

    安装memcache: #tar -xvf libevent-1.4.13-stable.tar.gz#cd libevent-1.4.13-stable#./configure && ...

  2. IT运维的五大基础知识

    IT运维的五大基础知识 | 浏览:331 | 更新:2014-09-25 11:36 IT运维对于很多企业都很重要,接下来运维的一些基础知识天天客服IT运维总监龙少文,就给大家介绍下IT运维的基础知识 ...

  3. MySQL学习基础知识1

    什么是数据库? 数据库就是存储数据的仓库. 存储方式: 变量 无法永久存储 文件处理,可以永久存储,弊端:文件只能在自己的计算机读写,无法被分享(局域网除外) 数据库分类: 1.关系型数据库 提供某种 ...

  4. Magento 架构基础知识概述

    Megento 架构基础知识概述 Magento整合了面向对象的基于PHP的应用程序的核心架构原则.这些一般原则的综合讨论既有在线的,也有印刷形式.以下讨论主要关注这些主题如何直接应用于Magento ...

  5. PHP面试(二):程序设计、框架基础知识、算法与数据结构、高并发解决方案类

    一.程序设计 1.设计功能系统——数据表设计.数据表创建语句.连接数据库的方式.编码能力 二.框架基础知识 1.MVC框架基本原理——原理.常见框架.单一入口的工作原理.模板引擎的理解 2.常见框架的 ...

  6. java基础知识精华

    转载:https://www.jianshu.com/p/6c078abb720f java基础知识 java内存模型 java运行时数据区域 hashMap 如何解决冲突 存储方式 冲突达到一定数量 ...

  7. 【进阶之路】Redis基础知识两篇就满足(二)

    导言 大家好,我是南橘,一名练习时常两年半的java练习生,这是我在博客园的第二篇文章,当然,都是要从别处搬运过来的,不过以后新的文章也会在博客园同步发布,希望大家能多多支持^_^ 这篇文章的出现,首 ...

  8. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

  9. RabbitMQ基础知识

    RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...

随机推荐

  1. Java POI导入导出Excel

    1.异常java.lang.NoClassDefFoundError: org/apache/poi/UnsupportedFileFormatException 解决方法: 使用的poi的相关jar ...

  2. JS for循环 闭包

    对于for循环的闭包问题的理解,认为需要理解函数中的变量的作用域链的概念 另外提及下变量提升的概念 如下例子: var ar = [];for(var i=1:i<10; i++){ ar[i] ...

  3. Android 操作系统的内存回收机制(转载)

    Android 操作系统的内存回收机制(转载) Android APP 的运行环境 Android 是一款基于 Linux 内核,面向移动终端的操作系统.为适应其作为移动平台操作系统的特殊需要,谷歌对 ...

  4. Java中MyEclipse快捷键整理

    ************************************  MyEclipse 快捷键1(CTRL) ************************************ Ctrl ...

  5. 最全的jQuery知识汇总

    本帖最后由 断天涯大虾 于 2016-12-26 10:22 编辑<ignore_js_op> jQuery是什么? jQuery是javascript编写一个可重用的JavaScript ...

  6. mysql 在cento下源码安装

    虚拟机改为网络地址转换 (NAT) service network restartping www.baidu.com rpm -qa | grep mysql 有的话通过下面的命令来卸载掉 rpm ...

  7. mysql去重

    select a.id,a.ssmz,(select count(ssmz) from shop_tourist_key b where b.ssmz=a.ssmz) as count        ...

  8. 带阈值的平滑l0范数加速稀疏恢复——同名英文论文翻译

    原文链接:Thresholded Smoothed l0 Norm for Accelerated Sparse Recovery http://ieeexplore.ieee.org/documen ...

  9. Python 面向对象(初级篇)

    51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后 ...

  10. mysql主键uuid、uuid_short和int自增对比

    数据库主键性能对比: 名称 存储长度 生成方式 1. uuid 32+4 uuid()函数 2. uuid20 20 UUID_SHORT()函数 3. bigint自增 20 auto_increm ...