我們遇到了這樣的情況:即使有足夠的記憶體分配給 memcached,但 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 18或19,在slab 18中只有26個對象,假設我們可能需要最多13個頁面來容納這些對象,則分配的總頁面為2604。
我們的應用程式通常將任何物件的 TTL 設定為不超過 480 秒,但是較高板的最大壽命太高,而且較密集(較低)的板也會發生大量驅逐。
有人可以解釋為什麼 Memcached 不從較高的平板中回收未使用的頁面並將其分配給需要更多頁面的平板。