innodb_flush_method = Impacto no desempenho O_DIRECT vs O_DSYNC no ext3 com partição de disco LVM

12

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_methodpara 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_methodpara O_DIRECTpode degradar o desempenho de SELECTinstruçõ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_SYNCe O_DSYNCsão semelhantes a fsync()e fdatasync(): O_SYNCsincroniza dados e metadados, enquanto O_DSYNCsincroniza 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 ou O_DIRECTprovavelmente será a melhor opção, dependendo do seu aplicativo.

Ao pesquisar no Google, recebi este relatório de benchmark: on O_DSYNCvsO_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_DIRECTdesativa 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_DIRECTe 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 recomendar O_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)
Gopinath
fonte

Respostas:

7

Em 21 de janeiro de 2009, Peter Zaitsev declarou o seguinte no mysqlperformanceblog.com

Como pedido de ação - eu certamente gostaria que alguém visse se o EXT3 pode ser corrigido nesse sentido, pois é de longe o sistema de arquivos mais comum para Linux. Também vale a pena investigar se algo pode ser feito no lado do MySQL - pode estar abrindo o binlog com O_DSYNCflag se, em sync_binlog=1vez de usar o fsync, ajudar? Ou pode ser pré-alocação de binlog seria uma boa solução.

Até o momento, não conheço ninguém que tenha abordado esse problema. O_DSYNCpor 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

  • acessar mais CPUs e núcleos
  • aumentar a leitura e gravação de threads de E / S
  • dimensionar a capacidade de E / S (isso é especialmente necessário para diferentes mídias de armazenamento)

Aqui estão minhas postagens anteriores sobre as configurações que você pode alterar para isso:

RolandoMySQLDBA
fonte
1

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()por O_DIRECTcausa 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.

Derek Schultz
fonte
2
Em 2012, o buffer pool não era escalável para uma enorme RAM; portanto, o buffer duplo mencionado pode ser bom para casos em que o cache do SO é muito maior que o buffer do innodb. Quanto à versão 5.6 e superior - digo que sua resposta é totalmente válida.
noonex