zoukankan      html  css  js  c++  java
  • 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.缓存更新机制 => 在快要失效的时候更新缓存

  • 相关阅读:
    算法题之丢手绢问题
    Java接口成员变量和方法默认修饰符
    清空select下拉框的方法
    Java基础数据类型的默认值
    JVM内存区域划分
    Java中匿名内部类
    Java值传递
    部署web Service到tomcat
    Tomcat环境下配置数据源
    遇到和需要解决的问题
  • 原文地址:https://www.cnblogs.com/douJiangYouTiao888/p/6267569.html
Copyright © 2011-2022 走看看