Memória 'desperdiçada' alta inesperada (?) No memcached

18

Atualizado, consulte o final da pergunta longa (desculpe).

Analisando nossas estatísticas armazenadas em cache, acho que encontrei um problema do qual não tinha conhecimento antes. Parece que temos uma quantidade estranhamente alta de espaço desperdiçado. Verifiquei com o phpmemcacheadmin uma alteração e encontrei esta imagem olhando para mim:

gráfico do tamanho do cache do memcached

Agora, eu tinha a impressão de que o pior cenário seria que haja 50% de desperdício, embora eu seja o primeiro a admitir que não conhecia todos os detalhes. Eu li - entre outros - esta página que é realmente um pouco antiga, mas também é a nossa versão do memcached. Eu acho que entendo como o sistema funciona ( por exemplo ) eu acredito, mas tenho dificuldade em entender como poderíamos obter 76% de espaço desperdiçado.

A taxa de despejo que o phpmemcacheadmin mostra é 2 ev/s, então há algum problema aqui.

  • A questão principal é: o que posso fazer para corrigir isso . Eu poderia jogar mais memória nele (acho que há algum extra disponível), talvez eu deva mexer na configuração da laje (isso é possível com esta versão?), Talvez haja outras opções? Atualizar a versão do memcached não é uma opção disponível rapidamente.

  • A questão da segunda questão, por curiosidade, é obviamente se se espera uma taxa de 75% (e aumento) de espaço desperdiçado e, em caso afirmativo, por quê.

Sistema: No momento, não é algo que eu possa fazer, sei que a versão em cache do memcached não é a mais recente, mas essas são as cartas que recebi.

  • Memcached 1.4.5
  • Apache 2.2.17
  • PHP 5.3.5

Como resposta à resposta de @DavidSchwartz: aqui estão as estatísticas de laje que phpmemcacheadmin produz: (existem mais lajes entre elas do que estas)

( Também colei as estatísticas um pouco mais tarde, em formato de texto aqui )

Detalhes da laje

ATUALIZAR

Reiniciei o daemon com -f 1.5 e ele parecia muito bom. Após um certo aquecimento, tivemos um gasto / desperdício de 50/50. Mas, da mesma forma que antes, quanto mais tempo tínhamos no dia (fica mais movimentado durante o dia), ele começa a voltar ao que é atualmente: 30/70 e desperdiçado ainda está aumentando. Além disso, ainda não sei de onde vem o 'desperdício'. Eu vejo esta laje:

**Slab 5 Stats**
Chunk Size  496.0 Bytes
Used Chunk  77502 [24.6 %]
Total Chunk 314986
Total Page  149
Wasted      117.3 MBytes
Hits        30.9 Request/sec
Evicted     0

Não está cheio, não foi despejado, mas está desperdiçando 117,3 MBytes. O cálculo rápido que fiz (corrija-me se estiver errado) foi:

  • a laje anterior tem um tamanho de pedaço de 328, portanto, na pior das hipóteses, essa laje é preenchida com pedaços de 329 bytes.
  • isso significa que está desperdiçando 167 bytes por pedaço usado = 12942834 bytes = 12,3 MB

Então, de onde vieram os outros 105 MB desperdiçados ? É o irmão maior bem ao lado, fica assim:

**Slab 6 Stats** 
Chunk Size  744.0 Bytes
Used Chunk  17488 [31.0 %]
Total Chunk 56360
Total Page  40
Wasted      31.1 MBytes
Hits        107.7 Request/sec
Evicted     1109
Nanne
fonte
O problema é que há toneladas de espaço não utilizado nas outras lajes, mas a laje 3 está 100% cheia e vendo despejos.
David Schwartz
Bom ponto, isso explicaria as expulsões, embora não tenha muita certeza de como é calculado o número 'desperdiçado'. Se a laje 8 tiver apenas 13,9% usada, certamente deve haver algum espaço "livre" lá?
Nanne
Sim, há espaço livre nessa laje. Mas isso não ajuda se os objetos que estão sendo despejados não caem nessa laje.
David Schwartz
Foi o que achei da sua resposta, mas por que não há espaço livre listado? Deve haver alguma parte desse gráfico de pizza branca (como está no meu teste de instalação) se ainda há espaço deixado, pelo menos, é o que eu percebi
Nanne

Respostas:

10

