总结下我对memcached的内存管理的理解,有不对的地方请不吝指正^_^。
我用的版本是最新的1.4.5
chunk:咱cache数据的地方,数据的大小不能超过1M。
page:分配给stab class的内存页,默认为1M,chunk的内存就是在这上面划分出去的。
stab class:很多相同size的chunk在一起组成一个stab class。
memcached和这三者之间的关系:
memcached启动时会按尺寸生成一组stab class,stab class的数量是根据你设置的参数决定的,在整个生命周期内不会再新增。
每个stab class在启动时会预分配一个page,在这个page上划分特定size的chunk。
当一个stab class的chunk使用完成后,memcached会查找是否有空余page可以使用,如果有则将page加入该stab class,没有则执行LRU(前提是你没有使用 -M参数启动)。
注意:
LRU是针对stab class的,不是全memcached的。
看一个具体的例子
[root@p2ash004 ~]# memcached -p 11211 -u root -m256 -n 512 -vv
slab class 1: chunk size 560 perslab 1872
slab class 2: chunk size 704 perslab 1489
slab class 3: chunk size 880 perslab 1191
slab class 4: chunk size 1104 perslab 949
slab class 5: chunk size 1384 perslab 757
slab class 6: chunk size 1736 perslab 604
slab class 7: chunk size 2176 perslab 481
slab class 8: chunk size 2720 perslab 385
slab class 9: chunk size 3400 perslab 308
slab class 10: chunk size 4256 perslab 246
slab class 11: chunk size 5320 perslab 197
slab class 12: chunk size 6656 perslab 157
slab class 13: chunk size 8320 perslab 126
slab class 14: chunk size 10400 perslab 100
slab class 15: chunk size 13000 perslab 80
slab class 16: chunk size 16256 perslab 64
slab class 17: chunk size 20320 perslab 51
slab class 18: chunk size 25400 perslab 41
slab class 19: chunk size 31752 perslab 33
slab class 20: chunk size 39696 perslab 26
slab class 21: chunk size 49624 perslab 21
slab class 22: chunk size 62032 perslab 16
slab class 23: chunk size 77544 perslab 13
slab class 24: chunk size 96936 perslab 10
slab class 25: chunk size 121176 perslab 8
slab class 26: chunk size 151472 perslab 6
slab class 27: chunk size 189344 perslab 5
slab class 28: chunk size 236680 perslab 4
slab class 29: chunk size 295856 perslab 3
slab class 30: chunk size 369824 perslab 2
slab class 31: chunk size 462280 perslab 2
slab class 32: chunk size 577856 perslab 1
slab class 33: chunk size 722320 perslab 1
slab class 34: chunk size 1048576 perslab 1
在这里,我给memcached分配了256M内存(-m 256),chunk的初始值设置为512bytes(-n 512)
slab class 1: chunk size 560 perslab 1872
为什么chunk size 是560呢?因为还有48bytes来存储结构信息。
slab class 2: chunk size 704 perslab 1489
no:2的chunk size 为 704,是因为默认的增长因子是1.25,704 = 560 * 1.25 +4,后面的+4是为了内存对齐,保证为8的倍数。
no:n就类推就可以了。
我们可以看到memcached一个预生成了34个slab class,每个slab class占用1M内存(也就是预分配了一个page)。
还有(256-34=222)个page是可以根据需要分配给各个slab class使用的。
分享到:
相关推荐
计算机后端-PHP视频教程. Memcached12 memcached内存管理机制.wmv
Memcached源码分析之内存管理Memcached源码分析之内存管理
memcached-win64好用的内存管理机制,可以让程序和性能发挥 出色运行特征。受开发者的首选。它是64位的。
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的...
ydx_slab_util实现一个内存池,内存管理机制借鉴memcached,使用一系列链表管理不同大小的内存区块。memcached一次分配(默认64M)固定大小的内存区域,使用完毕后使用LRU淘汰最早不使用的内存段。作为一个通用内存池...
但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下, 会导致操作系统比memcached进程本身还慢。SlabAllocator就是为解决该问题而诞生的。下面来看看SlabAllocator的原理。下面是memcached...
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的...
《Memcached内存分析、调优、集群.pptx》 《NET版分布式缓存Memcached测试实例.docx》 《Memcached管理及_.NET_开发.doc》 《memcached-win32-1.4.4-14.zip》 《安装Memcached及Memcached配置.doc》 《Linux...
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的...
由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。因为通常网站应用程序中最耗费时间的任务是数据在数据库的检索,而多个用户查询相同的SQL时,数据库压力会增大,而...
执行完毕后,我们就可以在任务管理器中见到memcached.exe这个进程了。好了,我们的服务器已经正常运行了, 下面我们就来写java的客户端连接程序。 我们将java_memcached-release_1.6.zip解压后的目录中的java_...
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的...
由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。因为通常网站应用程序中最耗费时间的任务是数据在数据库的检索,而多个用户查询相同的SQL时,数据库压力会增大,而...
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的...
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的...
memcached(容器映像) 内存中键值存储的从源构建的容器映像标签Docker集线器在Docker Hub上以 :红帽码头在RedHat Quay上以 :特征在构建期间从源代码编译FROM scratch ,零膨胀静态链接到C标准库的实现减少攻击面...
支持多个后端(内存,redis和memcached)的Asyncio缓存。 该库旨在简化而不是专业化。 所有缓存都包含相同的最小接口,该接口包含以下功能: add :仅在键不存在时才添加键/值。 get :检索由键标识的值。 set :...
memcached1.4.5.rar 为编译好的文件 你就不用在编译了 直接用就可以...执行完毕后,我们就可以在任务管理器中见到memcached.exe这个进程了。 好了,我们的服务器已经正常运行了, 下面我们就来写java的客户端连接程序。
第三章 memcached 的内存管理与删除机制.................................................................................. 9 3.1:内存的碎片化.................................................................