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.缓存更新机制 => 在快要失效的时候更新缓存

时间: 2024-10-27 03:18:00

memcached学习——memcached的内存分配机制Slab Allocation、内存使用机制LRU、常用监控记录(四)的相关文章

内核中内存分配--关于高端内存

Linux把物理内存划分为了三个管理区, 分别为0-16MB的ZONE_DMA, 16-896MB的ZONE_NORMAL和高于896MB的ZONE_HIGHMEM也就是高端内存. 至于为什么这么划分, ZONE_DMA好理解, 因为ISA总线只能对前16MB进行DMA寻址, 这块要分出来不能乱用. 而ZONE_NORMAL和ZONE_HIGHMEM为什么从896MB区分呢? 这还得从物理地址和虚拟地址说起. 默认情况下, 内核空间是指3GB-4GB的虚拟地址, 用户空间则是0-3GB. 内核进

垃圾收集器与内存分配策略(六)之内存分配与回收策略

垃圾收集器与内存分配策略(六)--内存分配与回收策略 对象的内存分配,一般来说就是在堆上的分配(但也可能经过JIT编译后被拆散为标量类型并间接地栈上分配),对象分配的细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数设置. 区分Minor GC与 Full GC: 新生代GC(Minor GC):指发生在新生代的的垃圾收集动作,因为Java对象大多具有朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快. 老年代GC(Full GC / Major GC):老

绘制FastMM内存分配流程图(小块内存分配)

http://blog.csdn.net/henreash/article/details/38751353

Memcached学习(二)--命令解析

整体流程 1. 当客户端和Memcached建立TCP连接后,Memcached会基于Libevent的event事件来监听客户端是否有可以读取的数据. 2. 当客户端有命令数据报文上报的时候,就会触发drive_machine方法中的conn_read这个Case. 3. memcached通过try_read_network方法读取客户端的报文.如果读取失败,则返回conn_closing,去关闭客户端的连接:如果没有读取到任何数据,则会返回conn_waiting,继续等待客户端的事件到来

C#中字符串的内存分配与驻留池

刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例.如下: String s1 = "Hello";String s2 = "Hello"; //s2和s1的实际值都是"Hello"bool same = (object) s1 == (object) s2; //这里比较s1.s2是否引用了同一个对象实例 //所以不能写作bool same =

Linux内核中常见内存分配函数

1.原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分别为: l   页全局目录(Page Global Directory) l   页上级目录(Page Upper Directory) l   页中间目录(Page Middle Directory) l   页表(Page Table) 页全局目录包含若干页上级目录的地址,页上级目录又依次包含若干页中间目录

Android内存优化1 了解java内存分配 1

开篇废话 今天我们一起来学习JVM的内存分配,主要目的是为我们Android内存优化打下基础. 一直在想以什么样的方式来呈现这个知识点才能让我们易于理解,最终决定使用方法为:图解+源代码分析. 欢迎访问我的个人博客:senduo's blog 希望能在我们平时开发写代码的时候,能够知道当前写的这段代码,内存方面是如何分配的. 我们深知,一个Java程序员在很多时候根本不用操心内存的释放,而是依靠JVM去管理,以前写C++代码的时候,却要时刻记着new的空间要及时释放掉,不然程序很容易出现内存溢出

Linux内核中常见内存分配函数zz

https://blog.csdn.net/wzhwho/article/details/4996510 1.      原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分别为: l         页全局目录(Page Global Directory) l         页上级目录(Page Upper Directory) l         页中间目录(

SQLite剖析之动态内存分配

SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.以及保存查询结果.我们做了很多努力来让SQLite的动态内存分配子系统可靠.可预测.健壮并且高效.本文概述SQLite的动态内存分配,软件开发人员在使用SQLite时可以据此获得最佳性能. 1.特性    SQLite内核和它的内存分配子系统提供以下特性:    (1)对内存分配失败的健壮处理.如果一个内存分配请求失败(即malloc()或realloc()返回NULL),SQ