Em um dos meus ambientes de produção, temos duas instâncias em execução em um cluster RedHat, com uma instância de produção associada ao cluster.
Temos memória principal de 125G com buffer pool 24G InnoDB ocupado pela instância1 e 12G ocupados pela instância2, que não está associado ao cluster RedHat. Os logs de dados e de transação estão localizados na partição do disco LVM com um sistema de arquivos ext3.
Para melhorar o desempenho e melhorar a taxa de transferência de E / S, decidi mudar innodb_flush_method
para O_DIRECT
.
Com referência à documentação do MySQL:
Onde os dados e arquivos de log do InnoDB estão localizados em uma SAN, foi constatado que a configuração
innodb_flush_method
paraO_DIRECT
pode degradar o desempenho deSELECT
instruções simples por um fator de três.
Referindo-se ao MySQL Ver 2 e 3 de alto desempenho, ele afirmou que os desenvolvedores do InnoDB encontraram erros no uso innodb_flush_method=O_DSYNC
. O_SYNC
e O_DSYNC
são semelhantes a fsync()
e fdatasync()
: O_SYNC
sincroniza dados e metadados, enquanto O_DSYNC
sincroniza apenas dados.
Se tudo isso parecia muita explicação sem conselhos, aqui está o conselho:
se você usa um sistema operacional semelhante ao Unix e seu controlador RAID possui um cache de gravação suportado por bateria, recomendamos o uso
O_DIRECT
. Caso contrário, o padrão ouO_DIRECT
provavelmente será a melhor opção, dependendo do seu aplicativo.
Ao pesquisar no Google, recebi este relatório de benchmark: on O_DSYNC
vsO_DIRECT
Relatório de Benchmark: =================== Teste Transacional Complexo de 1B Linhas, 64 threads * SAN O_DIRECT: solicitações de leitura / gravação: 31560140 (8766,61 por segundo) * SAN O_DSYNC: solicitações de leitura / gravação: 5179457 (1438,52 por segundo) * SAN fdatasync: solicitações de leitura / gravação: 9445774 (2623,66 por segundo) * O_DIRECT do disco local: solicitações de leitura / gravação: 3258595 (905,06 por segundo) * O_DSYNC do disco local: solicitações de leitura / gravação: 3494632 (970,65 por segundo) * Fdatasync do disco local: solicitações de leitura / gravação: 4223757 (1173.04 por segundo.
No entanto, O_DIRECT
desativa o cache no nível do SO, onde o cache duplo pode ser desativado, o que mostra uma taxa de transferência de E / S melhor.
É bom ir com O_DIRECT
e não O_DSYNC
? Essas duas opções são um pouco confusas. Qual opção pode mostrar melhor rendimento de E / S e aprimoramento no desempenho sem nenhum impacto nos dados, leituras / gravações especialmente na produção? Alguma sugestão melhor com base na sua experiência pessoal?
Eu pude ver o Rolando Update no post :
Ainda há uma leve confusão em ambos os parâmetros. Onde eu pude ver a maioria dos modelos de configuração de produção usando
O_DIRECT
, eu não vi nenhum onde recomendarO_DSYNC
.
Sistema
- MySQL 5.1.51-enterprise-gpl-pro-log
- Servidor Red Hat Enterprise Linux versão 5.5
- DELL DRAC com o Raid Controller com um cache de gravação de bateria de 512 MB
- Controladores Dell PERC H700 com uma unidade de backup de bateria (BBU).
Informação adicional
mysql> mostra variáveis como 'innodb_thread_concurrency'; + --------------------------- + ------- + | Nome da variável | Valor + --------------------------- + ------- + | innodb_thread_concurrency | 96 + --------------------------- + ------- + 1 linha no conjunto (0,00 s) mysql> mostra variáveis como 'innodb_read_io_threads'; Conjunto vazio (0,00 seg) mysql> mostra variáveis como 'innodb_write_io_threads'; Conjunto vazio (0,00 seg)
Estamos usando o plug-in padrão, então eu publiquei as informações do status do InnoDB:
mysql> SELECT * FROM Plug-ins ONDE PLUGIN_NAME GOSTA DE '% innodb%' E PLUGIN_TYPE COMO 'STORAGE ENGINE' \ G *************************** 1. linha ******************** ******* PLUGIN_NAME: InnoDB PLUGIN_VERSION: 1.0 PLUGIN_STATUS: ATIVO PLUGIN_TYPE: MOTOR DE ARMAZENAMENTO PLUGIN_TYPE_VERSION: 50151.0 PLUGIN_LIBRARY: NULL PLUGIN_LIBRARY_VERSION: NULL PLUGIN_AUTHOR: Innobase OY PLUGIN_DESCRIPTION: suporta transações, bloqueio no nível de linha e chaves estrangeiras PLUGIN_LICENSE: GPL 1 linha no conjunto (0,00 s)
Respostas:
Em 21 de janeiro de 2009, Peter Zaitsev declarou o seguinte no mysqlperformanceblog.com
Até o momento, não conheço ninguém que tenha abordado esse problema.
O_DSYNC
por padrão, não é uma perspectiva atraente, mas acomoda gravações mais rápidas que não são realmente verificadas. É por isso que há tanto hype por aíO_DIRECT
.Posso dizer que você não possui o plug-in InnoDB instalado. Com o plug-in InnoDB, várias variáveis devem existir.
Você deve atualizar o InnoDB de duas maneiras:
Depois de fazer isso, você poderá aprimorar o InnoDB para
Aqui estão minhas postagens anteriores sobre as configurações que você pode alterar para isso:
Sep 12, 2011
: Possível fazer o MySQL usar mais de um núcleo?Sep 20, 2011
: Multi cores e desempenho do MySQLApr 26, 2012
: O desempenho da CPU é relevante para um servidor de banco de dados?Mar 16, 2012
: Usando múltiplos núcleos para consultas únicas do MySQL no Debianfonte
Eu sempre tive a impressão de que
O_DIRECT
é melhor para o desempenho, pois evita o buffer duplo. Além disso, desde que você tenha RAID de hardware com cache de gravação com bateria. Obviamente, isso também depende da carga de trabalho, seja você LER ou ESCREVER pesado.Além disso, pergunta para os especialistas: fazer as chamadas extras para
fsync()
porO_DIRECT
causa de uma degradação perceptível no desempenho geral, ou é insignificante? Ainda tenho que ver referências mostrar isso.Além disso, observe que o Percona ativou a capacidade de definir
innodb_flush_method=ALL_O_DIRECT
, o que fornece E / S direta não apenas nos arquivos de dados do InnoDB, mas também nos logs de transações do InnoDB ao mesmo tempo.fonte