AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 5666
Accepted
gbn
gbn
Asked: 2011-09-13 06:59:54 +0800 CST2011-09-13 06:59:54 +0800 CST 2011-09-13 06:59:54 +0800 CST

Possível fazer o MySQL usar mais de um núcleo?

  • 772

Fui presenteado com alguns servidores MySQL dedicados que nunca usam mais do que um único núcleo. Eu sou mais desenvolvedor do que DBA para MySQL, então preciso de ajuda

Configurar

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 principalmente tabelas InnoDB
  • Solaris 10 Intel-64
  • MySQL 5.5.x

Nota: O maior DB é o replicado do servidor OLTP DR e o DW é carregado a partir dele. Não é um DW completo: dura apenas 6 meses a 6 semanas, por isso é menor que o OLTP DB.

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 vai até 25% (um núcleo está no máximo) e não mais
  • os 3 ALTERs levam de 12 a 25 minutos (um único no menor leva 4,5)

Perguntas

  1. Qual configuração ou patch é necessário 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)
  2. É uma consequência da replicação?

Outras notas

  • Eu entendo a diferença entre um "thread" de RDBMS e um "thread" de SO
  • Eu não estou perguntando sobre qualquer forma de paralelismo
  • Algumas das variáveis ​​do sistema para InnoDB e threads são sub-ótimas
    (procurando uma vitória rápida)
  • A curto prazo, não consigo alterar o layout do disco
  • O SO pode ser ajustado, se necessário
  • Uma única ALTER TABLE na menor mesa leva 4,5 minutos (chocante IMO)

Editar 1

  • innodb_thread_concurrency é definido como 8 em ambos. Sim, está errado, mas não fará o MySQL usar vários núcleos
  • innodb_buffer_pool_size é 80 GB no primário, 10 GB em um teste (outra instância é encerrada). Isso está bem por enquanto.
  • innodb_file_per_table = ATIVADO

