memcache内存分配策略

一、memcache介绍

memcache是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据

库的次数,从而提高了网站访问的速度memcache是一个基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写

MemCached是MemCache服务器端可以执行文件的名称。这篇文章就不讲memcache的安装,感兴趣的可以去看看其他文章。

二、memcache内存分配策略

当往memcache中存储对象时,memcache并不是简单的按对象大小来分配内存,因为这种情况下会导致内存碎片,加重操作系统内存管理器的负担。memcache采用的是slab allocation的内存分配策略。如图所示:

1、MemCache将内存空间分为一组slab
2、每个slab下又有若干个page,每个page默认是1M,如果一个slab占用100M内存的话,那么这个slab下应该有100个page
3、每个page里面包含一组chunk,chunk是真正存放数据的地方,同一个slab里面的chunk的大小是固定的
4、有相同大小chunk的slab被组织在一起,称为slab_class

 Slaballocation的基本原理是按照预先规定的大小,将分配的内存以page为单位进行分割,默认情况下一个page是1M,可以通过-I参数在启动时指定,分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),如果需要申请内存时,memcached会划分出一个新的page并分配给需要的slab区域。page一旦被分配在重启前不会被回收或者重新分配,以解决内存碎片问题。

slab的内存分配具体过程如下:

       Memcached在启动时通过-m参数指定最大使用内存,但是这个不会一启动就占用完,而是逐步分配给各slab的。如果一个新的数据要被存放,首先选择一个合适的slab,然后查看该slab是否还有空闲的chunk,如果有则直接存放进去;如果没有则要进行申请,slab申请内存时以page为单位,无论大小为多少,都会有1M大小的page被分配给该slab(该page不会被回收或者重新分配,永远都属于该slab)。申请到page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk的数组,再从这个chunk数组中选择一个用于存储数据。若没有空闲的page的时候,则会对改slab进行LRU,而不是对整个memcache进行LRU。

接下来我们通过一组memcache命令来查看memcache的内存分配策略,首先通过telnet命令连接上mencached服务器,通过stats slabs命令我们可以看到memcache的slab信息,如下图所示:

图里我们可以看到,一共有7个在使用中的slab,各个字段的含义如下

chunk_size:slab中每个chunk的大小,这也是该slab能存储的最大item size上限。

chunks_per_page:每个page中chunk数量 chuans_per_size = page大小/chunk_size

total_pages:该slab中的page数量

total_chunks:该slab中的chunk总数

used_chunks:已经使用过的chunk数量

free_chunks:未使用的chunk数量

total_malloced:实际已经分配的总内存数,这个数值决定memcache还能申请多少内存。

通过stats命令可以查看memcache能申请的总内存大小,如下图所示

limit_maxbytes表示memcache能申请的最大内存数,单位为byte,这里为64m.

关于memcache的总结

·· 1、MemCache中可以保存的item数据量是没有限制的,只要内存足够
2、MemCache单进程在32位机中最大使用内存为2G,这个之前的文章提了多次了,64位机则没有限制
3、Key最大为250个字节,超过该长度无法存储
4、单个item最大数据是1MB,超过1MB的数据不予存储
5、MemCache服务端是不安全的,比如已知某个MemCache节点,可以直接telnet过去,并通过flush_all让已经存在的键值对立即失效
6、不能够遍历MemCache中所有的item,因为这个操作的速度相对缓慢且会阻塞其他的操作


参考:https://docs.oracle.com/cd/E17952_01/mysql-5.1-en/ha-memcached-using-memory.html#ha-memcached-fig-slabs

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章