【问题标题】:Memcache eviction policyMemcache 驱逐策略
【发布时间】:2017-07-04 21:21:57
【问题描述】:

据我了解。

  1. 在Memcache中,整个内存被划分为固定大小的页面,每个页面属于一个特定的slab类。每个页面进一步划分为固定大小的chunk,chunk的大小由slab class决定。数据存储在最适合它的块(以尽量减少内部碎片)。

  2. Memcache 使用 LRU 策略进行驱逐。

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

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

【问题讨论】:

    标签: memory-management memcached


    【解决方案1】:

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

    确定最优的slab类是关键。它的算法大致如下:

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

    现在,回答您的问题。

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

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

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2013-12-14
      • 2020-07-10
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      相关资源
      最近更新 更多