Aqui está uma explicação sobre como fdatasync()
funciona vs como fsync()
funciona
fdatasync()
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 chamam fsync()
imediatamente para garantir que os dados gravados sejam fisicamente armazenados no disco rígido. Infelizmente, fsync()
sempre iniciará duas operações de gravação
- uma operação de gravação para os dados recém-gravados
- uma operação de gravação para atualizar o tempo de modificação armazenado no inode
Se 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 que O_DIRECT
desde que O_DIRECT
chama fsync()
duas vezes (uma para logs e outra para dados) e fsync()
verifica a gravação de dados por meio de duas operações de gravação. Usando O_DSYNC
chamadas fdatsync()
e fsync()
. Você pode pensar fdatasync()
em fazer um assíncrono fsync()
(não verificando dados).
Observando os números, há O_DSYNC
quatro operações de gravação, duas das quais são verificadas, enquanto fsync()
quatro operações de gravação, sendo todas verificadas posteriormente.
CONCLUSÃO
O_DSYNC
- mais rápido que
O_DIRECT
- Os dados podem ou não ser consistentes devido à latência ou a uma falha total
O_DIRECT
- mais estável
- dados consistentes
- naturalmente mais lento
Espero que essa resposta ajude e espero que não tenha piorado as coisas para você.