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位系统的内存分页 ...
随机推荐
- warning: the `gets' function is dangerous and should not be used.(转)
今天在LINUX下编译C程序时,出现了:warning: the `gets' function is dangerous and should not be used. 这个warning. 百度之 ...
- springmvc+mongodb+maven 项目搭建配置
操作步骤我就不再细化了 项目能运行,测试过了,先上配置,另一篇文章上代码,点击下载源码 项目结构 pom.xml <project xmlns="http://maven.apache ...
- windows 查看端口被占用
C:\Users\xxxx> 根据端口找到进程14716 C:\Users\xxxx>tasklist|findstr "14716"node.exe 14716 Co ...
- ubuntu 14.04下练习lua
随着lua越来越成熟,在服务器中应用也越来越广.自己也想向这方面发展,于是便开始lua的学习. 学习新的语言,应该是先编译.安装.部署开发调试环境,然后练习...可是,我现在并没有项目做啊,我只是想先 ...
- Oracle 用户、对象权限、系统权限
--================================ --Oracle 用户.对象权限.系统权限 --================================ 一.用户与模式 ...
- 安装sql server提示挂起报错
在安装sql server时出现“以前的某个程序安装已在安装计算机上创建挂起的文件操作.运行安装程序之前必须重新启动计算机”错误.无法进行下去. 参考有关资料后,以下步骤基本可以解决: 1)添加/删除 ...
- VCS仿真生成fsdb文件(Verilog)
VCS仿真生成fsdb文件(Verilog) 一.环境 Linux 平台 csh环境 VCS 64bit Verdi3 二.开始仿真 1. 联合仿真环境配置 a.在testbench中加入如下语句: ...
- Javascript基础引用类型之Object
虽然说ECMAScript也是一门对象语言,但是它和其他面向对象语言还是有区别的,它不具有类和接口等基本结构.所以在ECMAScript中一般说类指的是引用类型.创建Object实例的方式有两种: 第 ...
- DevExpress ASPxHtmlEditor控件格式化并导出Word (修复中文字体导出丢失)
在前台页面中先插入一个ASPxHtmlEditor控件,名为ASPxHtmlEditor1. 我用的Dev版本为14.1 格式化文本 在后台插入如下代码 1 const string css ...
- AVT Vimba与OpenCV环境配置
近来,由于项目需求,需要使用AVT的一款相机采集图像并进行相应的算法处理.环境的配置过程较为复杂,特此记录,以做备忘.也给有需要的小伙伴们一些key point的分享. 搭建环境:Windows7 + ...