memcached 不会从某个 slab 中释放未使用的页面,从而导致其他 slab 被驱逐

memcached 不会从某个 slab 中释放未使用的页面,从而导致其他 slab 被驱逐

我们遇到了这样一种情况:即使为 memcached 分配了足够的内存,但 memcached 不会从其他 slab 释放/重新平衡未使用的页面,某些 slab 中也会发生驱逐。

memcached 版本:1.4.15

这是 memcached-tool-ng(包含有关 memstats 的更多信息的第三方工具)的输出。

   #  Item_Size    Max_age   Pages     Count   Used Mem     To Store   Efficiency  Evicted  Evict_Time  OOM
  10       6.9K      1583s       1         2    1.00 MB     12.99 KB       1.27 %        0           0   0
  11      11.1K       480s      83      1890   83.00 MB     17.38 MB      20.94 %   282249         480   0
  12      17.8K       479s      57      1156   57.00 MB     19.67 MB      34.51 %  6959481         479   0
  13      28.4K       480s    1052      7277    1.03 GB    136.18 MB      12.94 %   941078         480   0
  14      45.5K        27s     562        17  562.00 MB    536.25 KB       0.09 %   114861          22   0
  15      72.7K        21s     574         2  574.00 MB    125.03 KB       0.02 %     2615          18   0
  16     116.4K     30055s     790       300  790.00 MB     25.96 MB       3.29 %    34786          22   0
  17     186.2K     30230s    1823      1433    1.78 GB    187.89 MB      10.31 %    21823          22   0
  18     297.9K     30201s    2604        26    2.54 GB      4.91 MB       0.19 %     1373          25   0
  19     476.7K     35234s    1322         2    1.29 GB    615.39 KB       0.05 %        0           0   0
  20    1024.0K         0s       2         0    2.00 MB          0 b       0.00 %        0           0   0

Total used memory: 8.66 GB (for 393.24 MB of data)
Global efficiency:  4.43 %

Total used memory: 8.66 GB (for 393.24 MB of data)
Global efficiency:  4.43 %

查看页面数和对象数,显然在较高的 slab 中浪费了大量内存。考虑 slab 18 或 19,在 slab 18 中只有 26 个对象,假设我们可能需要最多 13 个页面来容纳这些对象,则分配的总页面数为 2604。

我们的应用程序通常将任何对象的 TTL 设置为不超过 480 秒,但是较高平板中的最大年龄太高,而且较密集(较低)平板也出现大量驱逐。

有人可以解释一下为什么 Memcached 不从更高的 slab 中回收未使用的页面并将其分配给需要更多页面的 slab 吗?

相关内容