一、Memcache内存分配机制
关于这个机制网上有很多解释的,我个人的总结如下。
-
Page为内存分配的最小单位。
Memcached的内存分配以page为单位,默认情况下一个page是1M,可以通过-I参数在启动时指定。如果需要申请内存时,memcached会划分出一个新的page并分配给需要的slab区域。page一旦被分配在重启前不会被回收或者重新分配(page ressign已经从1.2.8版移除了)
-
Slabs划分数据空间。
Memcached并不是将所有大小的数据都放在一起的,而是预先将数据空间划分为一系列slabs,每个slab只负责一定范围内的数据存储。如下图,每个slab只存储大于其上一个slab的size并小于或者等于自己最大size的数据。例如:slab 3只存储大小介于137 到 224 bytes的数据。如果一个数据大小为230byte将被分配到slab 4中。从下图可以看出,每个slab负责的空间其实是不等的,memcached默认情况下下一个slab的最大值为前一个的1.25倍,这个可以通过修改-f参数来修改增长比例。
-
Chunk才是存放缓存数据的单位。
Chunk是一系列固定的内存空间,这个大小就是管理它的slab的最大存放大小。例如:slab 1的所有chunk都是104byte,而slab 4的所有chunk都是280byte。chunk是memcached实际存放缓存数据的地方,因为chunk的大小固定为slab能够存放的最大值,所以所有分配给当前slab的数据都可以被chunk存下。如果时间的数据大小小于chunk的大小,空余的空间将会被闲置,这个是为了防止内存碎片而设计的。例如下图,chunk size是224byte,而存储的数据只有200byte,剩下的24byte将被闲置。
-
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数组。 -
Memcached内存分配策略。
综合上面的介绍,memcached的内存分配策略就是:按slab需求分配page,各slab按需使用chunk存储。
这里有几个特点要注意,- Memcached分配出去的page不会被回收或者重新分配
- Memcached申请的内存不会被释放
- slab空闲的chunk不会借给任何其他slab使用
知道了这些以后,就可以理解为什么总内存没有被全部占用的情况下,memcached却出现了丢失缓存数据的问题了。
为什么总内存没有被全部占用的情况下,memcached却出现了丢失缓存数据?
总内存没有被占用完,但是已经被分配完了,这样每个slab能够获得的内存其实已经确定了,当部分比较密集(或者开始不密集,后续增多,例如我当时遇到的,在已经基本定型的memcache上附加新的类型的应用数据,导致内存分配与数据密集程度不符)的slab出现内存不够时,会使用最久未使用算法进行移除,即使没有到达过期时间,这个时候就出现数据丢失了。但是从一些工具中,此时实际使用的内存其实没有达到最大。
相关推荐
运行`memcached.exe`,通常选择静默安装,并指定一些配置选项,如端口(默认为11211)、内存分配大小等。安装完成后, Memcache服务会在后台运行,提供缓存服务。 2. **配置Memcache服务**: 打开服务管理器,找到...
- 内存管理:Memcache在内存中分配空间,创建一个哈希表来存储数据。这种设计使得数据存取速度极快,因为避免了磁盘I/O操作。 - 非阻塞网络I/O:Memcache使用非阻塞的网络I/O模型,能够同时处理大量连接请求,提高...
- 适当调整 Memcache 的最大连接数、内存分配等参数,以适应服务器资源和应用需求。 - 对于大型数据,考虑分片存储,避免单个键值过大导致的性能下降。 - 使用合适的过期时间,避免无效数据占用内存。 - 结合...
4. **性能优化**:理解Memcache的工作机制,如数据过期策略、内存分配策略等,可以帮助开发者优化缓存效果,提高系统性能。 5. **分布式缓存**:当单个Memcache服务器不足以应对高并发或大数据量时,可以采用分布式...
7. **性能优化**:可以通过调整Memcache服务器的配置参数,如最大连接数、内存分配等,优化其性能。 8. **分布式缓存**:Memcache支持多服务器环境,可以分散负载,提高系统的可伸缩性和可靠性。 在PHP 5.4中使用...
4. **内存管理**:Memcache通过内存池管理内存,避免了频繁的内存分配和释放操作,提高了性能。 5. **TCP/IP 协议**:使用简单的文本协议,易于实现和调试,同时也支持多语言客户端库。 6. **扩展性**:可以通过增加...
- **分片技术**:通过在多个Memcache服务器间分配数据,提高系统的可用性和并发处理能力。 - **缓存预热**:在应用启动时预先加载常用数据,减少首次访问时的延迟。 - **缓存失效策略**:合理设置过期时间,避免...
如果内存使用过高,可能要考虑增大Memcache的内存分配或者优化存储的数据。 总的来说,Memcache监视工具为Windows环境下的Memcache管理提供了便利,通过可视化的方式,让开发者和运维人员更好地理解和优化缓存系统...
- 配置Memcache时,考虑合理的内存分配、过期策略以及负载均衡。 综上所述,"win下php-memcache5.4;5.2;5.3扩展和memcache服务端"涵盖了从下载PHP扩展到安装配置Memcache服务端的整个过程,确保了PHP应用程序能够...
MemCache是一种广泛应用于Web开发中的高性能分布式内存对象缓存系统,其主要目的是通过将数据存储在内存中...在实际应用中,合理地分配和管理缓存数据,以及调整MemCache的内存大小和过期策略,是优化系统性能的关键。
- slab分配器:Memcache采用预分配内存的方式,通过slab chunk管理内存,避免频繁的内存分配和释放导致的性能下降。 - slab类:每个slab类对应一个大小范围,key-value对被分配到适合的slab中,减少内存碎片。 - ...
合理分配内存资源,以及及时清理过期session,可以避免内存耗尽。 - **安全性**:session中通常包含敏感信息,如用户ID和权限,因此确保memcache通信的安全性至关重要,可能需要启用SSL/TLS加密。 - **容错和高...
1. **内存管理**:合理分配Memcached的内存大小,避免内存耗尽导致服务中断。 2. **缓存策略**:根据业务需求设置合适的缓存过期时间,平衡缓存命中率和数据新鲜度。 3. **数据一致性**:考虑在更新数据库后如何保持...
1. **分布式**:MemCache可以运行在多台服务器上,通过哈希算法自动分配数据到不同的服务器,实现数据的分布式存储。 2. **内存存储**:所有数据都存储在内存中,读写速度极快。 3. **无持久化**:默认情况下,...
3. **容量规划**:合理评估并分配Memcache的内存资源,以应对预期的session数据量。 4. **故障恢复**:当Memcache服务器出现故障时,要有备用策略,如设置热备服务器或使用其他session存储方式。 总之,使用...
8. **性能优化**:优化包括选择高性能的硬件、合理的内存分配、适当的缓存策略(如LRU、LFU)、以及监控和调优网络通信效率等。 9. **容错与备份**:在分布式集群中,要考虑到节点故障的情况,可以采用备份节点或者...
- 根据mctop的输出调整Memcache的配置,如增大内存分配,优化缓存策略。 - 分析热点数据,考虑数据预加载或优化数据库查询。 - 调整Memcache的过期时间,避免无效数据占用内存。 - 根据命令统计调整应用代码,...
1. **内存管理**:合理分配内存大小,避免因内存不足导致的频繁 LRU 清除,影响性能。 2. **数据分片**:通过一致性哈希算法,实现数据在多个 Memcache 实例间的均匀分布。 3. **Memcache 与 Redis 混合使用**:结合...
通过一致性哈希算法,可以将数据均匀地分配到多个Memcache节点上,当有新的节点加入或离开时,尽可能少地改变数据分布,保持系统的稳定性。 **性能优化** 1. **缓存策略**:选择合适的缓存策略,如LRU(Least ...