Como tirar o máximo proveito do MySQL em uma máquina QuadCore com 16 GB de RAM?


10

Estou executando um servidor MySQL 5.5 na minha estação de trabalho para análise de dados científicos e gostaria de saber como configurar o MySQL para obter o máximo proveito do desempenho. Os tipos de consulta que normalmente executo envolvem junções de 10 a 20 tabelas e podem ser executadas por um longo período, de um a vários minutos, não sendo exceção. Apenas muito poucos usuários acessam o banco de dados ao mesmo tempo (5 sendo o máximo). Mudei o servidor de um Lenovo Thinkpad T61 com um Dual Core de 2,2 GHz e 4 GB de RAM para a seguinte máquina totalmente nova com componentes selecionados manualmente:

  • Intel i7 3770, 4x 3,4 GHz (rodando a 4x3,7 GHz)
  • Chipset Z77
  • 16 GB de RAM DDR3 1600
  • Windows 7 Prof de 64 bits
  • O servidor Windows e MySQL é executado em uma unidade SSD Intel série 520.

Os primeiros testes (executando a mesma consulta nas duas máquinas) mostraram uma melhoria definitiva na velocidade da nova, mas as consultas ainda demoram muito tempo e eu esperava mais um impulso. As consultas em questão são bastante otimizadas, ou seja, todas as tabelas possuem uma chave adequada que também está sendo usada como "explicação estendida".

Agora, para minhas configurações atuais do MySQL: Primeiro, devo mencionar que mudei do MyISAM para o Innodb há muito tempo.

Alguns dos meus ajustes do my.ini (ou seja, desvios das configurações padrão):

# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
#tmp_table_size=35M
tmp_table_size=4000M
max_heap_table_size=4000M

# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# row data. The bigger you set this the less disk I/O is needed to
# access data in tables. On a dedicated database server you may set this
# parameter up to 80% of the machine physical memory size. Do not set it
# too large, though, because competition of the physical memory may
# cause paging in the operating system.  Note that on 32bit systems you
# might be limited to 2-3.5G of user level memory per process, so do not
# set it too high.
#innodb_buffer_pool_size=96M
innodb_buffer_pool_size=800M

general-log
expire_logs_days = 60
general_log_file = "F:/my_query_mysql.log"
log-output = TABLE
optimizer_search_depth = 0 #meant to cure the "statistics state" bug in some queries

Gostaria de saber se alguém sugeriria alterações nos números acima ou ainda outras configurações que eu não conheça.

Eu apreciaria qualquer observação útil.

Steve

EDIT: Eu tenho duas consultas envolvendo junções em 10 a 20 tabelas e as executei no meu notebook Lenovo e no novo PC. A consulta 1 levou 3m36s na nova máquina contra 9m11s no laptop; A consulta 2 levou 22,5 segundos na estação de trabalho e 48,5 segundos no laptop. Portanto, a velocidade de execução foi melhorada aproximadamente pelo fator 2-2,5. Na estação de trabalho, nem 50% da RAM foi usada. A carga média da CPU nos quatro núcleos (conforme relatado pelo Windows Task Manager) foi de apenas 13%. A carga por núcleo (conforme relatada pelo Core Temp) foi de 25 a 40% para UM núcleo, enquanto foi <= 10% para os outros, indicando que o MySQL não utiliza múltiplos núcleos para uma única consulta. .


Por favor, mostre a carga do servidor, verifique a memória, io, cpu etc.

Vou fazer alguns testes e relatório de volta o que o Windows Task Manager tem a dizer (ou você aconselharia uma ferramenta melhor?)

Isso deve ser suficiente para uma primeira indicação para ver onde está o seu problema.

acabou de adicionar algumas estatísticas.

2
Além disso, você também pode experimentar o Percona assistente para "recomendado" configurações para seu servidor de banco de dados em tools.percona.com/wizard
Stephen Senkomago Musoke

Respostas:


5

Como você está executando o MySQL 5.5, convém configurar o InnoDB para acessar vários núcleos

Aqui estão as configurações que você deve usar

innodb_thread_concurrency define o limite superior do número de threads simultâneos que o InnoDB pode manter aberto. O melhor número de ronda definido para isso é (2 X Número de CPUs) + Número de Discos. ATUALIZAÇÃO : Como aprendi em primeira mão com a conferência Percona NYC, você deve definir isso como 0 para alertar o InnoDB Storage Engine para encontrar o melhor número de threads para o ambiente em que está executando.

innodb_concurrency_tickets define o número de encadeamentos que podem ignorar a verificação de simultaneidade com impunidade. Depois que esse limite é atingido, a verificação de simultaneidade de encadeamento se torna a norma novamente.

innodb_commit_concurrency define o número de transações simultâneas que podem ser confirmadas. Como o padrão é 0, não definir isso permite que qualquer número de transações seja confirmado simultaneamente.

innodb_thread_sleep_delay define o número de milissegundos que um encadeamento do InnoDB pode estar inativo antes de entrar novamente na fila do InnoDB. O padrão é 10000 (10 s).

innodb_read_io_threads e innodb_write_io_threads (ambos desde o MySQL 5.1.38) alocam o número especificado de threads para leituras e gravações. O padrão é 4 e o máximo é 64.

innodb_replication_delay impõe o atraso do encadeamento em um escravo quando innodb_thread_concurrency for atingido.

Aqui estão meus posts anteriores no MySQL 5.5 e ativando múltiplos núcleos para o InnoDB



1

Uso de memória: consulte http://mysql.rjweb.org/doc.php/memory (a maioria dos ajustáveis ​​não fará diferença suficiente para importar.)

max_heap_table_size = 4000M é perigosamente alto! Se 4 usuários precisarem, você estará sem memória RAM e trocando. A troca prejudica o desempenho muito mais do que praticamente qualquer coisa.

Consultas que levam mais de alguns segundos: devem ser estudadas para melhorias; forneça SHOW CREATE TABLE; MOSTRAR ESTADO DA MESA; EXPLAIN SELECT


0

Você pode considerar outras opções também. Como o PostgreSQL no FreeBSD. Mas mudar do Windows para o Linux aumentará seu desempenho.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.