Deixe-me começar admitindo que sou muito ignorante sobre o funcionamento interno dos discos rígidos. Então, quando li o manual da variável innodb_flush_method , fiquei confuso. Posso obter uma explicação em termos leigos sobre a diferença entre O_DSYNC e O_DIRECT e como saber se é um problema de desempenho em um servidor de banco de dados.
Algumas estatísticas na minha configuração: Mac OSX 10.6 (kernel de 32 bits, já que a arquitetura está desatualizada) executando MySQL 5.1.49-64 bits (esperando que me permita usar a memória). 8 GB de RAM, ~ 6 GB de dados/índices innodb.
Aqui está uma explicação sobre como
fdatasync()
funciona versus comofsync()
funcionafdatasync()
libera todos os buffers de dados de um arquivo para o disco (antes que a chamada do sistema retorne). Assemelha-sefsync()
, mas não é necessário para atualizar os metadados, como tempo de acesso. Aplicativos que acessam bancos de dados ou arquivos de log geralmente gravam um pequeno fragmento de dados (por exemplo, uma linha em um arquivo de log) e, em seguida, chamamfsync()
imediatamente para garantir que os dados gravados sejam armazenados fisicamente no disco rígido. Infelizmente,fsync()
sempre iniciará duas operações de gravaçãoSe o tempo de modificação não fizer parte do conceito de transação,
fdatasync()
pode ser usado para evitar operações desnecessárias de gravação de disco inode .Em inglês,
O_DSYNC
é mais rápido queO_DIRECT
desde queO_DIRECT
chamafsync()
duas vezes (uma para logs e outra para dados) efsync()
verifica as gravações de dados por meio de duas operações de gravação. UsandoO_DSYNC
chamadasfdatasync()
efsync()
. Você pode pensarfdatasync()
em fazer um assíncronofsync()
(não verificar dados).Olhando para os números,
O_DSYNC
faz quatro operações de escrita, duas das quais são verificadas, enquantofsync()
faz quatro operações de escrita, sendo todas verificadas posteriormente.CONCLUSÃO
O_DSYNC
O_DIRECT
O_DIRECT
Espero que esta resposta ajude e não tenha piorado as coisas para você.