Wir geraten in eine Situation, in der in bestimmten Slabs Räumungen stattfinden, selbst wenn Memcached genügend Speicher zugewiesen ist, Memcached jedoch ungenutzte Seiten aus anderen Slabs nicht freigibt/neu ausgleicht.
Memcached-Version: 1.4.15
Hier ist die Ausgabe von memcached-tool-ng (Drittanbietertool mit etwas mehr Informationen zu 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 %
Betrachtet man die Seitenanzahl und die Objektanzahl, ist es offensichtlich, dass in höheren Segmenten viel Speicher verschwendet wird. Betrachten wir Segment 18 oder 19. In Segment 18 gibt es nur 26 Objekte. Wenn wir davon ausgehen, dass wir maximal 13 Seiten benötigen, um diese Objekte unterzubringen, beträgt die Gesamtzahl der zugewiesenen Seiten 2604.
Unsere Anwendung legt für jedes Objekt normalerweise eine TTL von nicht mehr als 480 Sekunden fest. Das maximale Alter in höheren Platten ist jedoch zu hoch und auch in dichteren (niedrigeren) Platten kommt es häufig zu Räumungen.
Kann jemand erklären, warum Memcached die ungenutzten Seiten nicht von höheren Slabs zurückfordert und sie den Slabs zuweist, in denen mehr Seiten benötigt werden?