Como você ajusta o MySQL para uma carga de trabalho pesada do InnoDB?

39

Assumindo um sistema OLTP de produção com tabelas predominantemente InnoDB

  • Quais são os sintomas comuns de um sistema confuso / mal configurado?
  • Quais parâmetros de configuração você mais comumente altera dos padrões?
  • Como você identifica possíveis gargalos antes que haja um problema?
  • Como você reconhece e soluciona problemas ativos?

Qualquer anedota detalhando statusvariáveis específicas e diagnósticos seria apreciada.

Riedsio
fonte
2
Esta questão é muito ampla. Você pode dividir em 4 perguntas? (E até mesmo suas perguntas marcadores são incrivelmente ampla você pode instanciar-los com seus problemas específicos.?)
Brian Ballsun-Stanton

Respostas:

16

Aqui está um bom artigo sobre o ajuste do InnoDB da Jenny Chen da Sun - ela escreve muito sobre MySQL, alguns deles são específicos do Solaris (por exemplo, usando o DTrace ), mas o blog inteiro está cheio de boatos interessantes.

Gaius
fonte
4
Quem é Jenny Chen?
Pacerier
19

Curiosamente, no MySQL 5.5, agora você pode ter vários pools de buffers innodb.

Os parâmetros com os quais você se importa são

Em cerca de um mês, estou programado para implementar 112 buffer pools de innodb para um cliente. Eu vou deixar você saber como foi.

UPDATE 2011-02-27 21:57 EDT

Descobri que o valor máximo para innodb_buffer_pool_instances é 64. Decidi configurar 144 GB, então configurei innodb_buffer_pool_instances como 18 e innodb_buffer_pool_size como 8. Atualmente, estou carregando o servidor com 450 GB

ATUALIZAÇÃO 28-04-2011 13:44 EDT

Experimentei vários pools de buffers do InnoDB. Havia muita trava de rosca e contenção. Mudei para um único buffer pool de 162 GB + definindo read_io_threads e write_io_threads para 64 (valor máximo). Isso funcionou muito melhor.

ATUALIZAÇÃO 2012-07-03 17:27 EDT

Eu aprendi algo incrível sobre o MySQL. Se você alocar um único conjunto de buffers monolíticos do InnoDB maior que o total de unidades instaladas dividido pelo número de CPUs físicas , o sistema operacional será instado para a troca de memória a intervalos regulares devido a um conjunto de buffers completo do InnoDB. A opção do MySQL 5.5 conhecida como innodb_buffer_pool_instances pode ser usada para dividir o buffer pool. Ontem, implementei isso corretamente para o cliente que mencionei na minha resposta no ano passado. Ainda tenho 162 GB para o buffer pool do cliente. Eu configurei a opção innodb_buffer_pool_instances do servidor como 2 porque cada servidor de banco de dados é duplo hexacore. Eu estava pensando em defini-lo para 12, mas então um colega me mostrou um blog de Jeremy Cole no MySQL e Swappiness. Depois de ler, coloquei-o em prática imediatamente para o meu cliente. Eu executei este comando

numactl --hardware

Vi um mapeamento de 192 GB de RAM do servidor como 96 GB para cada núcleo físico. Portanto, defino o innodb_buffer_pool_instances como 2. As coisas estão boas agora. Vou atualizar minha resposta para ver como isso afeta a troca de memória pelos próximos 2 meses.

RolandoMySQLDBA
fonte
oi @RolandoMySQLDBA, dos blogs de jeremy, não consigo encontrar nenhuma conexão ou conclusão que defina a instância innodb igual ao número de CPUs físicas resolverá o problema de troca. Múltiplas instâncias innodb balancearão automaticamente entre os nós de memória sem definir numactl --interleave = all, liberando os caches de buffer do Linux ou forçando o SO a alocar o buffer pool do InnoDB?
Wen Ren
@Rolando, Nice 2x ram de 100 GB. Que cliente é esse?
Pacerier
Eu pensei que "instâncias" foram implementadas assim: (número do bloco) MOD (num instâncias) -> (em qual instância colocar o bloco). Isso não tem nada a ver com o NUMA.
21717 Rick
4

Primeiro, aumente o tamanho padrão do conjunto de buffers do InnoDB em my.cnf (acredito que seja padrão para 8 MB)

Você provavelmente deve definir isso para 75% do tamanho da sua RAM (em geral)

Matt Healy
fonte
-1

Quais parâmetros de configuração você mais comumente altera dos padrões?

configuração de memória

sbczk
fonte
Você pode fornecer uma resposta mais explicativa? O que eles mudam? Por que você faz essas mudanças? Quais são as suas observações esperadas após as mudanças mencionadas? Como você sabe para o que mudar?
jcolebrand
A configuração imediata do mysql está preparada para configurar rapidamente as tabelas myisam (como a maioria dos usuários a usa dessa maneira); além disso, para ter um servidor bem otimizado, você deve escolher o mecanismo "primário" a ser usado (innodb ou mysql) como realmente difícil de banco de dados de configuração para o desempenho excelente para os motores de cabine, mysql tem buffers separados para myisam e InnoDB motores
sbczk