memcache的内存分配机制:
memcache进程会预先分配一部分内存给slab,给slab分配的内存也叫page(page的默认大小是1M),每个page下面会有若干个chunk(chunk默认大小96B),而数据就会封装成item存储在chunk里面,若干个大小相同的chunk称为slab class,相同大小的chunk未必在一个slab中。所以在默认情况下一个slab存放的chunk数量为10922个chunk:10922×96+ 64 = 1048576(1M) 。
但是在一个slab中所有的chunk的大小是不同的,不同大小的chunk存放不同大小的数据。
memcache的数据删除机制:
当数据过期时,memcache并不会直接从内存中删除数据,因为memcache并不会回收已经分配的内存,而只是在get数据时检查时间戳是否过期,如果过期那么客户端就不可见,但是原来分配的内存可以重复使用,这叫做惰性失效。所以memcache不会对过期的数据进行监视,因此也就节省了cpu的资源。
但是在memcache中使用LRU机制进行删除数据,即最近最少使用。通过计数器来记录哪些数据最少被使用来删除它,所以也有可能删除一些尚未过期或者永久有效的数据。
在每个slab中数据都是存放在链表上的,链表有head和tail指针,分别指向最老和最新的数据。当LRU机制启动时,两个指针同时发挥作用查询失效数据,如果没有失效数据那么就会删除最近的最少被使用的数据。
LRU只针对每个slab,并不针对整体。只有在slab不能分配新的page内存时才会调用LRU。
一种有效缓解使用LRU的方法是:
1,避免大对象
如果系统上只有及个别几个大对象的话,会浪费内存空间,因为Slab申请了Page是不能释放内存的,及个别大对象会导致Slab申请了内存资源而得不到充分的利用。
2,调整增长因子
根据项目的需求调整增长因子,使内存充分利用。