zoukankan      html  css  js  c++  java
  • memcached内存分配机制

    memcached的内存分配没有用到c语言中自带的malloc函数,因为这个函数分配内存的时候效率很低,对于这种要求快速响应,对效率要求非常高的缓存软件来说非常不合适。

    memcached用的是自己的一套内存分配方法,叫做slab allocation,如下图:


    Slab Allocation的原理相当简单,就是将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合),每个组分别存放于各个slab仓库里。

    Slab Allocation缓存原理:

    memcached根据收到数据的大小,选择最合适数据大小的slab
    memcached中保存着slab内空闲chunk的列表
    根据该列表选择chunk,然后将数据缓存与其中

    Memcached内存管理:
    1.内存的碎片化
    如果用C语言直接malloc,free来向操作系统申请和释放内存时,在不断的申请和释放过程中,形成了一些很小的内存片断,无法再使用,这种空闲,但无法利用的内存现象,称为内存的碎片化


    2.memcache是如何克服内存的碎片化的?
    memcached用slab allcoator机制来管理内存
    基本原理:预告把内存划分成数个slab仓库,各仓库切分成不同尺寸的小块(chunk),需要内存时,判断内存的大小,为其选取合理的块

    警示:
    如果有100byte的内容要存,但是122大小的仓库中的chunk满了,这时memcached不会去找更大的chunk去存储,而是把122仓库的旧数据踢掉


    3.对于固定大小的chunk,也会有浪费的,如何缓解
    对于特定的网站,可以长期的统计网站内缓存数据,按照网站的特点,设置chunk的大小(-n)


    4.一般而言,观察缓存数据大小的变化规律,设置合理的增长因子(-f),Grow factor,默认是1.25倍

    总结:

    **一个memcahced进程会预先将自己划分为若干个slab,slab得数量是有限的,跟进程配置的内存无关,跟-f(增长因子),-I(page大小:page ressign已经从1.2.8版移除了),-n(初始chunk大小)有关。

    **slab的数量最大是200(当指定-f 1.0001)时,增长因子越大,slab越少,-f  不能小于1。

    **可以通过-I指定page的大小,单位是byte,page默认是1M,最小需要1024byte, page值设置的越大slab越多。(已作废

    **-n(最小分配空间):默认是48,此时初始chunk的大小是96,(注意并不是2倍的关系,当设置为50时,第一个chunk的大小是104),-n越大slab越少。

     

  • 相关阅读:
    Delete Node in a Linked List leetcode
    Remove Linked List Elements leetcode
    Remove Linked List Elements
    Remove Element leetcode
    Merge Sorted Array leetcode
    Min Stack leetcode
    Valid Palindrome leetcode
    [LeetCode] 1. Two Sum
    [LeetCode] 520. Detect Capital
    [LeetCode] 791. Custom Sort String
  • 原文地址:https://www.cnblogs.com/eaglezb/p/6420161.html
Copyright © 2011-2022 走看看