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