memcached学习——memcached的内存分配机制Slab Allocation、内存使用机制LRU、常用监控记录(四)
内存分配机制Slab Allocation
本文参考博客:https://my.oschina.net/bieber/blog/505458
Memcached的内存分配是以slabs为单位的,会根据初始chunk大小、增长因子、存储数据的大小实际划分出多个不同的slabs class,slab class中包含若干个等大小的trunk和一个固定48byte的item信息。trunk是按页存储的,每一页成为一个page(默认1M)。
1.slabs、slab class、page三者关系:
slabs = slab Class1 + slab Class2 + ... + Slab Classn
sbal Class = trunkSize * trunkCount * pageCount
trunkCount = pageSize / trunkSize
trunkSize = 实际数据大小 + 48byte(items数据结构)

例:假定每个slab Class的page都是1,则Slab Class1 = 88byte * trunkCount * 1
启动memcached时用-vv参数key输出slabs信息,我们可以看到slabs的数据正是基于增长因子递增的,但是数据会略有误差~

2.实际数据的存储会选择合适的空间,比如我要存储一个52byte的数据,实际需要100byte空间
52+ 48 = 100byte,会将数据存储到112bytes所对应的slabls里,占用一个trunk

3.机制内存浪费问题:

优点:以前是内存分配机制是malloc~free,有内存碎片问题。此种机制解决了内存碎片问题
缺点:如果增长因子设置的不合适,可能造成空间的浪费问题。因为trunk的大小是固定的,只能是数据去适应trunk的大小(data <=trunk)
内存使用机制LRU
当memcached中的数据过期时,并非直接释放掉相关内存,因为没有响应的监听来处理这件事。flush_all也一样不会释放内存,只是这些失效数据对用户透明,用户无法检索到这些数据。Memcached已分配的内存不会进行回收操作,但是可以进行重利用操作。Memcached会优先使用已经过期的内存。当内存不足时,通过LRU机制将长期不使用的内存分配给新的记录。
注意:启动参数带-M的不支持LRU操作
常用监控
telnet命令行,直接操作stats、stats slabs等命令进行分析
Memcached.php =》 php系统使用apache服务,图形化界面
daemontools =》 不知道是啥,先记下来
Nagios =》 checktcp =》 不知道是个啥,先记下来
优化思路
1.合理的增长因子 => 控制内存的合理消耗
2.缓存更新机制 => 在快要失效的时候更新缓存
memcached学习——memcached的内存分配机制Slab Allocation、内存使用机制LRU、常用监控记录(四)的更多相关文章
- 内存管理(memory allocation内存分配)
Memory management is the act of managing computer memory. The essential requirement of memory manage ...
- Java虚拟机创建对象的内存分配以及对象的内存布局
本博文知识参考周志明<深入理解Java虚拟机> Java虚拟机在创建对象使如果进行内存分配: 1.指针碰撞 2.空闲列表 Java在多线程情况下创建对象的内存分配: Java完成对象内存分 ...
- 绘制FastMM内存分配流程图(小块内存分配)
http://blog.csdn.net/henreash/article/details/38751353
- C++学习011-常用内存分配及释放函数
C++用有多种方法来分配及释放内存,下面是一些经常使用的内存分配及释放函数 现在我还是一个技术小白,一般用到也指示 new+delete 和 malloc和free 其他的也是在学习中看到,下面的文字 ...
- Redis深入学习笔记(六)Redis内存分配
Redis的高效可以说是轻量级的epoll模型和基于内存的读写共同组成的,关于epoll对于以前的select或者poll的性能优势这里不做介绍,本篇主要介绍领一个重点,Redis的内存分配原理. 获 ...
- 第二章 JVM内存分配
注意:本篇博客,主要参考自以下四本书 <分布式Java应用:基础与实践> <深入理解Java虚拟机(第二版)> <突破程序员基本功的16课> <实战java虚 ...
- c# 字符串的内存分配和驻留池( 转 )
刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例.如下: string s1 = "he ...
- Linux内存管理 (5)slab分配器
专题:Linux内存管理专题 关键词:slab/slub/slob.slab描述符.kmalloc.本地/共享对象缓冲池.slabs_partial/slabs_full/slabs_free.ava ...
- Linux内核中常见内存分配函数【转】
转自:http://blog.csdn.net/wzhwho/article/details/4996510 1. 原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页 ...
随机推荐
- Hybrid App开发模式中, IOS/Android 和 JavaScript相互调用方式
IOS:Objective-C 和 JavaScript 的相互调用 iOS7以前,iOS SDK 并没有原生提供 js 调用 native 代码的 API.但是 UIWebView 的一个 dele ...
- Eclipse调试时出现source not found的问题
Eclipse中新加载了一个java项目,打断点debug时,Debug小窗口显示source not found,网搜找到了解决办法,在此记录一下. 原文地址:http://blog.csdn.ne ...
- PyInstaller打包Python脚本为exe
1.PyInstaller-3.1.1 百度云链接 http://pan.baidu.com/s/1jHYWin8 密码 oapl 2.安装最新版本的 pywin32-217.win32-py2 ...
- iOS开发:深入理解GCD 第一篇
最近把其他书籍都放下了,主要是在研究GCD.如果是为了工作,以我以前所学的GCD.NSOperation等知识已经足够用了,但学习并不仅仅知识满足于用它,要知其然.并且知其所以然,这样才可以不断的提高 ...
- NOTIFYICONDATA结构
//农机调度项目代码 NOTIFYICONDATA m_notifyData; m_notifyIcon.ChangeIcon(IDI_PAUSE, _T("监控终端server已暂停&qu ...
- GDB实用的调试工具
GDB它是GNU Debuger缩写,它是GNU发表了unix通过应用程序调试工具. 它被广泛应用于在各种各种生产内部应用.GDB和所有的调试工具经常使用相同的,其主要特点是:监视变量的值.设置断点及 ...
- .NET技术
1.在C#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别.回答要点:说明详细的空间分配.(10分) 解:string str=null ...
- Oracle触发器Trigger4触发条件_when的使用
/* 同一表使用所有条件 Create or replace trigger t5 Before insert,delete,update on 表名 For each row //plsql块 */ ...
- (一)backbone - API入门
初探 backbone采用MVC模式,本身提供了模型.控制器和视图从而我们应用程序的骨架便形成. Backbone.js 唯一重度依赖 Underscore.js. 对于 RESTful , hist ...
- Struts2.3.16.3 基本9个jar包
实践证明,Struts2.3.16.3 至少要下面9个Jar包才能正常启动. commons-fileupload-1.3.1.jar commons-logging-1.1.3.jar freema ...