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:
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 )
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
Respostas:
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:
Execute um único "conjunto" com um tamanho de 10k. Você verá nas suas estatísticas (aproximadamente) que você tem:
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á:
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á
fonte
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 .
fonte
-f 1.5 -I 2800
pode ajudar.-I 2800
que significa 2800K, em oposição ao padrão de 1 milhão?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.
fonte