Editar 2

  • innodb_flush_log_at_trx_commit = 2
  • innodb_use_sys_malloc = ATIVADO
  • innodb_flush_method deve ser O_DIRECT (mas SHOW VARIABLES não mostra isso)
  • innodb_doublewrite = OFF
  • Sistema de arquivos = ZFS (E meu sysadmin encontrou isto: http://blogs.oracle.com/realneel/entry/mysql_innodb_zfs_best_practices )

Testar

  • innodb_flush_method não está aparecendo como O_DIRECT quando deveria estar
  • seguirá as configurações do 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

mysql performance
  • 5 5 respostas
  • 237464 Views

5 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2011-09-13T07:35:21+08:002011-09-13T07:35:21+08:00

    Na verdade, discuti innodb_thread_concurrency com um MySQL Expert na conferência Percona Live NYC em maio de 2011 .

    Aprendi algo surpreendente: Apesar da documentação, é melhor deixar innodb_thread_concurrencyem 0 (simultaneidade infinita). Dessa forma, o InnoDB decide o melhor número innodb_concurrency_ticketsa ser aberto para uma determinada configuração de instância do MySQL.

    Depois de definir innodb_thread_concurrencycomo 0, você pode definir innodb_read_io_threadse innodb_write_io_threads(ambos desde o MySQL 5.1.38) para o valor máximo de 64. Isso deve envolver mais núcleos.

    • 141
  2. Derek Downey
    2011-09-13T07:21:06+08:002011-09-13T07:21:06+08:00

    O MySQL usará automaticamente vários núcleos, portanto, sua carga de 25% é coincidência 1 ou uma possível configuração incorreta no Solaris. Não vou fingir saber como ajustar o solaris, mas aqui está um artigo que aborda algumas informações de ajuste específicas do solaris .

    As páginas de ajuste do InnoDB foram reformuladas no MySQL 5.5, então há algumas boas informações lá também. Das dicas de E/S do disco InnoDB :

    Se a ferramenta superior do Unix ou o Gerenciador de Tarefas do Windows mostrar que a porcentagem de uso da CPU com sua carga de trabalho é inferior a 70%, sua carga de trabalho provavelmente está vinculada ao disco. Talvez você esteja fazendo muitos commits de transação ou o buffer pool é muito pequeno. Aumentar o buffer pool pode ajudar, mas não o defina como igual a mais de 80% da memória física.

    Algumas outras coisas para verificar:

    • Vale a pena testar a mudança do innodb_flush_method para O_DIRECT. Se isso ajudar, talvez seja necessário montar o sistema de arquivos com a forcedirectioopção

    • Altere o innodb_flush_log_at_trx_commit de 1 para 0 (se você não se importa em perder o último segundo no travamento do mysql) ou 2 (se você não se importa em perder o último segundo no travamento do sistema operacional).

    • Verifique o valor de innodb_use_sys_malloc . Este artigo tem mais informações sobre a variável.

      Naquela época, não havia bibliotecas de alocação de memória ajustadas para CPUs multi-core. Portanto, o InnoDB implementou seu próprio alocador de memória no subsistema mem. Esse alocador é guardado por um único mutex, que pode se tornar um gargalo.

      Mas há algumas advertências no final da seção sobre o que significa ativar a variável (ela está ativada por padrão na versão 5.5).

      Observe que quando o alocador de memória do InnoDB estiver desabilitado, o InnoDB ignorará o valor do parâmetro innodb_additional_mem_pool_size.

    • É possível que a replicação esteja causando alguns dos problemas. Percebo que você não está interessado em paralelismo, mas pela descrição deste log de trabalho :

      Atualmente, a replicação não é bem dimensionada em máquinas com vários núcleos. O único encadeamento escravo executa eventos de replicação um por um e pode não lidar com uma carga produzida por várias conexões de cliente simultâneas atendidas pela CPU do servidor mestre separado.

    Em última análise, o InnoDB pode não ser o melhor mecanismo para datawarehousing, devido às operações baseadas em disco que ocorrem. Você pode considerar alterar a(s) tabela(s) do datawarehouse para ser MyISAM compactado .

    1 Por coincidência, quero dizer que há um gargalo que impede que sua carga aumente acima de 25%, mas não é necessariamente um problema de núcleo único forçado.

    • 33
  3. Rick James
    2012-05-18T15:23:39+08:002012-05-18T15:23:39+08:00

    Nota: Esta resposta é sobre uma única conexão usando vários núcleos. A pergunta do OP era ambígua; ele assumiu incorretamente que o MySQL como um todo não poderia usar mais de um núcleo. As outras respostas apontam corretamente que o caso de teste 3-Alter é realmente limitado por E/S, portanto, falhando em provar a pergunta do título.

    Uma única conexão usará apenas um único núcleo. (OK, o InnoDB usa outros threads, portanto, núcleos, para algum processamento de E/S, mas isso não é significativo.)

    Você tinha 3 ALTERs, então você não estava usando muito mais do que 3 núcleos.

    Infelizmente, nem mesmo PARTITION usa vários núcleos.

    Até recentemente, várias conexões atingiriam o máximo após 4-8 núcleos. O Xtradb da Percona (incluído no MariaDB) faz melhor uso de vários núcleos, mas ainda assim apenas um por thread. Eles atingem o máximo em cerca de 32 núcleos.

    (Atualização em 2015:) Várias conexões com 5,6 atingem o máximo de cerca de 48 núcleos. 5.7 promete ser ainda melhor. (É o que dizem os benchmarks da Oracle.) Mas ainda não há uso de vários núcleos para uma única conexão.

    Atualização (depois de ir para o OpenWorld da Oracle): a nova versão 8.x não terá nenhum paralelismo.

    Atualização adicional - 8.0.17 tem casos em que usará vários núcleos em poucas consultas selecionadas. (Isto é, não fique animado.)

    • 21
  4. jfg956
    2015-05-08T21:31:47+08:002015-05-08T21:31:47+08:00

    IMHO e no caso de uso descrito, você nunca usará mais de um núcleo. O motivo é que sua carga de trabalho é vinculada a E/S, não vinculada à CPU. Como suas 3 conexões estão criando um novo Índice, cada uma delas precisa ler a tabela inteira do disco: isso é o que está demorando, não computando os Índices.

    • 11
  5. Okezie
    2016-08-24T10:09:36+08:002016-08-24T10:09:36+08:00

    Considere que seu gargalo pode ser o desempenho de E/S do seu sistema de arquivos.

    Além das configurações sugeridas por @RolandoMySQLDBA , também defino as noatimeconfigurações de montagem /etc/fstabpara a partição que contém meu diretório de dados mysql ( /data01/mysqlno meu caso, com /dev/sdb1montado para /data01).

    Por padrão, o linux registra o tempo de acesso para TODA leitura ou gravação de disco que afeta negativamente o desempenho de E/S, especialmente para aplicativos de E/S altos, como bancos de dados. Isso significa que até mesmo a leitura de dados de um arquivo aciona uma gravação no disco... WAT!

    Para desabilitar isso, adicione a noatimeopção de montagem /etc/fstabpara o ponto de montagem desejado da seguinte forma (exemplo no meu caso):

    /dev/sdb1  /data01  ext4  defaults,noatime  0  2
    

    Em seguida, remonte a partição:

    mount -o,remount /data01
    

    Isso deve aumentar o desempenho de leitura/gravação dos aplicativos que usam essa partição. MAS... nada supera manter todos os seus dados na memória.

    • 11

relate perguntas

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve