前言

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

slab allocator

图1-1

slab allocator的机制非常简单,它根据配置的内存大小,以页(page)为单位向操作系统申请内存,将其分割成各种尺寸的块(chunk),尺寸相同的块组合在一起就是slab。其中,chunk就是用来存储数据的最小单位。为了便于理解,我们可以在启动memcached的时候加上-vv来查看内存规划的情况:

[root@vm10 bin]# /usr/local/memcached/bin/memcached -u root -l 192.168.56.10 -p 32054 -P /tmp/memcached_32054.pid -vv
#slab编号 chunk大小 chunk个数
slab class 1: chunk size 96 perslab 10922
slab class 2: chunk size 120 perslab 8738
#篇幅有限,此处省略若干条...
slab class 39: chunk size 524288 perslab 2

  

注意此时memcached并不会立马申请内存,而是等要存数据的时候才去申请。

可以看到,memcached规划出39个slab,chunk大小的范围:96字节~524288字节,越往后越大,增长速度是1.25,这个速度被称为增长因子。每个slab里面chunk的个数也罗列出来了,我们可以计算出每个slab里chunk大小乘以chunk个数刚好等于1m,也就是一页。为什么是一页呢?因为我这个memcached是刚启动,还没有存数据,当这一页的内存都写满数据了,memcached就会再申请一页的内存。接下来详细说一下存数据的过程:

1.memcached根据数据的大小选择slab,如图1-1的情况,当有80字节的数据过来的时候,就会分配给slab1,当有100字节的数据过来的时候,就会去到slab2。

2.找到slab之后要看看存到哪个chunk里边去,因为memcached保存着slab内空闲chunk列表,所以根据该列表很快就能找到要把数据存到哪个chunk里面

3.当没有空闲chunk可用时,memcached会给这个slab申请一页(page)大小的内存(默认1m),然后切分成大小相同的chunk,再把数据放到新的chunk中

4.如果没有内存可以申请了,则会对该slab进行lru,而不是对整个memcache进行lru。

结论

1.申请内存是以页为单位去申请的,这样省去了频繁申请内存的开销

2.重复使用已分配的内存,也就是说,分配到的内存不会被释放,而是重复利用,这样省去了频繁释放内存的开销

3.因为chunk是固定大小的,所以会导致内存浪费。比如100字节的数据放到120字节的chunk里,就浪费掉了20字节的内存。但这个浪费不是永久的,当数据过期的时候会有新数据存入,比如下次是119字节的数据放到这块120字节的chunk里,就只浪费了1字节而已。减少浪费的解决办法是我们可以调节增长因子来改变chunk的大小

性能优化

1.通过-f和-n调整chunk的增长因子和第一个chunk的大小,这个要根据项目中数据大小的分布来决定,来达到内存最大化地利用,避免浪费

2.stats查看get hits、get misses计算命中率,如果命中率太低,需要查明原因

3.stats查看evictions查看LRU次数,如果频繁LRU说明内存不足了

删除机制

1.memcached不主动去删除过期的数据,而是在get的时候检查数据是否过期,如果过期了那么就不可见,然后把当前chunk加入空闲列表,这样下次有数据存入就会更新掉这块chunk的数据而达到删除的作用了,所以memcached不会在淘汰数据上面消耗CPU,这种方式称为lazy expiration(惰性删除)

2.当没有空闲的chunk可以用,又实在没有内存可以申请了,memcached会对当前slab执行LRU(least recently used 最近最少使用)来删除数据,注意是当前slab

