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_DIRECTdesde que O_DIRECTchama 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_DSYNCchamadas fdatsync()e fsync(). Você pode pensar fdatasync()em fazer um assíncrono fsync()(não verificando dados).
Observando os números, há O_DSYNCquatro 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ê.