Estamos enfrentando uma situação em que ocorrem remoções em determinados blocos, mesmo que haja memória suficiente alocada para o memcached, mas o memcached não libera/reequilibra páginas não utilizadas de outros blocos.
versão memcached: 1.4.15
Aqui está a saída do memcached-tool-ng (ferramenta de terceiros com um pouco mais de informações sobre 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 %
Observando a contagem de páginas e a contagem de objetos, fica evidente que muita memória está sendo desperdiçada em lajes mais altas. Considere a placa 18 ou 19, na placa 18 existem apenas 26 objetos, assumindo que precisaremos de no máximo 13 páginas para acomodar esses objetos, o total de páginas alocadas é 2.604.
Nosso aplicativo normalmente define o TTL de não mais que 480 segundos em qualquer objeto, no entanto, a idade máxima em lajes mais altas é muito alta, e as lajes mais densas (mais baixas) também estão vendo despejos de lote.
Alguém pode explicar por que o Memcached não está recuperando as páginas não utilizadas das placas mais altas e alocando-as nas placas onde mais páginas são necessárias.