Fui apresentado a alguns servidores MySQL dedicados que nunca usam mais do que um único núcleo. Sou mais desenvolvedor que DBA para MySQL, então preciso de ajuda
Configuração
Os servidores são bastante robustos com uma carga do tipo OLAP / DataWarehouse (DW):
- Primário: 96 GB de RAM, 8 núcleos + matriz RAID 10 única
- Teste: 32 GB de RAM com 4 núcleos
- O maior banco de dados é de 540 GB, o total é de cerca de 1,1 TB e a maioria das tabelas do InnoDB
- Solaris 10 Intel-64
- MySQL 5.5.x
Nota: O maior banco de dados é o replicado do servidor de OLTP DR e o DW é carregado a partir dele. Não é um DW completo: dura apenas 6 meses a 6 semanas, portanto é menor que o banco de dados OLTP.
Observações em um servidor de teste
- 3 conexões separadas
- cada um tem um concorrente (e diferente)
ALTER TABLE...DROP KEY...ADD INDEX
- as 3 tabelas têm 2,5, 3,8 e 4,5 milhões de linhas
- O uso da CPU sobe para 25% (um núcleo é atingido no máximo) e não é maior
- os 3 ALTERs levam de 12 a 25 minutos (um dos menores leva 4,5)
Questões
- Que configuração ou correção é necessária para permitir que mais de um núcleo seja usado?
Ou seja, por que o MySQL não usa todos os núcleos disponíveis? (como outros RDBMS) - É uma consequência da replicação?
Outras notas
- Entendo a diferença entre um RDBMS "thread" e um OS "thread"
- Eu não estou perguntando sobre qualquer forma de paralelismo
- Algumas das variáveis de sistema para InnoDB e threads são sub-ideais
(buscando uma vitória rápida) - A curto prazo, não consigo alterar o layout do disco
- O sistema operacional pode ser ajustado se necessário
- Uma única ALTER TABLE na menor mesa leva 4,5 minutos (chocante IMO)
Editar 1
- innodb_thread_concurrency está definido como 8 em ambos. Sim, está errado, mas não fará o MySQL usar múltiplos núcleos
- innodb_buffer_pool_size tem 80 GB no primário e 10 GB em um teste (outra instância é encerrada). Isso está bom por enquanto.
- innodb_file_per_table = ON
Editar 2
- innodb_flush_log_at_trx_commit = 2
- innodb_use_sys_malloc = ON
- innodb_flush_method deve ser O_DIRECT (mas SHOW VARIABLES não mostra isso)
- innodb_doublewrite = OFF
- Sistema de arquivos = ZFS (E meu administrador de sistemas encontrou o seguinte: http://blogs.oracle.com/realneel/entry/mysql_innodb_zfs_best_practices )
Testar
- innodb_flush_method não está aparecendo como O_DIRECT quando deveria
- seguirá as configurações de RolandoMySQLDBA
Deixe-me saber se eu perdi alguma coisa importante
Felicidades
Atualizar
Alterado innodb_flush_method + 3 x configurações de thread na resposta do RolandoMySQLDBA
Resultado:> 1 núcleo usado para os testes = resultado positivo
\G
. Além disso, eu acho que SHOW INNODB STATUS
é depreciado em favor do SHOW ENGINE INNODB STATUS
no 5.5 (eu recebo um erro de executar o ex-em-linha de comando.