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

17

Atualizado, veja a parte inferior da longa (desculpe) pergunta.

Olhando para as nossas estatísticas do memcached, acho que encontrei um problema de que não tinha conhecimento antes. Parece que temos uma quantidade estranhamente alta de espaço desperdiçado. Eu verifiquei com phpmemcacheadmin para uma mudança e encontrei esta imagem me olhando:

Agoraeuestavacomaimpressãodequeopiorcenárioseriaquehá50%dedesperdício,emboraeusejaoprimeiroaadmitirnãosabertodososdetalhes.Euli-entreoutros- esta página que é de fato um pouco antigo, mas nossa versão do memcached também é. Eu acho que entendo como o sistema funciona ( por exemplo ) eu acredito, mas eu tenho dificuldade em entender como poderíamos chegar a 76% de espaço desperdiçado.

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

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

  • A questão secondairiana, por curiosidade, é claro se a taxa de 75% (e aumento) de espaço desperdiçado é esperada, e em caso afirmativo, por que.

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

  • Memcached 1.4.5
  • Apache 2.2.17
  • PHP 5.3.5

Como resposta à resposta do @DavidSchwartz: aqui estão as estatísticas da laje que o phpmemcacheadmin produz: (existem mais lajes, a seguir, estas)

( Eu também colei as estatísticas daqui a pouco em formato de texto )

UPDATE

Eu reiniciei o daemon com -f 1.5, e ele ficou muito bom. Depois de algum aquecimento, tivemos um desperdício de 50/50. Mas, o mesmo de antes, quanto mais tempo tínhamos no dia (fica mais movimentado durante o dia), começou a cair de volta ao que é atualmente: 30/70, e o desperdício 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, então, no pior caso, 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 ? É irmão maior ao lado parece com isso:

**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
    
por Nanne 11.06.2012 / 12:16

3 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 "desperdício" 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 memcached.

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á em suas estatísticas (aproximadamente) que você tem:

0.03% used
66.6% free
33% wasted

Isso ocorre porque o memcached alocou um único bloco de "slab class 1" e 99% da memória para essa laje é "desperdiçada" e 1% é "used" Isso não significa que a laje e a memória alocadas para essa laje se foi.

Execute outro single "set" com tamanho 10k. Desta vez você verá:

0.06% used
66.6% free
32.7% wasted

Agora, você está usando 2 de 100 blocos alocados na camada 1, as estatísticas "desperdiçadas" diminuíram e as estatísticas usadas aumentaram.

Não há nada de errado com %% +% desperdiçado sendo igual a 100%. Isso não significa que você não tenha mais memória sobrando, isso significa simplesmente que você alocou pelo menos um pedaço de cada bloco.

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

Agora você verá

36.6% used
   0% free
63.3% wasted
    
por 05.07.2013 / 15:34
6

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

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

    
por 11.06.2012 / 12:55
-1

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

    
por 24.06.2012 / 01:43

Tags