总结下我对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
SLAB机制是Memcached内存管理的关键组成部分,它通过一种特殊的缓存机制来存储item数据。这种机制能够有效地提高内存利用率并减少内存碎片,从而提高系统的整体性能。 **SLAB机制概述:** - **SLAB(Class)定义**...
Memcached源码分析之内存管理Memcached源码分析之内存管理
### Memcached内存分析、调优、集群:深入理解与实践 #### 1. Memcached背景与概述 Memcached是一款高性能的分布式内存缓存服务器,它最初由LiveJournal的运营人员开发,现已成为开源社区中不可或缺的一部分。其...
### Memcached内存分析、调优、集群 #### 1. Memcached背景 Memcached是一款高性能的分布式内存对象缓存系统,旨在通过减轻数据库负载来加速动态Web应用的响应速度。它通过在内存中缓存数据和对象来减少读取数据库...
6. Memcached内存管理机制原理: - Slab Allocation:内存被划分为多个大小固定的块(slabs),每个slab包含多个chunk(数据存储单元)。同一slab的chunk大小相同,避免了内存碎片,简化了内存分配与释放。 ...
4. 简述Memcached内存管理机制原理? Memcached使用slab allocation机制来管理内存,每个slab分配一个固定的内存大小,用于存储对象。 5. Memcached是怎么工作的? Memcached服务器可以接受客户端的请求,检查缓存...
- **内存管理**:内存是Memcached存储数据的主要场所,它采用 slab 分配器,将内存划分为不同大小的块(slabs),每个块又包含多个固定大小的项(items)。这种设计减少了内存碎片,提高了内存利用率。 - **键值对...
`slab_automove`是memcached内存管理的关键部分,它负责将数据分配到不同的内存层级(slabs)。源码中包含的`struct window_data`和`struct slab_automove`定义了监控和决策的窗口数据结构,用于动态调整slab的分配...
【Memcached内存分析】 Memcached是一款高性能的分布式内存缓存系统,由LiveJournal的运营团队开发,被广泛应用于包括Facebook、mixi、Digg、Wikipedia等在内的大型网站。其设计目标是减轻数据库的压力,通过将常用...
1. Slab Allocation 机制:Memcached 内存管理的核心是 Slab Allocator,将内存划分为固定大小的 chunk,避免内存碎片。每个 slab 对应一组相同大小的 chunk,数据根据大小被分配到合适的 slab 中。尽管可能导致空间...
MSM(Memcached_Session_Manager)是一个基于Java的Memcached会话管理器,它允许我们将Web应用的session数据存储在Memcached服务器上,而不是传统的保存在服务器的内存中或者硬盘上的session文件。这样,即使服务器...
早期的 Memcached 内存管理方式是通过 malloc 的分配的内存,使用完后通过 free 来回收内存,这种方式容易产生内存碎片,并降低操作系统对内存的管理效率。为了解决这个问题,Slab Allocation 内存分配机制就延生了...
#### Memcached内存管理机制 - **早期机制**: 基于malloc/free的内存管理,可能导致内存碎片问题。 - **改进方案**: 引入Slab Allocation机制。 - **Slab Allocation**: 将内存分割成多个固定大小的“slab class”...
### Memcached内存分析、调优、集群 #### 一、Memcached背景介绍 Memcached是一款高性能的分布式内存对象缓存系统,它通过减轻数据库负担来加速动态Web应用程序的速度。最初由LiveJournal的开发者Brad Fitzpatrick...
在Memcached中,内存管理是至关重要的,因为它直接影响到服务的性能和效率。memcached采用了一种特殊的内存分配策略,名为Slab Allocation,以避免频繁的内存碎片和提高内存利用率。 1. Slab Allocation原理: ...
`Tomcat`是一个流行的开源Java Servlet容器,而`Memcached`则是一个分布式内存对象缓存系统,常用于减轻数据库负载,提高应用性能。本篇文章将详细介绍如何使用`Tomcat`结合`Memcached`来实现高效的Session管理。 ...
### 寻找我们丢失的数据——深入理解Memcached内存管理机制 #### 一、故事的开始 在日常工作中,经常会遇到由于各种原因导致的数据丢失问题。本文将以一个具体案例出发,探讨如何有效地解决这类问题,特别是在使用...