我们遇到了这样一种情况:即使为 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 吗?