Já se passou um ano desde essa pergunta e não sei se você encontrou sua resposta, mas vou dizer que sua percepção de "desperdiçado" está errada.

A memória desperdiçada é alocada na memória para que não possa ser usada por outro aplicativo, mas ainda está disponível para o cache de memórias.

Para simplificar a explicação, suponha que você tenha um memcache com 3MB de ram com 3 Slabs:

slab class  1: chunk size     10485 perslab      100
slab class  2: chunk size    104857 perslab       10
slab class  3: chunk size   1048576 perslab        1

Execute um único "conjunto" com um tamanho de 10k. Você verá nas suas estatísticas (aproximadamente) que você tem:

0.03% used
66.6% free
33% wasted

Isso ocorre porque o memcached alocou um único pedaço da "classe 1 da laje" e 99% da memória dessa laje é "desperdiçada" e 1% é "usada" Isso não significa que a laje e a memória alocada para essa laje se foram.

Execute outro "conjunto" único com tamanho de 10k. Desta vez, você verá:

0.06% used
66.6% free
32.7% wasted

agora você está usando 2 dos 100 blocos alocados na laje 1, as estatísticas "desperdiçadas" caíram e as estatísticas usadas aumentaram.

Não há nada errado em%% desperdiçado usado ser igual a 100%. Isso não significa que você não tem mais memória, apenas significa que você alocou pelo menos um pedaço de cada laje.

Para ver este problema, um "conjunto" com tamanho de 100k e outro com tamanho de 1000k

Agora você verá

36.6% used
   0% free
63.3% wasted
kali
fonte
Isso soa bem! Você tem algum link para fazer backup disso? Nesse caso, isso significa que meu servidor memcache estava (está) tendo um desempenho melhor, então pensamos :). Se bem entendi, é que o desperdício significa que foi alocado, mas ainda está disponível para uso. Isso significa que, se nada é gratuito, você não pode alocar mais lajes, mas isso não significa que você tem um problema em si?
Nanne5
1
Eu não tenho um link em cima da minha cabeça, mas é muito fácil testar a si mesmo. Acesse sua linha de comando e crie um pequeno servidor de amostra para testar como ele funciona. Você pode usar a opção -vv para mensagens de depuração detalhadas, que mostrarão as lajes criadas inicialmente, ou seja: "memcached -vv -p 11500 -m 3 -n 10000 -f 10" criará três lajes com tamanhos de bloco 10k 100k e 1000k. E continue emitindo "conjuntos" e veja suas estatísticas desperdiçadas / usadas mudarem exatamente como eu descrevi acima.
precisa
bom ponto. agora para descobrir como posso obter alguma atenção extra para esta resposta para você :)
Nanne
6

Você provavelmente tem um número muito grande de objetos muito pequenos. Normalmente, a menor laje contém entradas de 104 bytes. Se houver muitas entradas que apenas mapeiam um número inteiro para outro, você pode obter um desperdício de até 85%.

Você pode encontrar informações sobre como ajustar isso no artigo Memcached para objetos pequenos .

David Schwartz
fonte
Se eu li a página de estatísticas corretamente, esse não é o caso. A maioria dos resíduos está em uma laje com 480,0 Byte-chunks. Deixe-me ver se eu posso mostrar algumas estatísticas ...
Nanne
Ah, então isso é bom e normal, nada para se preocupar. Agora há apenas menos dados. (Note, por exemplo, que essa laje é de apenas 14% usavam.)
David Schwartz
Mas como 75% é desperdiçado normal? Esse número inclui espaço não utilizado? Eu esperaria que isso fosse contado como "grátis". Além disso, vemos um aumento na perda de // uma diminuição na memória usada à medida que o dia passa, enquanto o site fica mais ocupado. Isso, e o fato de termos despejos, me faz pensar no que pode ser feito.
Nanne
Ter menos lajes pode ajudar a evitar o problema de muita memória ficar presa na laje errada. Por exemplo, -f 1.5 -I 2800pode ajudar.
David Schwartz
A página de manual não é muito clara: o -I 2800que significa 2800K, em oposição ao padrão de 1 milhão?
Nanne
-1

Eu tive esse problema e mudei de memcached para redis (sem salvar com base em disco). Eu sei que isso pode não ser possível, mas você pode tentar como uma opção e ficar de olho na fragmentação da memória. Você pode até ativar a persistência para corrigir problemas de "cache antigo" na reinicialização.

pedigree
fonte