Memcached的内存管理与删除机制

注意:Memcache最大的value也只能是1M的空间,超过1M的数据无法保存(修改memcache源代码)。

注意:内存碎片化永远都存在,只是哪一种方式可以使得内存碎片最小。

1. 什么是内存碎片化?

在使用这种内存缓存系统的时候,由于不断的申请,释放,就会形成一些很小的内存片段,无法被利用,这种现象就叫做,内存的碎片化。这个小块就是操作系统无法使用的空间。

Memcached的内存管理与删除机制

    注意:内存碎片化永远存在,无法消除,但是可以利用最好的算法,降到最低。

注意:磁盘也是存在碎片化

Memcached的内存管理与删除机制

2. 如何解决?

memcache利用slab allocator的方式来管理(每个slab class大小为1M

最小的单元叫做 chunk(小块):存放数据的仓库

多个小单元组成一个chunks:多个小块组成(所有的小块的大小全部一致)

每个 slab class的大小为1M

注意:单个chunk 最大只能为 1M,也就是memcache的value值最大为1M

Memcached的内存管理与删除机制

3. memcache如何选择合适的大小?

Memcached的内存管理与删除机制

注意:如果 122Bytes的slab装满了,现在有一个100Bytes的数据来了,存到哪里去?

答:肯定不会存在144,还是存在122这个chunk里面,利用LRU算法来实现数据存储。

LRU算法:最近最少使用原则。最近一段时间来,哪一个数据基本完成没有被使用过,则就清除掉这个数据。然后让新数据放到里面。

但是,固定chunk带来的内存浪费,如下22B

Memcached的内存管理与删除机制

4. factor调优

Memcached的内存管理与删除机制

memcached在启动的时候,会按照一定的大小来组织slab class,可以通过-f 来指定

默认是1.3,相邻chunk之间的比值就是增加因子。可以根据自己网站的业务调整缓存因子的大小

Memcached的内存管理与删除机制

是因为每个业务不一样,所需要的最小的chunk是不一样的。这个参数使得我们的系统变得更加适应自己的业务,因为数据可以自己设定大小。

5. memcache的惰性删除

memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种行为被称为lazy(惰性)expiration。因此,好处是memcached不会在过期监视上耗费CPU时间。

比如:有 set(name, asion, 0, 3600) 过了3600秒就失效,失效后,并不会自动删除,只有当get查询时,检测是否过期,如果过期则删除,填充新的数据

6. memcache的LRU算法

memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。

顾名思义,这是删除"最近最少使用"的记录的机制。因此,当memcached的内存空间不足时(无法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空

间分配给新的记录。从缓存的实用角度来看,该模型十分理想。

当mecache里面的数据空间(默认是64M)已经占满了,再继续存储数据能否存储呢?

答:能存储,要删除过期的数据,如果都没有过期,则删除最不活跃的数据,腾出空间给后面添加数据。

例如:以122Bytes的slab举例,当数据装满后,如果来了一个100Bytes数据,如何处理?

分析:内存的管理 LRU算法 、FIFO算法(基本不用)

7. memcache的一些参数

注意:在vim下如果输入了 ctrl+s 可以使用 ctrl+q 退出

-p 监听的端口

-l 连接的IP地址, 默认是本机

-d start 启动memcached服务

-d restart 重起memcached服务

-d stop|shutdown 关闭正在运行的memcached服务

-d install 安装memcached服务

-d uninstall 卸载memcached服务

-u 以的身份运行 (仅在以root运行的时候有效)

-m 最大内存使用,单位MB。默认64MB

注意:如果系统是32位的,则最大限制为2G,如果系统是64位,则无限制。

-M 内存耗尽时返回错误,而不是删除项

-c 最大同时连接数,默认是1024

-f 块大小增长因子,默认是3

-n 最小分配空间,key+value+flags默认是48

-h 显示帮助

-v 输出警告和错误信息

-vv 打印客户端的请求和返回信息

-i 打印memcached和libevent的版权信息

高级特性 分布式memcache配置

什么是分布式?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/bf71dcdc46d560d16c4aef09258f81b1.html