Deixe-me começar por admitir que sou muito ignorante do funcionamento interno dos discos rígidos. Então, quando li o manual da variável innodb_flush_method , isso me confundiu. Posso obter uma explicação nos termos do leigo sobre a diferença em 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 o MySQL 5.1.49-64bit (esperando que isso me permita usar a memória). 8 GB de RAM, ~ 6 GB de dados / índices innodb.
Respostas:
Aqui está uma explicação sobre como
fdatasync()
funciona vs comofsync()
funcionafdatasync()
libera todos os buffers de dados de um arquivo no disco (antes que a chamada do sistema retorne). É semelhante,fsync()
mas não é necessário, para atualizar os metadados, como o tempo de acesso. Os aplicativos que acessam bancos de dados ou arquivos de log geralmente escrevem um pequeno fragmento de dados (por exemplo, uma linha em um arquivo de log) e depois chamamfsync()
imediatamente para garantir que os dados gravados sejam fisicamente armazenados 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()
poderá ser usado para evitar operações desnecessárias de gravação no disco do inode.Em inglês,
O_DSYNC
é mais rápido do queO_DIRECT
desde queO_DIRECT
chamafsync()
duas vezes (uma para logs e outra para dados) efsync()
verifica a gravação de dados por meio de duas operações de gravação. UsandoO_DSYNC
chamadasfdatsync()
efsync()
. Você pode pensarfdatasync()
em fazer um assíncronofsync()
(não verificando dados).Observando os números, há
O_DSYNC
quatro operações de gravação, duas das quais são verificadas, enquantofsync()
quatro operações de gravação, sendo todas verificadas posteriormente.CONCLUSÃO
O_DSYNC
O_DIRECT
O_DIRECT
Espero que essa resposta ajude e espero que não tenha piorado as coisas para você.
fonte
This means that in principal, fdatasync can execute faster than fsync because it needs to force only one disk write instead of two. However, in current versions of Linux, these two system calls actually do the same thing, both updating the file's modification time.
na época em que escrevi meu post há 3,5 anos, isso era verdade, especialmente nas versões mais antigas do Linux.The related system call fsync() commits just the buffered data relating to a specified file descriptor. fdatasync() is also available to write out just the changes made to the data in the file, and not necessarily the file's related metadata.
(esse wiki foi atualizado pela última vez em 28 de julho de 2014).