`

Memcache内存分配 | Memcache存储策略

 
阅读更多
Memcache使用了Slab Allocator的内存分配机制:按照预先规定的大小,将分配的内存分割成特定长度的块,以
完全解决内存碎片问题
Memcache的存储涉及到slab,page,chunk三个概念
1.Chunk为固定大小的内存空间,默认为96Byte。
2.page对应实际的物理空间,1个page为1M。
3.同样大小的chunk又称为slab。
Memcached再启动的时候根据-n和-f参数,产生若干slab。具体应用中Memcache每次申请1page,并将这1M空间分割成若干个chunk,这些chunk有着同样的大小,属于同一个slab。
【添加】,通过memcache添加item的时候:
1.  Memcache计算item的大小(key+value+flags),选取合适的slab(刚好能放下该item的slab)
2.  如果这个item对应的slab未出现过,则申请1个page(注意,这1M空间不论是否达到memcached使用内存都可以申请成功)并加该item存入slab中的chunk
3.  如 果item对应的slab出现过,则在该slab中优先选择expired(free_chunks)和delete(在1.2.2中delete的 chunk存在着不能被重复利用的问题)的chunk进行存储,其次将选择未使用过的chunk(free_chunks_end)进行存储。
4.  如果item对应的slab出现过,但是对应的slab已经存储满了,那么会申请一个新的page,这个page被分为对应大小的chunk,继续存储。
5.  如果item对应的slab出现过,但是对应的slab已经存储满了并且memcache也达到了最大内存使用。将使用lru算法,清除item(可能将未过期的item清除)此时会有eviction++
【删除】:
1.  Delete操作只是将该chunk置为删除状态,这样在下次使用将优先利用这样的chunk。
【flush】
1.  Flush操作相当于将所有的item失效的一个动作。并不会改变memcache内存分配情况。
一些注意
1. memcache已经分配的内存不会再主动清理。
2. memcache分配给某个slab的内存页不能再分配给其他slab。
3. flush_all不能重置memcache分配内存页的格局,只是给所有的item置为过期。
4. memcache最大存储的item(key+value)大小限制为1M,这由page大小1M限制
5. 由于memcache的分布式是客户端程序通过hash算法得到的key取模来实现,不同的语言可能会采用不同的hash算法,同样的客户端程序也有可能 使用相异的方法,因此在多语言、多模块共用同一组memcached服务时,一定要注意在客户端选择相同的hash算法
6.启动memcached时可以通过-M参数禁止LRU替换,在内存用尽时add和set会返回失败
7.memcached启动时指定的是数据存储量,没有包括本身占用的内存、以及为了保存数据而设置的管理空间。因此它占用的内存量会多于启动时指定的内存分配量,这点需要注意。
8.memcache存储的时候对key的长度有限制,php和C的最大长度都是250
标签: PHP memcached

代码片段(10) [全屏查看所有代码]

1. [代码][PHP]代码    

1
2
3
Page为内存分配的最小单位。
 
Memcached的内存分配以page为单位,默认情况下一个page是1M,可以通过-I参数在启动时指定。如果需要申请内存 时,memcached会划分出一个新的page并分配给需要的slab区域。page一旦被分配在重启前不会被回收或者重新分配。

2. [图片] 1866742045547134261[1].jpg    

3. [代码][PHP]代码    

1
2
3
labs划分数据空间。
 
Memcached并不是将所有大小的数据都放在一起的,而是预先将数据空间划分为一系列slabs,每个slab只负责一定范围内的数据存储。如 下图,每个slab只存储大于其上一个slab的size并小于或者等于自己最大size的数据。例如:slab 3只存储大小介于137 到 224 bytes的数据。如果一个数据大小为230byte将被分配到slab 4中。从下图可以看出,每个slab负责的空间其实是不等的,memcached默认情况下下一个slab的最大值为前一个的1.25倍,这个可以通过修 改-f参数来修改增长比例。

4. [图片] 1866742045547134262[1].jpg    

5. [代码][PHP]代码    

1
2
3
Chunk才是存放缓存数据的单位。
 
Chunk是一系列固定的内存空间,这个大小就是管理它的slab的最大存放大小。例如:slab 1的所有chunk都是104byte,而slab 4的所有chunk都是280byte。chunk是memcached实际存放缓存数据的地方,因为chunk的大小固定为slab能够存放的最大值, 所以所有分配给当前slab的数据都可以被chunk存下。如果时间的数据大小小于chunk的大小,空余的空间将会被闲置,这个是为了防止内存碎片而设 计的。例如下图,chunk size是224byte,而存储的数据只有200byte,剩下的24byte将被闲置。

6. [图片] 1866742045547134263[1].jpg    

7. [代码][PHP]代码    

1
2
3
4
Slab的内存分配。
 
Memcached在启动时通过-m指定最大使用内存,但是这个不会一启动就占用,是随着需要逐步分配给各slab的。
         如果一个新的缓存数据要被存放,memcached首先选择一个合适的slab,然后查看该slab是否还有空闲的chunk,如果有则直接存放进去;如 果没有则要进行申请。slab申请内存时以page为单位,所以在放入第一个数据,无论大小为多少,都会有1M大小的page被分配给该slab。申请到 page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk的数组,在从这个chunk数组中选择一个用于存储 数据。如下图,slab 1和slab 2都分配了一个page,并按各自的大小切分成chunk数组。

8. [图片] 1866742045547134264[1].jpg    

9. [代码][PHP]代码    

1
2
3
4
5
6
Memcached内存分配策略。
 
综合上面的介绍,memcached的内存分配策略就是:按slab需求分配page,各slab按需使用chunk存储。
这里有几个特点要注意,
 
Memcached分配出去的page不会被回收或者重新分配Memcached申请的内存不会被释放slab空闲的chunk不会借给任何其他slab使用。

10. [图片] 1866742045547134265[1].jpg    

分享到:
评论

相关推荐

    Memcache原理及实现

    - 内存管理:Memcache在内存中分配空间,创建一个哈希表来存储数据。这种设计使得数据存取速度极快,因为避免了磁盘I/O操作。 - 非阻塞网络I/O:Memcache使用非阻塞的网络I/O模型,能够同时处理大量连接请求,提高...

    memcache 5.3.3

    - 适当调整 Memcache 的最大连接数、内存分配等参数,以适应服务器资源和应用需求。 - 对于大型数据,考虑分片存储,避免单个键值过大导致的性能下降。 - 使用合适的过期时间,避免无效数据占用内存。 - 结合...

    PHP 5.4 使用的 memcache

    7. **性能优化**:可以通过调整Memcache服务器的配置参数,如最大连接数、内存分配等,优化其性能。 8. **分布式缓存**:Memcache支持多服务器环境,可以分散负载,提高系统的可伸缩性和可靠性。 在PHP 5.4中使用...

    window 7memcache安装组件

    运行`memcached.exe`,通常选择静默安装,并指定一些配置选项,如端口(默认为11211)、内存分配大小等。安装完成后, Memcache服务会在后台运行,提供缓存服务。 2. **配置Memcache服务**: 打开服务管理器,找到...

    php5.3的memcache

    Memcache最初由Danga Interactive开发,主要用于减轻数据库负载,通过在内存中存储常用数据,实现快速访问。它支持多种编程语言,包括PHP,提供了一种轻量级的缓存解决方案,特别适合处理高并发场景下的Web应用。 ...

    memcache-2.2.6.tgz

    4. **内存管理**:Memcache通过内存池管理内存,避免了频繁的内存分配和释放操作,提高了性能。 5. **TCP/IP 协议**:使用简单的文本协议,易于实现和调试,同时也支持多语言客户端库。 6. **扩展性**:可以通过增加...

    win下php-memcache5.4;5.2;5.3扩展和memcache服务端

    - 配置Memcache时,考虑合理的内存分配、过期策略以及负载均衡。 综上所述,"win下php-memcache5.4;5.2;5.3扩展和memcache服务端"涵盖了从下载PHP扩展到安装配置Memcache服务端的整个过程,确保了PHP应用程序能够...

    memcache监视工具

    如果内存使用过高,可能要考虑增大Memcache的内存分配或者优化存储的数据。 总的来说,Memcache监视工具为Windows环境下的Memcache管理提供了便利,通过可视化的方式,让开发者和运维人员更好地理解和优化缓存系统...

    window-php7.1-memcache-dll

    4. **性能优化**:理解Memcache的工作机制,如数据过期策略、内存分配策略等,可以帮助开发者优化缓存效果,提高系统性能。 5. **分布式缓存**:当单个Memcache服务器不足以应对高并发或大数据量时,可以采用分布式...

    集群环境下memcache解决session共享

    Memcache是一款高性能、分布式的内存对象缓存系统,它可以将数据存储在内存中,以提供快速的数据访问。在Tomcat8中,我们可以通过添加第三方库来支持memcache作为session存储。 "memcache-session"这个文件名很可能...

    memcache共享session用到的jar

    3. **容量规划**:合理评估并分配Memcache的内存资源,以应对预期的session数据量。 4. **故障恢复**:当Memcache服务器出现故障时,要有备用策略,如设置热备服务器或使用其他session存储方式。 总之,使用...

    MemCache开发说明文档

    MemCache是一种广泛应用于Web开发中的高性能分布式内存对象缓存系统,其主要目的是通过将数据存储在内存中...在实际应用中,合理地分配和管理缓存数据,以及调整MemCache的内存大小和过期策略,是优化系统性能的关键。

    pecl-memcache-php7

    4. **低延迟**:由于数据存储在内存中,Memcache的读写操作通常具有极低的延迟。 **五、优化与注意事项** 1. **内存管理**:合理分配Memcached的内存大小,避免内存耗尽导致服务中断。 2. **缓存策略**:根据业务...

    memcache缓存分布式集群

    8. **性能优化**:优化包括选择高性能的硬件、合理的内存分配、适当的缓存策略(如LRU、LFU)、以及监控和调优网络通信效率等。 9. **容错与备份**:在分布式集群中,要考虑到节点故障的情况,可以采用备份节点或者...

    MemCache对象缓存应用

    1. **分布式**:MemCache可以运行在多台服务器上,通过哈希算法自动分配数据到不同的服务器,实现数据的分布式存储。 2. **内存存储**:所有数据都存储在内存中,读写速度极快。 3. **无持久化**:默认情况下,...

    Memcache 全面剖析,Memcache 教程

    1. **内存存储**:Memcache 将数据存储在服务器的内存中,由于内存的读写速度远高于硬盘,因此可以显著提升数据访问效率。 2. **键值对存储**:Memcache 使用键值对(Key-Value)的方式存储数据,键是唯一的标识符,...

    Memcache 监控工具 mctop.zip

    - 根据mctop的输出调整Memcache的配置,如增大内存分配,优化缓存策略。 - 分析热点数据,考虑数据预加载或优化数据库查询。 - 调整Memcache的过期时间,避免无效数据占用内存。 - 根据命令统计调整应用代码,...

    memcache分布式缓存的使用

    Memcache基于内存存储,将数据以键值对的形式存储在内存中,提供快速的查找和访问。当应用需要数据时,首先尝试从Memcache中获取,如果存在则直接返回,不存在则从数据库中读取并存入Memcache,这一过程被称为缓存...

    java版memcache缓存管理与开发

    3. **启动服务**:通过命令`memcached -m 64 -p 11211 -u root -l LOCAL_IP_ADDRESS`启动Memcached服务,其中`-m`表示分配的内存大小(单位为MB),`-p`表示监听端口,`-u`表示运行的用户,`-l`表示绑定的IP地址。...

    memcache.zip

    3. **配置**:默认情况下,Memcache会在11211端口上监听,可以使用命令行参数进行自定义配置,例如`-p 8080`指定端口,`-m 64`分配64MB内存给Memcache。 #### PHP扩展安装: 1. **下载**:从PHP官方网站或者第三方...

Global site tag (gtag.js) - Google Analytics