Memcache驱逐政策

时间:2017-07-04 02:28:32

标签: memory-management memcached

根据我的理解。

  1. 在Memcache中,整个内存分为固定大小的页面,每个页面属于一个微粒平板类。每个页面进一步分为固定大小的块,块的大小根据slab类决定。数据存储在最适合它的块(最小化内部碎片)。

  2. Memcache使用LRU策略驱逐。

  3. 某处我已经读到LRU策略应用于帧而不是整个数据。因此,可能存在一个帧(不同类)是空闲但仍然在帧上发生驱逐的情况。

    这是memcache的行为方式吗?而不是驱逐,不应该调整空框架的大小吗?

1 个答案:

答案 0 :(得分:0)

正如您所提到的,内存分为固定大小的页面(1MB或最大项目配置大小),每个页面属于微粒平板类。在开始时,这些页面实际上并没有分配给任何特定的slab类。当请求到来时,每个大小范围都会创建slab类,并将页面附加到它们上。

确定最佳板级是关键。它的算法大致如下:

  1. 检查尾页(此slab类中最近分配的页面)以查看它是否具有打开/空闲块。
  2. 如果找到,请将此对象存储在该页面中并返回。
  3. 否则,找到一个未分配的页面并将其分配给此slab类。
  4. 如果没有未分配的页面可用(这并不意味着所有内存都已满),请执行LRU逻辑以释放暂时未使用(或已过期)的块。
  5. 将此对象存储在刚刚释放的块(从步骤4开始)或空白页面(从步骤3开始)。
  6. 现在,回答您的问题。

    只有当所有页面都分配给某些slab类时才会出现驱逐行为。因为,所有页面都与一些slab类绑定,并准备接受该大小范围内的对象/项目。剩余的可用内存不能用于其他大小的对象。即他们无法调整大小。我想这是为了简单实现的。此方法适用于许多Web应用程序,其中对象大小几乎与查询结果,呈现的html页面大小相同。在这种情况下,Memcache会将它拥有的所有页面分配给您使用的极少数类。

    我记得在某处读过,Redis在调整内存大小方面更灵活。

    希望它有所帮助!