memcached に十分なメモリが割り当てられているにもかかわらず、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 %
ページ数とオブジェクト数を見ると、上位のスラブで大量のメモリが浪費されていることがわかります。スラブ 18 または 19 を考えてみましょう。スラブ 18 には 26 個のオブジェクトしかありませんが、これらのオブジェクトを収容するには最大 13 ページ必要だと仮定すると、割り当てられるページの合計は 2604 になります。
私たちのアプリケーションは通常、どのオブジェクトに対しても TTL を 480 秒以下に設定していますが、上位のスラブの最大有効期間が高すぎるため、密度の高い (下位の) スラブでは大量の削除が発生しています。
Memcached が、上位のスラブから未使用のページを回収せず、より多くのページが必要なスラブに割り当てない理由を誰か説明してもらえますか。