MySQL: Como obtenho meu "Máximo uso possível de memória"?

16

Recentemente, tenho tido problemas com o thrashing devido à falta de memória. (Meu VPS tem 256 milhões no total)

Estou tentando ajustar o MySQL usando mysqltuner.pl e obtenha os seguintes resultados:

-------- Estatísticas Gerais ---------------------------------------- ----------
[-] Verificação de versão ignorada para o script MySQLTuner
[OK] Atualmente executando o MySQL com suporte versão 5.0.51a-3ubuntu5.4-log
[OK] Operando na arquitetura de 64 bits

-------- Estatísticas do mecanismo de armazenamento --------------------------------------- ----
[-] Status: + Archive -BDB -Federated -InnoDB -ISAM -NDBCluster 
[-] Dados nas tabelas MyISAM: 114M (Tabelas: 454)
[!!] Total de tabelas fragmentadas: 34

-------- Métricas de desempenho ---------------------------------------- ---------
[-] Até: 40s (570 q [14.250 qps], 23 conexões, TX: 154K, RX: 23K)
[-] Lê / grava: 100% / 0%
[-] Total de buffers: 338,0M globais + 2,7M por thread (20 no máximo threads)
[!!] Uso máximo de memória possível: 392,9M (153% da RAM instalada)
[OK] Consultas lentas: 0% (5/570)
[OK] Maior uso de conexões disponíveis: 15% (3/20)
[!!] Tamanho do buffer de chaves / índices MyISAM totais: 8.0M / 9.4M
[!!] Taxa de acerto do buffer principal: 57,1% (7 em cache / 3 leituras)
[OK] Eficiência do cache de consulta: 21,9% (7 em cache / 32 seleciona)
[OK] Consultar ameixas de cache de consulta por dia: 0
[OK] Classificações que exigem tabelas temporárias: 0% (0 classificação temporária / 1 classificação)
[OK] Tabelas temporárias criadas no disco: 0% (0 no disco / 32 total)
[OK] Taxa de acertos no cache do thread: 86% (3 criadas / 23 conexões)
[OK] Taxa de acertos no cache da tabela: 26% (128 aberto / 484 aberto)
[OK] Limite de arquivo aberto usado: 25% (259 / 1K)
[OK] Bloqueios de tabela adquiridos imediatamente: 100% (492 bloqueios imediatos / 492)

-------- Recomendações ----------------------------------------- ------------
Recomendações gerais:
    Execute OPTIMIZE TABLE para desfragmentar tabelas para obter melhor desempenho
    MySQL iniciado nas últimas 24 horas - as recomendações podem ser imprecisas
    Reduza sua área total de memória do MySQL para estabilidade do sistema
Variáveis ​​a serem ajustadas:
  *** O uso máximo de memória do MySQL é perigosamente alto ***
  *** Adicione RAM antes de aumentar as variáveis ​​de buffer do MySQL ***
    key_buffer_size (> 9,4 milhões)

Mas estou um pouco confuso sobre como reduzir o uso máximo de memória? Parece basear-se em key_buffer e max_connections, mas também deve haver algo mais envolvido?

my.cnf:

key_buffer = 8M
max_allowed_packet = 12M
thread_stack = 128K
thread_cache_size = 8
max_connections = 20
table_cache = 128
tmp_table_size = 256M
max_heap_table_size = 256M
join_buffer_size = 256K
query_cache_limit = 8M
query_cache_size = 64M

Eu tenho tentado ler artigos de ajuste do MySQL, mas eles parecem voltados para pessoas que já sabem o que estão fazendo! Qualquer ajuda seria apreciada. Obrigado!

usuario
fonte
1
Eu segui o conselho dos comentaristas e o reduzi a um nível razoável - mas ainda estou curioso sobre o que são os estádios sensatos para esses valores? Alguns artigos online usam 64K e outros recomendam 512 milhões pelo mesmo valor!
13769 Nick

Respostas:

10

Você tem um servidor com 256M, mas não pode usar tudo isso - lembre-se de que há alguma sobrecarga do sistema operacional. Acrescente a isso o fato de que você está comprometendo demais, como outras pessoas mencionaram, e você definitivamente discutirá aqui. 256M é suficiente apenas para um banco de dados pequeno, 20 conexões é muito importante com o que você configurou.

1) reduza o número máximo de conexões para 4 (você está usando 3 de 20)

2) otimize melhor seu cache de consultas; 8M é realmente grande e 64M no total é muito baseado em seus hits / ameixas secas; experimente um combo 4/32 e veja como vai. Realmente acho que uma combinação de 2/24 funcionaria para você.

3) você não possui nenhum tipo que exija tabelas temporárias, por que esse verbo max_heap_table_size está aí? Comente isso, use os padrões

4) você realmente tem 128 mesas? Tente cortar esse table_cache ao meio para 64 ou 48

5) reduza thread_cache_size para 4

6) otimizar essas tabelas para reduzir a fragmentação

Essas são algumas coisas para começar. Parece que você jogou vários números em uma configuração sem nenhum perfil real para saber o que você precisava e criou uma bagunça; se tudo mais falhar, volte aos padrões, livre-se das configurações personalizadas e comece de novo usando alguns guias de ajuste de desempenho que você pode encontrar no Google. Obtenha a saída de SHOW VARIABLES e SHOW STATUS, encontre qualquer um dos guias de sintonia e conecte seus números reais reais às suas equações e isso informará os números exatos que você precisa colocar no seu arquivo de configuração.

troyengel
fonte
3
Esta é uma resposta antiga para uma pergunta antiga, mas eu gostaria de ressaltar que, no resultado do mysqltuner publicado pelo solicitante, o servidor está acima dos 40 anos, o que não é tempo suficiente para julgar com precisão as cargas que o servidor verá . Idealmente, você executaria o mysqltuner algumas vezes ao longo de um dia ou mais e analisaria os resultados. Fora isso, suas sugestões são sólidas.
instanceofTom
8

Eu não sou um guru do MySQL e não consigo diagnosticar o problema com essas informações, mas tentei procurar a fórmula no código-fonte. Aqui está:

server_buffers + total_per_thread_buffers * max_connections

Onde:

server_buffers = key_buffer_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + query_cache_size

e:

total_per_thread_buffers = read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + max_allowed_packet + join_buffer_size

Agora você deve verificar cada um desses valores e descobrir qual deles é responsável por esse grande número. E não confie nesse script sem reservas - tentei executá-lo em um dos meus servidores de banco de dados e calculei que a memória máxima é 140% da quantidade total de memória física, mas o sistema está em execução há anos sem problemas de estabilidade.

Boa sorte!

Georgi Hristozov
fonte
0

Se bem me lembro, o MySQL Tuner usa a seguinte fórmula para estimar o uso máximo:

read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size

Lembre-se de que isso não é 100% correto e é apenas uma estimativa, pois certas configurações no MySQL não têm limite definido.

Você pode começar a atenuar algumas das configurações no seu arquivo de configuração e executar o sintonizador novamente, mas recomendo obter ajuda de um especialista se você não tiver tempo para perder a alteração do my.cnf, reiniciando-o e executando o sintonizador.

gekkz
fonte
0

O uso do software mysqlcalculator.com pode economizar muitas horas.

Wilson Hauck
fonte