memcache的内存管理探微

slab分配器:http://blog.csdn.net/luotuo44/article/details/42737181

hash操作  :http://blog.csdn.net/luotuo44/article/details/42773231

lru操作     :http://blog.csdn.net/luotuo44/article/details/42869325

配置参数   :http://blog.csdn.net/luotuo44/article/details/42672913

核心结构体

typedef struct _stritem {
    struct _stritem *next;
    struct _stritem *prev;
    struct _stritem *h_next;    /* hash chain next */
    rel_time_t      time;       /* least recent access */
    rel_time_t      exptime;    /* expire time */
    int             nbytes;     /* size of data */
    unsigned short  refcount;
    uint8_t         nsuffix;    /* length of flags-and-length string */
    uint8_t         it_flags;   /* ITEM_* above */
    uint8_t         slabs_clsid;/* which slab class we‘re in */
    uint8_t         nkey;       /* key length, w/terminating null and padding */
    uint64_t        cas_id;     /* the CAS identifier */
    void * end[];
    /* then null-terminated key */
    /* then " flags length\r\n" (no terminating null) */
    /* then data with terminating \r\n (no terminating null; it‘s binary!) */
} item;

typedef struct {
    unsigned int size;      /* sizes of items */
    unsigned int perslab;   /* how many items per slab */

    void **slots;           /* list of item ptrs */
    unsigned int sl_total;  /* size of previous array */
    unsigned int sl_curr;   /* first free slot */

    void *end_page_ptr;         /* pointer to next free item at end of page, or 0 */
    unsigned int end_page_free; /* number of items remaining at end of last alloced page */

    unsigned int slabs;     /* how many slabs were allocated for this class */

    void **slab_list;       /* array of slab pointers */
    unsigned int list_size; /* size of prev array */

    unsigned int killing;  /* index+1 of dying slab, or zero if none */
} slabclass_t;

  

时间: 2024-10-25 05:50:04

memcache的内存管理探微的相关文章

memcache的内存管理机制

Memcache使用了Slab Allocator的内存分配机制:按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题Memcache的存储涉及到slab,page,chunk三个概念1.Chunk为固定大小的内存空间,默认为96Byte.2.page对应实际的物理空间,1个page为1M.3.同样大小的chunk又称为slab.Memcached再启动的时候根据-n和-f参数,产生若干slab.具体应用中Memcache每次申请1page,并将这1M空间分割成若干个chu

memcache(三)内存管理

memcached(三)内存管理 memcached使用预申请的方式来管理内存的分配,从而避免内存碎片化的问题.如果采用mallo和free来动态的申请和销毁内存,必然会产生大量的内存碎片. 基本知识 slab:内存块是memcached一次申请内存的最小单元,在memcached中一个slab的默认大小为1M: slabclass:特定大小的chunk的组. chunk:缓存的内存空间,一个slab被划分为若干个chunk: item:存储数据的最小单元,每一个chunk都会包含一个item:

PHP扩展-生命周期和内存管理

1. PHP源码结构 PHP的内核子系统有两个,ZE(Zend Engine)和PHP Core.ZE负责将PHP脚本解析成机器码(也成为token符)后,在进程空间执行这些机器码:ZE还负责内存管理,变量作用域管理和对PHP函数的调度管理. PHP Core负责和SAPI层的通信:PHP Core也为safe_mode, open_basedir的检查提供了统一控制层:PHP Core还提供了streams层,用于用户域的文件和网络IO操作.其中SAPI(Server Application

memcached的内存管理与删除机制

memcached的内存管理与删除机制 简介 注意:Memcache最大的value也只能是1M的空间,超过1M的数据无法保存(修改memcache源代码). ? 注意:内存碎片化永远都存在,只是哪一种方式可以使得内存碎片最小. ? 1. 什么是内存碎片化? 在使用这种内存缓存系统的时候,由于不断的申请,释放,就会形成一些很小的内存片段,无法被利用,这种现象就叫做,内存的碎片化.这个小块就是操作系统无法使用的空间. ????注意:内存碎片化永远存在,无法消除,但是可以利用最好的算法,降到最低.

常见Key-Value存储系统的内存管理策略解析

Key-Value存储作为NoSQL存储的一种常见方式,提供了比SQL数据库更好的可扩展性和读写性能.比如当前开源最热门的Memcached和Redis:淘宝的Tair.腾讯的Cmem.Amazon的Dynamo等等,无论是做缓存还是持久存储,均使用内存作为主要存储介质,故内存管理策略就显得尤为重要了,是影响性能的重要因素. 这里从源代码层面对Memcached.Redis和UDC(腾讯以前用的一套KV持久化存储系统)的内存管理策略进行分析,3者的内存管理策略各不相同,其他KV系统也和这3种方法

slab内存管理分享

1.什么是slab Slab 是中内存管理算法,最早是由sun的工程师提出,主要是基于一下因数考虑: 1:内核函数经常倾向于反复请求相同的数据类型.比如:创建进程时,会请求一块内存来存放mm结构. 2:不同的结构使用不同的分配方法可以提高效率.同样,如果进程在撤消的时候,内核不把mm结构释放掉,而是存放到一个缓冲区里,以后若有请求mm存储空间的行为就可以直接从缓冲区中取得,而不需重新分配内存. 3:前面我们曾分析过,如果伙伴系统频繁分配,释放内存会影响系统的效率,以此,可以把要释放到的内存放到缓

操作系统基本组成--内存管理

内存管理,是指软件运行时对计算机内存资源的分配和使用的技术.其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源. 一·技术简介 内存可以通过许多媒介实现,例如磁带或是 磁盘,或是小阵列容量的微芯片.虚拟内存是内存管理技术的一个极其实用的创新.它是一段程序(由 操作系统调度),持续监控着所有 物理内存中的 代码段. 数据段,并保证他们在运行中的效率以及可靠性,对于每个 用户层(user-level)的进程分配一段 虚拟内存空间. 二·主内存 当一个程序执行, 操作系统将程序的

JVM自动内存管理机制——Java内存区域

一.JVM运行时数据区域概述 Java相比较于C/C++的一个特点就是,在虚拟机自动内存管理机制的帮助下,我们不需要为每一个操作都写像C/C++一样的delete/free代码,所以也不容易出现内存泄漏和内存溢出的问题.显然,这里的不容易只是相对而言的,如果我们想要降低这种代码隐患的发生,就需要对Java虚拟机怎样使用内存有了解,这样的话就算产生错误,排查起来也会相对容易.下面我们来说一说JVM运行时数据区域 1.程序计数器(PC寄存器): 被看作是当前线程所执行的字节码的行号指示器,字节码解析

内存管理:避免内存溢出和频繁的垃圾回收

一.前言 在高并发.高吞吐量的极限情况下,简单的事情就会变得没有那么简单了. 一个业务逻辑非常简单的微服务,日常情况下都能稳定运行,一到大促就卡死甚至进程挂掉. 一个做数据汇总的应用,按照小时.天这样的粒度进行数据汇总都没有问题,到年底需要汇总全年数据的时候,没等数据汇总出来,程序就死掉了. 出现这些情况的大部分原因是,在程序设计时,没有针对高并发高吞吐量的情况做好内存管理. 二.内存管理机制 现代编程语言,想Java.Go等,采用的都是自动内存管理机制.在编写代码时,不需要显式去申请和释放内存