memcached内存管理的更多相关文章

  1. memcached 内存管理 分析(转)

    Memcached是一个高效的分布式内存cache,了解memcached的内存管理机制,便于我们理解memcached,让我们可以针对我们数据特点进行调优,让其更好的为我所用.这里简单谈一下我对me ...

  2. 简述 Memcached 内存管理机制原理?

    早期的 Memcached 内存管理方式是通过 malloc 的分配的内存,使用完后通过 free 来回收内存,这种方式容易产生内存碎片,并降低操作系统对内存的管理效 率.加重操作系统内存管理器的负担 ...

  3. 分布式缓存技术memcached学习(三)——memcached内存管理机制

    几个重要概念 Slab memcached通过slab机制进行内存的分配和回收,slab是一个内存块,它是memcached一次申请内存的最小单位,.在启动memcached的时候一般会使用参数-m指 ...

  4. Memcached内存管理模型分析

    Memcached 是一个高性能的分布式内存对象缓存系统,它通过在内存中缓存数据和对象来减少读取数据库的次数,从而减轻RDBMS的负担,提高服务的速度.提升可扩展性.本文将基于memcached1.4 ...

  5. Memcached 内存管理详解

    Memcached是一个高效的分布式内存cache,了解memcached的内存管理机制,便于我们理解memcached,让我们可以针对我们数据特点进行调优,让其更好的为我所用. 首先需要我们先了解两 ...

  6. memcached内存管理机制[未整理]

    memcached默认采用的是Slab Allocator的机制分配管理内存的,在此之前,内存的分配是通过对所有的记录简单地进行malloc和free来进行的,但这种方式容易造成很多内存碎片,加重操作 ...

  7. 分布式缓存技术memcached学习系列(三)——memcached内存管理机制

    几个重要概念 Slab memcached通过slab机制进行内存的分配和回收,slab是一个内存块,它是memcached一次申请内存的最小单位,.在启动memcached的时候一般会使用参数-m指 ...

  8. memcached内存管理机制分析

    memached是高性能分布式内存对象系统,通过在内存中存储数据对象来减少对磁盘的数据读取次数,提高服务速度. 从业务需求出发.我们通过一条命令(如set)将一条键值对(key,value)插入mem ...

  9. 分布式缓存系统 Memcached 内存管理机制

    在前面slab数据存储部分分析了Memecached中记录数据的具体存储机制,从中可以看到所采用的内存管理机制——slab内存管理,这也正是linux所采用的内存高效管理机制,对于Memchached ...

随机推荐

  1. Babel运行原理

    前言     之前翻博客园的时候,看到有人朋友分享阿里巴巴的面试题,其中有一道题就是关于ES6转ES5 原理的,当时我看到感觉到自己离去阿里巴巴的路还很远啊,像我们大部分做开发的时候,都只知其然不知 ...

  2. maven的java web项目启动找不到Spring ContextLoaderListener的解决办法

    用maven搭建的java web项目,上传到git仓库后,当同事clone下来项目,部署到tomcat运行时,就报了如下错误,即启动web项目时,加载web.xml文件,找不到spring的监听器, ...

  3. 文本可视化[二]——《今生今世》人物关系可视化python实现

    文本可视化[二]--<今生今世>人物关系可视化python实现 在文本可视化[一]--<今生今世>词云生成与小说分析一文中,我使用了jieba分词和wordcloud实现了,文 ...

  4. LINUX 笔记-命令执行顺序 && ,||

    && 格式:命令1 && 命令2 说明:命令1返回真(即返回0,成功被执行)后,命令2才能够被执行 例:/apps/bin目录将会被移到/apps/dev/bin目录下 ...

  5. Spring源码情操陶冶-AOP之ConfigBeanDefinitionParser解析器

    aop-Aspect Oriented Programming,面向切面编程.根据百度百科的解释,其通过预编译方式和运行期动态代理实现程序功能的一种技术.主要目的是为了程序间的解耦,常用于日志记录.事 ...

  6. Java基础笔记12

    1.自定义异常. 定义一个类,让该类继承Exception.并写出该类的所有的构造函数.2.IO流. java.io 文件类.File 字节输入和输出流 InputStream OutputStrea ...

  7. OpenCV4Android

    前文曾详细探讨了关于OpenCV的使用,原本以为天下已太平.但不断有人反应依然配不好OpenCV4Android,不能得心应手的在Android上使用OpenCV,大量的精力都浪费在摸索配置上.尤其是 ...

  8. 使用Identity Server 4建立Authorization Server (1)

    预备知识: http://www.cnblogs.com/cgzl/p/7746496.html 本文内容基本完全来自于Identity Server 4官方文档: https://identitys ...

  9. nova创建虚拟机源码分析系列之六 api入口create方法

    openstack 版本:Newton 注:博文图片采用了很多大牛博客图片,仅作为总结学习,非商用.该图全面的说明了nova创建虚机的过程,从逻辑的角度清晰的描述了前端请求创建虚拟机之后发生的一系列反 ...

  10. http 500错误怎么解决方法

    出现500错误的原因是很多的,一般来说,如果程序出错,那么在浏览器内会返回给用户一个友好的错误提示,统一称之为服务器500错误. 解决的方法就是您必须在http中能够正确的获得错误信息,方法为:请打开 ...